Opengl glMapBuffer是否占用GPU时间?

Opengl glMapBuffer是否占用GPU时间?,opengl,pbo,Opengl,Pbo,glMapBuffer的一个常见用法是 previousPBO.render(); bindNextPBO(); GLubyte* src = (GLubyte*)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY); if(src) { doSomeWork(src); glUnmapBuffer(GL_PIXEL_PACK_BUFFER); } 有两个PBO以替代方式工作 但是,有时,doSomeWork(.)可能位于另一个线程中。

glMapBuffer的一个常见用法是

previousPBO.render();
bindNextPBO();
GLubyte* src = (GLubyte*)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
if(src) {
    doSomeWork(src);
    glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
}
有两个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的映射->取消映射过程跨越两个帧

  • PBO的未映射状态是否会暂停GPU的渲染
  • 对性能有任何不良影响吗

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


    更好的方法是等待另一个线程完成,并在
    SwapBuffers

    之前取消帧末尾的缓冲区映射。这种情况可以通过全局状态轻松避免。当当前线程到达glUnmapBuffer()时,如果doSomeWork()尚未完成,则只需要更少的等待时间。如果没有其他缺点,它将获得异步化的一些好处。@马丁:是的,这就是为什么我建议处理帧的其余部分,并只在帧的末尾等待其他任务的原因。在帧的末尾安排其他工作并不总是方便的。那么,在开始和结束时取消映射有什么区别呢?@Martin:这不是取消映射,而是在结束帧之前等待其他线程完成。如果在取消映射之前完成其他工作,例如处理另一个PBO,则映射的PBO会影响GPU的性能吗?