JavaのSwingでツクールのようなマップエディタを作成しているのですが、重すぎて使い物になりません。
マス目が20×15ならともかく、500×500のマス目だと100MBも使い、CPUの負担も25~30%と非常に大きいです。
何か負担を削る良い手段はありますでしょうか?
原因は一応、判明しており、マップを表示しているJPanelに非常に大きな負担があるのが分かっています。また、マス目ごとのデータを保存しているArrayListも多くのメモリを使用している事が分かっています。
このうち、ArrayListをInteger型からByte型に変えてみたのですが、あまり効果がありませんでした。ArrayListから配列に変える方法も、そこまで効果が無さそうです。
JPanelは工夫して画面の表示している部分のみを映すようにした(どういうわけか、SwingのJpanelとJScrollPaneは表示されていない部分の処理も行ってしまう)のですが、それでもまだ負担が大きい状況です。
比較対象となるRPGツクールVXはおそらく使用している言語とGUIの違うもあるとはいえ、CPUの負担もメモリの使用量も圧倒的に差がついています。RPGツクールVXのメモリ使用量はマップのサイズの最大値でさえ、数十MB前後です。
一から作りなおして、Javaから別のGUIに切り替える、という事も考えたのですが、マルチプラットフォームにしたいため、Java用のGUI以外の選択肢がありません。C++におけるマルチプラットフォームのGUIはどれもがLGPL、GPLのライセンスばかりなのです。
何とかしてSwingのままでCPUとメモリの使用量の負担を削りたいのですが、なにか良い手段はありますか?
よろしくお願いします。
追記:
メモリに関しては結局Integer型のArrayListをbyte型の配列に変えたら、大幅に削る事が出来ました。
CPUの負担に関しては削れていません。このうち、大きな負担になっているのがGraphicsクラスのdrawImage(画像を描画する関数)である事が分かっています。
現在の表示方法のアルゴリズムは以下の擬似コードで書き示します。
int型の変数 width=描画される部分の横の長さ
int型の変数 height=描画される部分の縦の長さ
int型の変数 cs=マス目の解像度の大きさ
int型の変数 squareOfWidth=width/cs (横のマス目の数を計算する)
int型の変数 squareOfHeight=height/cs (縦のマス目の数を計算する)
for(int型の変数 x=0;x<squareOfWidth;x+=1){
for(int型の変数 y=0;y<squareOfHeight;y+=1){
g.drawImage(マス目に表示される画像)
}
}
見て通りの単純なforループです。横のマス目の数が10、縦のマス目の数が10だと100回g.drawImageが呼ばれる計算となります。
このg.drawImageを呼ばれる回数を抑えたいのですが、方法はありますか?
一旦別の画像の変数に表示されるマップを描画して、そこから描画する部分を取り出して表示するという方法も考えたのですが、この方法だと、かなりのメモリの量を使いました。
回答1件
あなたの回答
tips
プレビュー