我是否需要使用glMapRange和缓冲孤立来避免停顿?

时间:2015-11-03 20:42:25

标签: performance opengl opengl-es-2.0

我被告知缓冲区孤立(即使用glBufferData()调用最终arg的NULL)允许我们避免在GPU尝试读取缓冲区对象时发生的停顿正试图写信给它。

我不清楚的是,我们是否可以在没有 glMapBuffer*()的情况下使用此方法,或glMapBuffer*()是否是孤儿和避免失速的概念不可或缺的一部分?我认为这纯粹是为了避免对现有代码库进行不必要的更改,但从长远来看,我理解glMapBuffer*()本身就是比重复glBufferData()更好的选择。

(请特别回复OpenGL ES 2.0,除非GL版本的答案是通用的。)

1 个答案:

答案 0 :(得分:0)

答案在official location

  

第一种方法是使用NULL指针调用glBufferData   以前完全相同的大小和用法提示。这允许   实现只是为该缓冲区对象重新分配存储   下引擎罩。由于分配存储(可能)比快速分配   隐式同步,您获得了显着的性能优势   过度同步。因为你传递了NULL,如果没有   需要同步开始,这可以简化为a   无操作。旧的存储仍将由OpenGL命令使用   已经发送过。如果继续使用相同的大小   一遍又一遍,GL驱动程序很可能不会做任何事情   完全分配,但只是将一个旧的免费区块拉下来   未使用的缓冲队列并使用它(当然这不是   保证),所以它可能非常有效。

     

使用glMapBufferRange时可以做同样的事情   GL_MAP_INVALIDATE_BUFFER_BIT。你也可以使用   glInvalidateBufferData,如果可用。

所以我认为可以安全地假设孤儿只需要glBufferData()个电话。