11

私のアプリケーションでは、OpenGLESApiを介して多くのキューブを描画します。すべての立方体は同じ寸法ですが、空間内の異なる座標に配置されているだけです。それらを描く方法は2つ考えられますが、どちらが最も効率的かはわかりません。私はOpenGLの専門家ではないので、ここで質問することにしました。

現在使用している方法1:すべての立方体が同じ次元であるため、頂点バッファー、インデックスバッファー、通常バッファー、およびカラーバッファーを1回だけ計算します。シーンの更新中に、すべての立方体を調べ、同じバッファーのセットに対してbufferData()を実行してから、drawElements()呼び出しを使用して立方体の三角形メッシュを描画します。各立方体は異なる位置にあるため、描画する前にmvMatrixを変換します。bufferData()およびdrawElements()は、キューブごとに実行されます。この方法では、毎回バッファを計算しないことで、おそらく多くのメモリを節約できます。しかし、私はたくさんのdrawElements()呼び出しを行っています。

方法2は次のようになります。すべての立方体を、ポリゴンのセットがシーン全体に広がるように扱います。各ポリゴン(実際にはポリゴン内の三角形)の頂点、インデックス、色、通常のバッファを計算し、bufferData()を1回呼び出すだけでそれらをグラフィックカードメモリにプッシュします。次に、drawElements()を1回呼び出すだけでそれらを描画します。このアプローチの利点は、bindBufferとdrawElementsの呼び出しを1回だけ実行することです。欠点は、バッファを作成するために多くのメモリを使用することです。

私のOpenGLの経験は十分に限られており、パフォーマンスの観点から上記の方法のどれが優れているかわかりません。

これをWebGLアプリで使用していますが、これは一般的なOpenGLESの質問です。

4

3 に答える 3

14

方法2を実施しましたが、地滑りで勝ちました。大量のメモリの想定される欠点は、私の想像にすぎないようでした。実際、ガベージコレクターはメソッド2で1回だけ呼び出されましたが、メソッド1では4〜5回呼び出されました。

OpenGLシナリオは私のものとは異なる場合がありますが、パフォーマンスのヒントを求めてここに到達した場合、この質問からの教訓は次のとおりです。シーン内で頻繁に変更されない部分を特定します。それらがいくら大きくても、それらを単一のバッファセット(VBO)に入れ、グラフィックメモリに最小回数アップロードします。これが、VBOの使用方法です。クライアント(つまりアプリ)とグラフィックカードの間のメモリ帯域幅は貴重であり、理由もなく頻繁に消費することは望ましくありません。

Ch。の「頂点バッファオブジェクト」のセクションをお読みください。「OpenGLES2.0プログラミングガイド」の6で、それらの使用方法を理解してください。http://opengles-book.com/

于 2010-10-13T13:50:12.330 に答える
6

この質問はすでに回答されていることは知っていますが、WebGLの最適化に関するGoogleIOのプレゼンテーションを指摘する価値があると思います。

http://www.youtube.com/watch?v=rfQ8rKGTVlg

彼らは本質的に、これとまったく同じ問題(異なる色/位置を持つ多くの同じ形状)をカバーし、そのようなシーンを最適化するためのいくつかの素晴らしい方法について話します(そして彼らもダイナミックです!)

于 2011-10-04T22:28:57.693 に答える
-1

私は次のアプローチを提案します:

ロード時:

  1. 座標バッファ(1つのキューブ用)を生成し、それをVBOにロードします(gl.glGenBuffersgl.glBindBuffer

抽選時:

  1. バインドバッファ(gl.glBindBuffer

  2. 各セルを描画します(ループ)

    2.1。現在の位置を現在の立方体の中心に移動します(gl.glTranslatef(position.x, position.y, position.z

    2.2。現在の立方体を描画する(gl.glDrawArrays

    2.3。位置を戻す(gl.glTranslatef(-position.x, -position.y, -position.z)

于 2010-10-13T14:06:58.140 に答える