2

私はgDEBuggerを使用して、openGLコードのパフォーマンスを改善しようとしています(これは現在非常にひどいので、fpsレートについても説明しません)。チュートリアルを段階的に実行しており(デバッガーを使用してopenGLエラーなどを検索しています)、現在、冗長な状態の変化を識別しています。それらを回避するためにコードを変更することが本当に良い考えであるかどうかは少しわかりません。

例えば:

  • 私のコードは、とを呼び出すことによって「クリーンな初期化」をglClearAccum(0 , 0 , 0 , 0);行いglClearColor(0.0, 0.0, 0.0, 0.0);ます。これらは当然冗長ですが、すべての状況でそれを信頼できますか?一部のopenGL実装がこの初期状態を保証しない場合、ほとんどの場合冗長であっても、呼び出しを行う方が安全です。
  • glDrawBuffer(GL_BACK);初めてシーンを描くときも同じ質問です。
  • glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)冗長であるとも報告されています。同じパラメータで繰り返し呼び出していることに気づきました。glEnable(GL_TEXTURE_2D);これは、呼び出しがとの間に配置されglDisable(GL_TEXTURE_2D);、テクスチャリング呼び出しが行われている間、テクスチャリングが有効になるのは短時間であるためです。テクスチャリングを永続的に有効にすると、パフォーマンスが低下しますか?テクスチャリングを一時的に有効にすることに固執する場合、glTextEnvf初期化中に1回だけ呼び出すことは問題ありませんか、それともその時点でテクスチャリングが無効になっているため失敗しますか?それとも、それはopenGLの実装に依存しますか?
4

2 に答える 2

1

初期化コードについては、特定の各関数のマニュアルページを見ると、デフォルト値が何であるかがわかります。これは仕様によって保証されています。とはいえ、初期化コードは最初に1回だけ実行され、呼び出しごとに1マイクロ秒の遅延が発生する可能性があるため、まったく問題にはなりません。初期化中にこれらのことを心配する価値はありません。

glTexEnvfの場合、テクスチャリングを無効にしても状態はリセットされません。glEnable(GL_TEXTURE_2D)は、他のテクスチャ関数には影響を与えません。描画呼び出し中にテクスチャをサンプリングしないかどうかを決定するだけです。テクスチャパラメータを設定するためにテクスチャリングを有効にする必要はありません。

たとえば、次のコードが有効です。

//textures disabled
glTexEnvf(some_texture_state);

for(i=0;i<10;i++){
   glEnable(GL_TEXTURE_2D)
   //draw some stuff with textures and "some_texture_state"
   glDisable(GL_TEXTURE_2D)
   //draw some stuff without texturing
}
于 2012-04-29T19:50:21.513 に答える
0

glClearAccum(0 , 0 , 0 , 0);また、glClearColor(0.0, 0.0, 0.0, 0.0);フレームごとに画面全体を描画する場合は冗長であり(おそらくそうします)、非常に重いです。フレームバッファをクリアする意味はありません。最後のフレームを描画するだけです。

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);フラグを設定し、常に機能するはずです。しかし、それは高価であるべきではありません。

于 2012-04-29T19:51:35.403 に答える