1

我的测试基于这个流行的 PBO 示例(请参阅http://www.songho.ca/opengl/gl_pbo.html中的 pboUnpack.zip )。根据示例在 PBO 模式 1 上进行测试。

运行原始示例,我发现在我的 NVIDIA 560GTX PCIe x16(驱动程序 v334.89 Win7 PRO x64 Core i5 Ivy Bridge 3.6GHz)上,glMapBufferARB()即使glBufferDataARB()前面是为了防止它阻塞(即丢弃 PBO),也会阻塞 15ms。

然后我将图像大小从原来的 1024*1024 更改为 400*400,我认为这肯定会减少阻塞时间。令我惊讶的是,它保持在 15 毫秒!CPU 利用率仍然很高。

进一步实验,我将图像大小增加到 4000*4000,我再次感到惊讶——glBufferDataARB 从 15 毫秒减少到 0.1 毫秒,同时 CPU 利用率也大大降低。

我无法解释这里发生了什么,我希望熟悉此类问题的人能够提供一些启示。

感兴趣的代码:

// bind PBO to update pixel values
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pboIds[nextIndex]);

// map the buffer object into client's memory
// Note that glMapBufferARB() causes sync issue.
// If GPU is working with this buffer, glMapBufferARB() will wait(stall)
// for GPU to finish its job. To avoid waiting (stall), you can call
// first glBufferDataARB() with NULL pointer before glMapBufferARB().
// If you do that, the previous data in PBO will be discarded and
// glMapBufferARB() returns a new allocated pointer immediately
// even if GPU is still working with the previous data.
glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, DATA_SIZE, 0, GL_STREAM_DRAW_ARB);
GLubyte* ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB);
if(ptr)
{
    // update data directly on the mapped buffer
    updatePixels(ptr, DATA_SIZE);
    glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB); // release pointer to mapping buffer
}
4

0 回答 0