c – 我应该缓存OpenGL状态,例如当前绑定的缓冲区,还是OpenGL会
典型的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实现不检查的平台上保留性能. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |