0

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 的渲染?
  • 对性能有什么不好的影响吗?
4

1 回答 1

0

第二个代码片段是错误的。如果doSomeWork没有按时完成怎么办?现在它正在访问您未映射的内存,并将导致访问冲突(或更糟)。

更好的方法是等待其他线程完成并在之前的帧结束时取消映射缓冲区SwapBuffers

于 2012-07-10T18:35:13.420 回答