4

私はかなり長い間、OpenGL 1.0 を使用して Android アプリを開発してきました。基本的には、フレームごとに FloatBuffers を使用して glColor4f(...) と glDrawArrays(...) を呼び出します。UI 要素を追加し、ドローコールの数が増えるにつれて、グラフィックスが大きなボトルネックになりつつあります。

そこで、これらすべての呼び出しを 1 つ (または 2 つまたは 3 つ) の描画呼び出しにグループ化する最良の方法を探しています。これを行うための最もクリーンで効率的かつ標準的な方法は、OpenGL ES 2.0 以降で利用可能な VBO オブジェクトを使用することです。ただし、これには、グラフィック バックエンド全体を ES 1.0 から ES 2.0 に切り替えるために、かなりのリファクタリングが必要になります。これが良い決定であるかどうか、または比較的単純な 2D データ (正方形、角丸長方形 TRIANGLE_FAN など) に対して適切に機能する、1.0 で描画呼び出しをグループ化する受け入れ可能な方法があるかどうか、またはそれが本当に可能性があるかどうかはわかりません。弾丸を噛んで切り替える価値があります。私は、ES 1.0 の固定パイプラインで非常に便利な変換とスケーリングに大きく依存していることにも言及するかもしれません。

周りを見渡してみると、私のような立場にある人がほとんどいないことに驚いています。何か考えはありますか?

4

1 に答える 1

1

翻訳とスケーリングに大きく依存しています

ドローコール間でモデル ビュー マトリックスを変更すると、何もバッチできないことに注意してください。(ES2はそれを変更しませんでした)。

Vbo は、opengl ES 1.1 から利用できます。そして、それらはおそらくあなたがターゲットにしているデバイスで利用可能です. ES1.0でも(ARB_vertex_buffer_object)

ワールド スペース ジオメトリを使用して大きな VBO を作成し (=CPU でスケーリングと移動を解決)、それを描画できます。この vbo をフレームごとに更新しても、私の経験では十分に高速です。ほとんどの場合、何千もの小さなドローコールを送信するのが最も遅くなります。

固定パイプラインから完全な頂点/フラグメント シェーダー パイプラインに移行するのは簡単ではありません。3D に関する十分な知識が必要です。気をつけろ。最初にプロトタイプを書きます。(ワールド空間またはオブジェクト空間の照明 ? 法線の変換方法 ? ...)

ヴィヴィアン

于 2013-04-16T14:23:29.763 に答える