2013-05-28 60 views
6

我一直在閱讀很多關於多線程渲染。人們一直在提出各種奇怪而奇妙的方案,用線程向GPU提交工作,以加快幀頻並獲得更多的東西,但是我對整個事情有一個概念上的問題,而我我以爲我會在這裏由專家運行它,看看你的想法。多線程渲染D3D/OpenGL /無論

據我所知,GPU上併發的基本單位是Warp。也就是說,它在像素級別下降,而不是在幾何提交級別更高。所以考慮到GPU上的併發單元是扭曲的,驅動程序必須與互斥鎖緊密鎖定,以防止多個線程搞砸對方的提交。如果是這種情況,我不會看到編碼到D3D或OpenGL多線程原語的好處。

毫無疑問,在多線程場景中使用GPU的最有效方法是在更高級的抽象級別上,在提交它之前要一起收集批量工作?我的意思是,而不是隨機交錯多個線程的命令,我會認爲一個塊接受來自多個線程的工作,但是它裏面有一點智能,以確保事物被訂購以獲得更好的性能,之後被提交給渲染器,如果你想要使用多線程,將會是一個更大的收益。

那麼,在實際的API中,D3D/OpenGL支持多線程渲染?

幫我解惑!

+1

「多線程渲染」是什麼意思?因爲這兩個API都不允許多線程*渲染*。 –

+0

D3D11命令列出了不同線程和「在不同線程上產生的併發對象」,在OpenGL的無數博客和人們試圖「讓他們的渲染器多線程化」的帖子中 - 太多無法計數:)。 – Robinson

回答

8

你的問題來自於「讓他們的渲染器多線程」和「多線程渲染」之間的區別誤解。

「渲染器」,或更確切地說是「渲染系統」,不僅僅是向API發出渲染命令。它必須隨機播放記憶。它可能必須動態加載紋理進出圖形內存。在一些渲染過程之後,它可能不得不讀取數據。等等。

製作渲染器多線程意味着:使渲染系統利用多個線程。這可能是線程場景圖管理任務,比如構建要渲染的對象列表(截錐體剔除,BSP,門戶等)。這可能是一個專門用於紋理存儲管理的線程,它根據需要交換紋理,從磁盤等裝入紋理。這可能與命令列表的D3D11情況相同,在這種情況下,您可以與其他任務並行地構建一系列渲染命令。

渲染,向API提交實際渲染命令的過程是而不是線程化。您通常有一個線程負責基本的glDraw*::DrawIndexedPrimitive工作。 D3D11命令列表允許您構建這些命令的序列,但它們不會與其他渲染命令並行執行。它是渲染線程和負責實際發佈命令列表的主要上下文;命令列表只是爲了讓這個列表更加友好。

+0

恭喜100K;) –

1

在Direct3D 11中,您通常會創建延遲的上下文,您可以從工作線程向其中繪製調用。一旦工作完成並準備好渲染,您可以從每個延遲的上下文生成一個命令列表,並在即時(前線程)上下文中執行它。這允許繪製調用在多個線程中組成,同時保持繪製調用的正確排序等。

+0

啊哈。我懂了。所以真的,它只是一個花哨的命令列表。 – Robinson