2012-01-25 85 views
2

我有一個多線程的OpenGL應用程序使用PBO在cpu和gpu之間進行數據傳輸。在單獨的線程上分配PBO?

我已經合併了PBO的分配,但是,當這些池爲空時,我的非opengl線程必須暫時阻塞一段時間,直到OpenGL線程達到它可以分配緩衝區的位置(即完成渲染當前幀)。這種等待在某些我想避免的情況下會造成一些滯後峯值。

是否有可能在另一個線程上分配PBO,然後由「主」OpenGL線程使用?

回答

4

是的,您可以在一個線程上創建對象,以便在另一個線程上使用。你需要一個新的GL上下文來做到這一點。

這就是說,有兩個問題。

首先,這取決於您的「分配公益組織」的含義。你不應該在幀的中間分配緩衝區對象。你應該先分配你需要的所有緩衝區。當需要使用它們時,你可以簡單地使用你所擁有的。

「分配」,我的意思是調用glBufferData在先前分配的緩衝區使用不同的大小或驅動程序提示比以前使用。或以任何方式使用glGenBuffersglDeleteBuffers。這些都不應該發生在一個框架內。

其次,使緩衝區無效不應導致「滯後峯值」。通過「無效」,我的意思是使用相同的大小和用法提示重新分配使用glBufferData的緩衝區,或使用glMapBufferRangeGL_INVALIDATE_BUFFER位重新分配緩衝區。詳情請參閱this page on how to stream buffer object data。如果您遇到問題,那麼您可能在NVIDIA硬件上使用了錯誤的緩衝區對象提示(即:使用STREAM)。

+0

我想你忘了鏈接到緩衝區對象流信息。 – genpfault

+0

@genpfault:已修復。謝謝。 –