我正在使用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实现?答案 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);
设置一个标志,应该始终有效。然而,它不应该是昂贵的。