加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 我应该缓存OpenGL状态,例如当前绑定的缓冲区,还是OpenGL会

发布时间:2020-12-16 10:03:40 所属栏目:百科 来源:网络整理
导读:典型的OpenGL调用可能如下所示: GLuint buffer;glGenBuffers(1,buffer);glBindBuffer(GL_SOME_BUFFER,buffer);... 我已经读过缓冲区和其他类似函数的绑定可能非常昂贵.是否值得保存当前绑定的缓冲区,并在绑定之前检查它?比如这样: void StateManager::bin
典型的OpenGL调用可能如下所示:

GLuint buffer;
glGenBuffers(1,&buffer);
glBindBuffer(GL_SOME_BUFFER,buffer);
...

我已经读过缓冲区和其他类似函数的绑定可能非常昂贵.是否值得保存当前绑定的缓冲区,并在绑定之前检查它?比如这样:

void StateManager::bindBuffer(GLenum bufType,GLuint bufID) {
    if (this->m_currentBuffer[bufType] != bufID) {
        glBindBuffer(bufType,bufID);
        this->m_currentBuffer[bufType] = bufID;
    }
}

这背后的想法是,如果已经绑定了bufID,那么错过了对glBindBuffer的昂贵调用.这是一个值得的方法吗?我假设OpenGL可能已经实现了这样的优化,但我现在已经看到这个模式在一些项目中使用,所以我有疑虑.我只是感兴趣,因为它实现起来非常简单,但如果它没有太多/任何区别,那么我将跳过它(避免过早优化).

解决方法

这是高度平台和供应商依赖.

你问的是“OpenGL是否会实现……”.您已经明白了,OpenGL是一个API规范.有许多不同的实现,以及它们是否检查冗余状态更改完全是一个实现决策,它可以(并且将)从实现到实现不同.

您甚至不应期望给定的实现对所有状态都处理相同的操作.

由于这个话题根据过去的经验有点接近我的心,我很想写一篇小文章,包括一些咆哮.但我决定它不属于这里,所以这里只是一个注意事项列表,可能会影响给定的OpenGL实现是否在特定情况下测试冗余状态更改:

>实际改变国家的成本有多高?如果它非常便宜,检查冗余更改可能根本不值得.
>检查冗余更改的成本有多高?通常不多,但我们正在寻找每一点点都很重要的软件.
>重要的应用程序/基准是否经常冗余地改变这种状态?
>应用程序职责与OpenGL实施职责的理念是什么?

是的,这对每个人来说都是不幸的.对于想要在供应商/平台上获得理想性能的应用程序编写者而言,实际上并没有简单的解决方案.如果对代码添加检查,那么在OpenGL实现中具有相同检查的平台上,它们将毫无用处,并且会增加额外的开销.如果您的代码中没有检查,并且不能轻易避免首先进行这些冗余状态更改,那么您可以在OpenGL实现不检查的平台上保留性能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读