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渲染?
- 對性能有不良影響嗎?
這種情況可以通過全局狀態輕鬆避免。當前線程到達glUnmapBuffer()時,如果doSomeWork()尚未完成,則只需要更少的等待時間。如果沒有其他缺點,它會得到一些不同步的好處。 – 2012-07-10 18:47:20
@Martin:是的,這就是爲什麼我建議處理幀的其餘部分,並且只在幀結束時等待另一個任務。 – 2012-07-10 18:49:49
在畫框結尾安排其他作品並不總是很方便。那麼,在開始和結束時unmap有什麼區別? – 2012-07-10 19:27:42