我被告知缓冲区孤立(即使用glBufferData()
调用最终arg的NULL
)允许我们避免在GPU尝试读取缓冲区对象时发生的停顿正试图写信给它。
我不清楚的是,我们是否可以在没有 glMapBuffer*()
的情况下使用此方法,或glMapBuffer*()
是否是孤儿和避免失速的概念不可或缺的一部分?我认为这纯粹是为了避免对现有代码库进行不必要的更改,但从长远来看,我理解glMapBuffer*()
本身就是比重复glBufferData()
更好的选择。
(请特别回复OpenGL ES 2.0,除非GL版本的答案是通用的。)
答案 0 :(得分:0)
第一种方法是使用NULL指针调用glBufferData 以前完全相同的大小和用法提示。这允许 实现只是为该缓冲区对象重新分配存储 下引擎罩。由于分配存储(可能)比快速分配 隐式同步,您获得了显着的性能优势 过度同步。因为你传递了NULL,如果没有 需要同步开始,这可以简化为a 无操作。旧的存储仍将由OpenGL命令使用 已经发送过。如果继续使用相同的大小 一遍又一遍,GL驱动程序很可能不会做任何事情 完全分配,但只是将一个旧的免费区块拉下来 未使用的缓冲队列并使用它(当然这不是 保证),所以它可能非常有效。
使用glMapBufferRange时可以做同样的事情 GL_MAP_INVALIDATE_BUFFER_BIT。你也可以使用 glInvalidateBufferData,如果可用。
所以我认为可以安全地假设孤儿只需要glBufferData()
个电话。