glMapBuffer 的一个常见用法是
previousPBO.render();
bindNextPBO();
GLubyte* src = (GLubyte*)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
if(src) {
doSomeWork(src);
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
}
有 2 个 PBO 以替代方式工作。
但是,有时 doSomeWork(.) 可能在另一个线程中。如果应用了上面的代码,当前线程必须等待 doSomeWork() 完成。另一种解决方案是:
previousPBO.render();
bindNextPBO();
if(currentPBO.mapped) {
currentPBO.mapped = false;
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
}
GLubyte* src = (GLubyte*)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
if(src) {
currentPBO.mapped = true;
doSomeWork(src);
}
在这种情况下,同一个 PBO 的 map->unmap 过程跨越两个帧。
- PBO 的未映射状态是否会停止 GPU 的渲染?
- 对性能有什么不好的影响吗?