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 を破棄する) ことを意図していた場合でも、15 ミリ秒ブロックすることがわかりました。

次に、画像サイズを元の 1024*1024 から 400*400 に変更しました。これにより、ブロック時間が確実に短縮されると考えました。驚いたことに、それは 15ms のままでした! CPU 使用率は高いままでした。

さらに実験して、画像サイズを 4000*4000 に増やしたところ、やはり驚きました。glBufferDataARB が 15ms から 0.1ms に減少し、同時に 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