私は現在、自分の2DゲームエンジンをJavaに移植しています。私はここでstackoverflowで指摘したゲームライブラリのいくつかを見ました。しかし、私が見たものはかなりシンプルであり、アルファ透明度のようなものをサポートしているかどうかは言いませんでしたので、ロジックを書き出したC++レンダラーを移植することにしました。Java AWTは2Dゲームのレンダリングに適していますか?
このレンダラは、不必要な再レンダリングを避けるためにタイルを使用する純粋なソフトウェアレンダラです。私は出力ペインより少し大きい「オフスクリーンバッファ」を作成し、このフレーム外バッファをすべてのフレームの出力にブリッジすることで、スクロールのパフォーマンスを最適化しました。この方法では、マップ上のピクセルをスクロールしただけで、タイルを不必要に再描画することを避けることができました。
JavaのAWTを使用して、オフスクリーンバッファ用に大きなBufferedImageを使用しました。 CPUの使用量は大丈夫です(C++の2倍くらい)が、連続スクロールには奇妙な問題があります。毎秒、レンダラが約0.2秒遅れることになります。
これらの期間に発生するコードは何もないので、オフスクリーンバッファをメインビューに描画しないとスパイクが消えてしまうので、Javaはその内部最適化をいくつか行っている自分の。しかし、私はそれが何をしているのかわからないし、スパイクを取り除くために私が取り除かなければならない自分の最適化のどれを知っているのか分かりません。また、java AWTは、連続した高FPSスクロールを念頭に置いて作成されていない可能性があります。これは、この目的では完全に使用できません。
これらのスパイクを取り除く方法はありますか?
あなたは[JConsoleの](http://download.oracle.com/javase/を使用してアプリケーションを監視しようとしたことがあり1.5.0/docs/guide/management/jconsole.html#memory)、コレクションがドロップされたフレームと同時に発生しているかどうかを確認します。 –
@Mike Daniels:それは可能です。私はプロファイリングのためにjvisualvmを使用していますが、これは私が得るものです:http://i.imgur.com/EMxkA.png – cib