2

OpenGL ESを使用してAndroid用のゲームに取り組んでいますが、パフォーマンスの問題が発生しました。

私がやろうとしていること:画面上に同じメッシュを共有するオブジェクトがたくさんありますが、すべてに個別の回転と平行移動があります。あなたはそれをあなたが画面上を動き回っている小惑星の束を持っている小惑星と比較することができます。

実際の問題:各オブジェクトを個別に回転および変換し、頂点の数(オブジェクトごとに数十)に比べて頂点配列を送信するオーバーヘッドが大きすぎるため、パフォーマンスが低下しています。

私に何ができる?私が考えた解決策の1つは、頂点を頂点バッファーに入れる前に、ソフトウェアで頂点を自分で更新することです。それはおそらく私にいくらかのオーバーヘッドを節約するでしょう、しかしそれは直感に反しているようです。

あなたが持っているかもしれないアイデアや提案を共有してください!ありがとう!

4

1 に答える 1

1

「頂点配列を送信するオーバーヘッド」は、頂点/インデックスにサーバー側のバッファーを使用していないことを意味しているようです。この場合は、GLES1.1仕様のセクション2.9「バッファオブジェクト」を参照してください。

もちろん、サーバー側のバッファーを使用している場合でも、十分な数の小さなglDrawElements呼び出しがパフォーマンスのボトルネックになる可能性があります。

すべてのオブジェクトが静的である場合は、それらすべてを事前に変換して、サーバー上のメモリをNxに支払うことができます。

オブジェクトが動的である場合、物事はよりトリッキーです。「インスタンス化された」描画(たとえば、Direct-Xを参照DrawInstanced)は役立つ可能性がありますが、GLESにそのようなものがあるとは思いません(「インスタンス化された」描画も静的な場合にメモリを節約します)。

GLES 2.0を使用すると、次のようなことを試すことができます。

  • メッシュのM個のコピーを頂点バッファに入れ、各頂点にコピーのインデックスである追加の属性を与えます
  • 頂点シェーダーで、追加の属性によってインデックス付けされた均一な配列から変換行列(またはその一部が修正されている場合はそのサブセクション)をロードします

次に、N / MglDrawElements呼び出しを実行して、毎回均一配列にM行列を設定できます。(1つは)ハードウェアがよりハードに動作する必要があるため、これが実際に高速になるかどうかは明らかではありません(インデックス付きのユニフォームは超安価ではありません)。また、GLES1.1ではそのようなことはできないと思います。

于 2010-09-28T03:20:56.080 に答える