2014-01-11 49 views
0

我得到了一個(基本)體素引擎運行和一個水系統,看起來(我假設基本上是這樣):https://www.youtube.com/watch?v=Q_TdeGIOOts(不是我的遊戲)。
水的值存儲在一個三維浮點數組中,每隔0.05s通過檢查下方和鄰近的體素(y-1,x-1,x + 1,z-1,z + 1)計算水流量。並添加該值。
這個系統對於少量的水很好(70+ fps),但是當我開始計算8個以上的水時,它會變得太多。 (我禁用了所有渲染或網格創建來檢查這是否是瓶頸,它不是純粹的流量計算)。
我不是一個非常有經驗的程序員,所以我不知道從哪裏開始優化,除了像我已經做過的那樣在協同程序中進行計算。
在這篇文章中:https://gamedev.stackexchange.com/questions/55414/how-to-define-areas-filled-with-water(靠近底部)Boreal建議在計算着色器中運行它。這是我的方式嗎?我將如何去做這件事?
任何幫助,非常感謝。Unity C#Voxel有限水優化

回答

0

如果您真的在計算基於體素的模擬,隨着尺寸的增加,您將擴大幾何計算的數量,因此您將快速用完大量的處理能力。

計算着色器很適合快速進行大規模並行計算,雖然這是一個非常不同的編程範例,需要一些習慣。計算着色器會查看緩衝區的內容(例如,我們平民的「紋理」),並快速執行操作 - 在您的情況下,緩衝區可能是像素值代表水單元的緩衝區/紋理。如果你想做一些非常簡單的事情,比如增加或減少計算着色器,計算着色器使用GPU的並行處理能力來實現它非常快。

難度部分是GPU是optimized for parallel processing。這意味着你不能編寫像「texelA.value + = texelB.value」這樣的代碼 - 在沒有額外的工作的情況下,緩衝區的每個片段都會被零處理,而不知道其他片段中會發生什麼。爲了引用其他紋理元素,你需要以某種方式再次讀取紋理 - 一些技術用偏移量多次讀取一個紋理(this GL example這樣做是爲了實現模糊,其他人是通過重複處理紋理,將結果放入臨時紋理,然後重新處理

在10,000英尺的等級上:是的,計算着色器對於這類問題是一個很好的工具,因爲它涉及到大量的自相似計算,但是要做到這一點並不容易。你以前沒有做過常規的着色器編程,你可能需要先看看它是否適合GPU的工作方式,甚至是真正基本的工具(if-then-else或者loop)在GPU編程和需要一些時間才能解決這些問題。截至撰寫本文時(2013年1月10日),它看起來像Nvidia and Udacity are offering an intro to compute shader course w這可能是一個很好的方法來加快速度。

FWIW您還需要漂亮的計算着色器硬件,這可能會限制您的觀衆。

+0

感謝您的深入解答!雖然我覺得我還沒有達到那個水平,但我會研究它。也意識到,如果我想要「卸載」塊,有限的水計算成爲一個真正的痛苦繼續...想知道別人怎麼做(像這樣的男人之間的神:http://www.youtube.com/watch? v = Y9mGczbvoc0)。再次感謝! – Kasper