質問: 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
回答: ``` oooooooooo oxxxxxxxxo oxxxxxxxxo oxxxxxxxxo oxxxxxxxxo oooooooooo ``` こんな感じです。x がjpanelで表示される部分、o はスクロールした時見える部分。見える部分が8割見えたら、次の2マスを描画します。スクロールアウトしたマスが2マスあれば、そいつらはデータから消しておきます。で、表示はダブルバッファリングで行います。一度描画したものはjpanelからスクロールアウトするまでは領域コピーだけで使い回す。必要なマスだけ描画するようにします。 ダブルバッファなので、裏で新しいスクロール後の表示区画の描画が完了したら表のjpanelと切り替えます。これを延々繰り返す。 こういう風にすれば、jpanelの大きさが 600x600 の場合でも、スクロール用のエリアを200x200取っても、1000x1000 です。1ピクセル4バイトなので、メモリはダブルで、約10mb程度の使用量になり大幅節約になりますね。