OpenGL - glBindTexture - 过早优化?

4
我看过一些示例代码(尤其是在iOS GL项目中),其中当前的GL纹理名称被缓存,并在调用glBindTexture之前进行比较。目的是避免不必要的glBindTexture调用。
例如:
if (textureName != cachedTextureName) {
    glBindTexture(GL_TEXTURE_2D, textureName);
    cachedTextureName = textureName;
}

这个方法要求所有调用glBindTexture的都需要类似处理,最好通过一个包装器处理。但第三方代码的加入使得这变得棘手,同时也是另一件需要记住的事情。

问:这是一个有用的优化吗?还是OpenGL实现已经足够聪明,可以忽略纹理名称未更改的glBlindTexture调用呢?

谢谢。

1个回答

3

根据我所见,规范中并未明确说明这一点。实际上,在实践中,如果重新绑定相同的纹理,许多实现实际上会进行一些处理,如果您不测试当前纹理,则会看到相对性能下降。如果可能的话,建议使用测试以确保实现细节不会对您的程序产生不利影响。

通常来说,通过自己的状态处理来抽象OpenGL状态机非常有用,这样您就可以查询状态,例如绑定的纹理或活动矩阵,而无需调用glGet,后者几乎总是比您的自定义处理慢。这还允许您禁止无效行为,并且通常使您的程序更易于理解。


谢谢Ron。我的自然倾向是将其包装起来,但是这样会有第三方代码调用glBindTexture而不使用我的缓存状态的问题。 - SirRatty
理想情况是将您的代码封装在一个链接到OpenGL的库中,并假设调用者不会故意获取您的上下文并调用OpenGL函数。然而,这并非总是可行的,因此您必须处理OpenGL状态机及其缺陷。 - Ron Warholic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接