2012-08-12 245 views
0

我在我的xna遊戲中有一個照明系統,通過每個燈光循環,並將這些燈光添加到包含所有燈光的最終燈光地圖中。是否可以多線程調用GPU?

創建這些燈的過程涉及與圖形設備做很多功能,比如使用效果/着色器和繪圖渲染目標,並使用graphics.device.clear清除渲染目標等

所以我的問題是,是否可以多線程每個燈?或者這是不可能的,因爲只有一個圖形設備,並且一次只有一個線程可以使用它?如果有可能,它會提高性能嗎?

+2

GPU所做的一切已經在數百個線程中並行化。編程GPU時不要考慮CPU線程。 – jalf 2012-08-12 23:05:52

+0

但是在XNA編程中,您已經將圖形設備設置爲目標渲染目標,並且您繪製的所有內容都是針對該目標渲染的,這意味着您的GPU所執行的任何操作。執行我想要的過程涉及使用多個渲染目標並多次更改圖形設備目標,因此,如果我在此過程中創建了多個線程,它們是否會相互干擾? – 2012-08-13 10:59:55

回答

1

基本沒有。 XNA中的GraphicsDevice是單線程渲染。您可以從多個線程向GPU發送資源(紋理,頂點緩衝區等)。但是您只能從主線程調用Draw(以及其他渲染函數,如Present)。

我有heard of people成功地從多線程渲染類型的東西,適當的鎖定。但是,這似乎是「糟糕的巫術」。正如鏈接的帖子所說:「XNA Framework文檔沒有在這裏做任何承諾」。更不用說:即使獲得鎖定權也很棘手。

我真的不確定製作多個圖形設備 - 我沒有自己嘗試過。我認爲這是可能的,但是你不能在這些設備之間共享資源 - 使它變得毫無用處。可能不值得的努力。

正如賈爾夫在你的問題的評論中提到的 - 一旦你到達GPU,一切都已並行處理。因此,如果由於命中batch limit而導致CPU受限(因爲幾乎所有不是批次的都可以將移動到另一個線程),CPU纔會有用。在這種情況下,有許多優化措施可以首先考慮減少批次數量 - 然後嘗試這樣的瘋狂計劃。 (你已經測量了你的性能,對吧?

這聽起來像你可能試圖做的是渲染一個相當複雜的場景在後臺渲染目標,並將負載分散到很多幀。在這種情況下 - 如果性能要求規定它 - 您可能可能會在多個幀中在主線程上進行渲染,並手動安排它。不要忘記設置RenderTargetUsage.PreserveContents,這樣每次將其放置在圖形設備上時都不會被清除。

相關問題