我正在使用WebGL做硬件蒙皮,但是更新我的模型節點層次結構會對性能造成巨大沖擊。每個節點都需要查詢其當前的位置/旋轉/縮放關鍵幀,用它們構造一個局部矩陣,如果它有一個父節點,則將它與其父節點的世界矩陣相乘。Javascript - 優化3D動畫的節點層次結構更新
矩陣數學本身就像獲得的一樣得到了優化(基於gl矩陣的矩陣構造的特殊變體)。但是,如果我更新許多模型,每個模型都有數十個節點(有些甚至有數百個,可悲),這使得瀏覽器的所有執行時間都耗盡了。
我曾嘗試使用骯髒的狀態,當節點實際上並不需要更新,但只是檢查如果他們的本地數據更改(主要是檢查位置或旋轉更改)實際上導致相同數量的處理,只是計算矩陣。
WebCL將是理想的,但似乎無處可去,因爲2014年
我開始覺得在着色器運行的這一切,但我不能完全換我如何設計它的頭(例如,存儲關鍵幀,這是幀 - >數據的映射,或者如何寫回數據)。
另一種方法是將所有動畫轉換緩存到紋理中,但這並不能很好地擴展。對於具有足夠低關鍵幀數量的模型,這是可以的,但對於長動畫的模型,這會變成非常快的數百兆字節。 這主要是因爲我想不出任何方式來存儲稀疏數據。如果可能的話,那麼我可以存儲與關鍵幀相同數量的轉換,這些轉換不會佔用大量內存(現在,我將存儲每一幀的轉換)。當然,這需要做矩陣插值,而我不確定這是多麼可靠。
有沒有人有任何想法?
我的模擬已經在30FPS下工作。你鏈接的幻燈片是不錯的,但我真的不知道他們對JS有多相關。我的節點實際上已經在一個共享的類型數組中(儘管所有的成員都按順序存儲,即[local_matrix1,world_matrix1,local_location1,...,local_matrix2,...]',不知道這是否會影響),我不認爲我曾經注意到這會加快速度 - 我其實是做了這個改變,只是爲了能夠圍繞web工作者移動這個數組。 剔除和LOD可能會起作用,但我寧願儘可能快地將最大的N個可見對象放在第一位。 – user2503048