消除冗余(?)openGL调用

时间:2012-04-29 19:41:05

标签: performance opengl

我正在使用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一次,还是会因为纹理在此时被禁用而失败?或者这取决于openGL实现?

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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);设置一个标志,应该始终有效。然而,它不应该是昂贵的。