私はモバイルプラットフォーム用のスプライトベースの2Dゲームを開発しており、OpenGL(まあ、実際にはIrrlicht)を使用してグラフィックスをレンダリングしています。まず、シンプルな方法でスプライトレンダリングを実装しました。すべてのゲームオブジェクトは、独自のGPU描画呼び出しを持つクワッドとして描画されます。つまり、200のゲームオブジェクトがある場合、フレームごとに200描画呼び出しを行いました。もちろん、これは悪い選択であり、すべてのGPU描画呼び出しに関連付けられたCPUオーバーヘッドが少しあるため、私のゲームは完全にCPUバウンドでした。ほとんどの場合、GPUはアイドル状態のままでした。
今、私はオブジェクトを大きなバッチに収集し、これらのバッチを少数の描画呼び出しのみでレンダリングすることで、パフォーマンスを改善できると思いました。バッチ処理を実装し(同じテクスチャを共有するすべてのゲームオブジェクトが同じバッチでレンダリングされるように)、問題がなくなったと考えました...フレームレートが以前よりもさらに低いことを確認するだけです。
どうして?ええと、私には200(またはそれ以上)のゲームオブジェクトがあり、それらは1秒あたり60回更新されます。CPU内の頂点の新しい位置(変換と回転)を再計算する必要があるすべてのフレーム(モバイルプラットフォームのGPUはインスタンス化をサポートしていないため、そこで実行することはできません)。この計算は1秒あたり48000(200 * 60 * 4以降)すべてのスプライトには4つの頂点があります)、単に遅すぎるようです。
パフォーマンスを改善するために私ができることは何ですか?すべてのゲームオブジェクトが(ほぼ)すべてのフレームで移動/回転しているため、頂点の位置を再計算する必要があります。私が考えることができる最適化は、ローテーションのルックアップテーブルだけなので、計算する必要はありません。ポイントスプライトは役に立ちますか?厄介なハックはありますか?他に何か?
ありがとう。