2011-07-13 14 views
5

私はiOSとAndroid用のゲームを作っています。 私は多くの場所で、インデックスを使った描画が三角形の配列を描画するよりも効率的であることを見てきました。glDrawElementsとglDrawArrayの効率

私は損失のある圧縮された頂点(md2のファイル形式のようなもの)を使用しており、インデックスだけでは不十分です - 配列:N * 3(xyz)* 1(uchar)+ translate(12バイト)+スケール(12バイト)。 要素:N * 3(xyz)* 4(uint)+配列/〜10

アップルのOpenGLプロファイラツールでは、配列がインデックス化され圧縮された要素よりも優れているようですglDrawElements ..

OpenGLの実装はインデックス付き配列を優先しますか?インデックス付き配列に通常の圧縮されていない配列よりも少ないデータが含まれているからです。

p.s. 私はOpenGL es 2.0を使用しています。頂点シェーダは、頂点を解凍するものです。

答えて

1

glDrawElements()を使用すると、かなりの量のメモリが節約され、任意の順序で配列要素を指定できます。

ただし、glDrawArrays()を使用すると、唯一の選択肢はリストを順番に繰り返すことです。

お客様になります。

3

頂点配列または頂点バッファオブジェクトを使用していますか?頂点配列を使用している場合、glDrawElementsではなく、glDrawRangeElementsを調べることを検討してください。

あなたのポリゴンのすべてが(かなり低い)個別の頂点を持っている場合を除きglDrawElementsが繰り返さ頂点は、GPUキャッシュにロードされるという事実を利用し、より多くをロードする必要がないので、glDrawElementsglDrawArrayよりも速くなりますその頂点がその一部である各ポリのために1回以上。しかし、glDrawArrayを使用すると、配列全体を繰り返し処理し、類似した頂点を関連付けることはできないため、複数回ロードする必要があります。

ただし、常にあなたの状況によって異なります。プロファイラを使用するか、これらの方法のそれぞれを使用してフレームレートを取得してみてください。それらを切り替えることはあまり難しいことではありません。 1つが明らかに優れている場合は、それを使用します。どちらも優れていない場合は、それほど重要ではないでしょう。

早すぎる最適化はすべての悪の根源です。がんばろう! :)