2010-11-24 11 views
4

私は、現在のGLテクスチャ名がキャッシュされているサンプルコード(特にiOS GLプロジェクト)と、glBindTextureを呼び出す前に比較が行われていることを確認しました。目標は、glBindTextureへの不要な呼び出しを避けることです。OpenGL - glBindTexture - 早すぎる最適化ですか?

if (textureName != cachedTextureName) { 
    glBindTexture(GL_TEXTURE_2D, textureName); 
    cachedTextureName = textureName; 
} 

このアプローチでは、glBindTextureへのすべての呼び出しを同様に、できればラッパーを使用して処理する必要があります。しかし、サードパーティのコードを含めると、この問題が発生するだけでなく、であることがわかります。を覚えておいてください。

これは便利な最適化ですか?または、OpenGLの実装は、テクスチャ名が変更されていないglBlindTextureへの呼び出しを無視するほどスマートですか?

ありがとうございました。

答えて

3

私が見た限り、これは仕様では呼び出されていません。現在のテクスチャをテストしないと、相対的な性能低下が見られるのと同じテクスチャを再バインドすると、多くの実装で実際に何らかの処理が行われているようです。実装の詳細がプログラムに悪影響を及ぼさないように、できるだけテストを使用することをお勧めします。

一般に、OpenGLステートマシンを独自の状態処理で抽象化すると、バインドされたテクスチャやアクティブマトリックスなどの状態を照会することができ、glGetを呼び出さずにカスタム処理よりも時間がかかります。これにより、無効な振る舞いを禁止することができ、一般的にあなたのプログラムを推論しやすくなります。

+0

ありがとうございます。私の自然な傾向はそれを包むことですが、キャッシュされた状態を使わずにglBindTextureを呼び出すサードパーティコードの問題があります。 – SirRatty

+0

理想的な状況は、OpenGLにリンクしているライブラリにコードをラップすることであり、ライブラリの呼び出し元が意図的にコンテキストを取得してOpenGL関数を呼び出さないことを前提としています。悲しいかな、これは必ずしも実現可能なわけではないので、OpenGLの状態マシンとその弱点で暮らさなければなりません。 –

関連する問題