OpenGL - glBindTexture - 过早优化?

时间:2010-11-24 22:39:07

标签: optimization opengl binding textures

我见过示例代码(最着名的是在iOS GL项目中),其中缓存了当前GL纹理名称,并在调用glBindTexture之前进行了比较。目标是避免对glBindTexture进行不必要的调用。

e.g。

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

这种方法要求对glBindTexture的所有调用都要进行类似处理,最好是通过包装器。但是包含第三方代码会使这成为问题,并且还有另一件要记住的事情

问。这是一项有用的优化吗?或者OpenGL实现是否足够聪明,无法忽略对glBlindTexture的调用,其中纹理名称没有改变?

感谢。

1 个答案:

答案 0 :(得分:3)

就我所见,这在规范中没有被提及。在实践中看来,如果重新绑定相同的纹理,许多实现实际上会进行一些处理,如果不测试当前纹理,则会看到相对性能下降。我建议尽可能使用测试,以确保实施细节不会对您的程序产生负面影响。

一般来说,使用您自己的状态处理对OpenGL状态机进行抽象是非常有用的,这样您就可以查询状态,例如绑定纹理或活动矩阵,而无需调用glGet,这几乎总是比您的慢{{1}}定制处理。这也允许您禁止无效行为,并且通常使您的程序更容易推理。