2012-07-10 42 views
0
glMapBuffer的

一個常見用法是glMapBuffer佔用GPU時間嗎?

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渲染?
  • 對性能有不良影響嗎?

回答

0

第二個代碼片段只是錯誤的。如果doSomeWork沒有及時完成呢?現在它正在訪問您未映射的內存,並且會導致訪問衝突(或更糟糕)。

一個更好的方法是等待完成另一個線程,並在SwapBuffers之前取消映射結尾的緩衝區。

+0

這種情況可以通過全局狀態輕鬆避免。當前線程到達glUnmapBuffer()時,如果doSomeWork()尚未完成,則只需要更少的等待時間。如果沒有其他缺點,它會得到一些不同步的好處。 – 2012-07-10 18:47:20

+0

@Martin:是的,這就是爲什麼我建議處理幀的其餘部分,並且只在幀結束時等待另一個任務。 – 2012-07-10 18:49:49

+0

在畫框​​結尾安排其他作品並不總是很方便。那麼,在開始和結束時unmap有什麼區別? – 2012-07-10 19:27:42