【问题标题】:Effect of OpenGL Idempotent state changesOpenGL 幂等状态变化的影响
【发布时间】:2018-08-03 12:41:10
【问题描述】:

正如标题所说,驱动程序是否以某种方式优化了 opengl 状态机上的幂等操作?

例如,如果我将同一个缓冲区重新绑定到同一个目标两次怎么办?

glBindBuffer(GL_ARRAY_BUFFER, buf_id)
...
...
//No previous binding operation on the target, this should be idempotent 
//and ideally with no cost.
glBindBuffer(GL_ARRAY_BUFFER, buf_id)  

顶点数组对象 (glBindVertexArray)、着色器 (glUseProgram) 帧缓冲区等也有同样的问题。

【问题讨论】:

  • 这将取决于具体的 API 实现。即使是特定的,除非它是开源的,否则也很难知道。

标签: c++ opengl shader vao


【解决方案1】:

分析您的应用。这始终是检验您的假设的最佳方式。使用 RenderDoc 或任何其他 GPU 分析工具。那些通常显示冗余的 API 调用,这会影响性能。但拥有缓存状态的机制也是一个很好的做法。以下是 John Carmack 在Quake Arena 中的做法。

【讨论】:

  • 在我的引擎的演变过程中,我有机会对其进行测试,是的,即使对于幂等状态变化,例如为场景中的每个对象调用 glEnable(GL_DEPTH) glDepthFunc() 都会将 fps 降低 15/在具有一千个立方体的场景中 20 fps。这绝对是驱动程序开销,因为当我添加一些旨在停止 CPU 的代码时,fps 并没有改变。
  • 当然!尤其是在移动硬件上很明显。
【解决方案2】:

他们可以,但规范不能保证。如果您想完成,您必须自己完成。

【讨论】:

    猜你喜欢
    • 2020-12-10
    • 2020-07-08
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多