0

iPhoneアプリでパフォーマンス(FPS)をさらに向上させたいと思っています。私はすでにインターリーブされたデータ、GL_SHORT、および単一のテクスチャアトラスを使用しています。私がすでに行ったことの詳細については、この質問を参照してください。

次に、VBOを使用してパフォーマンスを向上させる方法を検討します。AppleのOpenGLESのドキュメントによると、これは実行するのに適したステップです。ただし、モデルビューマトリックスの変更によってVBOがどのように影響を受けるか(または影響を受けるかどうか)については説明していません。基本的に、同じオブジェクトをシーンに複数回レンダリングしますが、毎回わずかに異なるモデルビューマトリックスを使用します。オブジェクト間の主な違い(シーン内の位置以外)は、テクスチャマッピングです。それらはすべてわずかに異なるテクスチャ座標を持っています。

VBOはこの状況で役立ちますか?個々のオブジェクトごとに個別のVBOを割り当てる必要がありますか?

アップデート1

これまでのところ、VBOは私のパフォーマンスに悪影響を及ぼしているようです。FPSは20代半ばから高値に戻りました。私は70のVBOを割り当てています。データ用に35、インデックス用に35です。データと1つのグローバルインデックス配列に対してこれを35にノックダウンできます。glBufferSubData()を使用して、必要に応じてテクスチャ座標を更新しています。

もう1つの考えは、すべての静的データを分割し、そのVBOにGL_STATIC_DRAWを指定することです。

4

1 に答える 1

1

モデルビューマトリックスの変更によってVBOがどのように影響を受けるか(または影響を受けるかどうか)については説明していません。

モデルビュー変換は、描画呼び出しを行うたびにGPUで実行されます。モデルビューを変更しても、VBOは変化しません。

オブジェクト間の主な違い(シーン内の位置以外)は、テクスチャマッピングです。それらはすべてわずかに異なるテクスチャ座標を持っています。

モデルビューマトリックスに加えて、テクスチャマトリックスを調整する必要があるように聞こえますが、次のようになります。

glMatrixMode(GL_TEXTURE);
// glTranslate, glRotate, etc
glMatrixMode(GL_MODELVIEW);
// glTranslate, glRotate, etc

VBOを活用することは通常は良い考えですが、実際には第3世代のiPhoneでのみ役立ちます。古いiPhoneではあまり役に立ちません。

個々のオブジェクトごとに個別のVBOを割り当てる必要がありますか?

通常、アプリケーション内のVBOの数を減らす方が効率的です。に複数の呼び出しを行うのではなく、またはglBindBufferを呼び出すたびに一意のオフセットを指定できます。glDrawArraysglDrawElements

于 2009-12-10T10:56:22.647 に答える