Unity项目技术方案Dots架构方案简介
DOTS全稱是Data-Oriented Tech Stack,翻譯過來就是多線程式數據導向型技術堆棧(DOTS),它由任務系統(Job System)、實體組件系統(ECS)、Burst Compiler編譯器三部分組成。
ECS + JobSystem + BurstCompile = 高性能 + 多線程 + ?編譯層面優化
DOTS保證相同類型組件在內存中都是順序排列,極大程度增加緩存的命中率,此外配合任務系統(Job System)讓開發者無需頭疼多線程同時訪問數據需要手動加解鎖的麻煩,最終加持Burst Compiler讓性能飛起來。
ECS、JobSystem、Burst,這三個組件是可以相互獨立使用,并不是說使用一個這三個必須同時用,你可以任意選擇其中一個來進行使用,用于不同的應用場景。
如果說我們需要使用JobSystem,其實它跟ECS沒有太大的關系,你可以在ECS里面用,也可以不在ECS里面用,只要是需要并行計算的地方都可以使用。
Burst也一樣,它也不需要配合ECS使用,不需要跟并行計算捆綁使用,它的作用僅僅是對于一些復雜的計算密集的東西去進行編譯器優化,來達到性能提升。
只要是計算密集型的東西,都可以使用Burst,同步方法也是可以的。
關于ECS,一個比較大的誤解,可能大家會覺得用ECS之后,所有東西都可以用ECS來寫,就會想UI的業務邏輯怎么用ECS實現。大可不必,并不是說用ECS,所有東西全部都要用ECS來做,而是大家可以根據項目需求選擇其中適合那部分來用ECS去寫,剩下的部分還是使用傳統的面向對象的方式去寫,沒有任何問題,只要用代碼稍微結合一下就可以了。
在《黑暗之潮》當中利用ECS的例子,我們通過ECS渲染了大量的怪物。我們游戲里面怪物通常有一個特點,一組怪由幾名精英配合一兩種大量的存在的爪牙組成的,大家可以看到右面的圖只有三種怪,如果說用默認的SkinMeshRenderer的話,就有一個非常嚴重的問題,沒有辦法合批了,畫面上面有多少個怪,有多少個DrawCall而且Animator開銷也不小,還有一個問題,GameObject為.Instantiate開銷也是比較大的,如果說我要同時刷出來三四十只怪的話,肯定會卡頓,用ECS就能比較好的解決這三個問題。
?
使用ECS先把整個動畫信息去烘焙到這么一張動畫貼圖上面,在GPU當中進行蒙皮操作,我們再通過JobSystem和Burst實現視錐剔除和動畫系統的更新,最后我們再在面向對象那塊業務邏輯那塊控制ECS Enity就可以了。也就是說ECS的部分,我們只是提供渲染的和動作的結構,其他部分業務邏輯還是完全用面向對象去實現的,相當于各取所長。
?
用ECS最大的好處就是性能。
首先第一個,因為我們采用了GPU蒙皮,整個DrawCall的數量下降到有幾種怪就是幾個DrawCall,這個就非常好了。實例化也是非常快,ECS基本上就是無感的,在極端機上消耗,即便同時刷一千只怪也不足1毫秒,借助Burst力量類似于視錐剔除這些計算量比較大的操作,在低端機上也是可以忽略不計的。
大家可以看到下面的截圖,演示我們整個動畫更新階段,也是同樣在驍龍450 SoC上測的,100只怪左右的情況,動畫整個更新過程只用了0.008毫秒,這就是忽略不計,根本不需要考慮的一個量級。通過ECS,我們畫面上怪物的渲染完全取決于GPU本身的渲染性能,CPU的開銷完全不需要去考慮了,所以也不會出現卡頓。
?
第二個,我們通過Jobsystem去實現了怪物擊飛的效果,大家可以看到這個怪物被打下懸崖,它如果說碰到墻壁必須要被墻壁擋下來,需要進行一些物理運算,如果直接使用Unity的Ragdoll也就是布娃娃系統,它的物理計算非常復雜,對于低端機會造成比較大的性能負擔。我們把這個過程稍微簡化了一下,所有的這些怪物在被擊飛的時候,使用的是預先制作好的動畫,我們只需要計算它的運行軌跡就行了。
我們首先用Job去并行計算這些怪物的分析軌跡,再通過Unity提供的多線程Raycast方法去進行射線檢測來判斷它是否撞到墻或者碰到地面了。最后如果說我們還有一些非ECS了對象,我們可以在計算完畢之后再通過一個單獨的Job把這個所有GameObject的位置給同步一下就可以了。
?
第三個,我們通過Burst實現的就是射線技能,這個東西看上去很簡單,實際上需要對整個場景以及所有的怪物和其他對象產生交互。射線打到墻上能夠實時產生反映,我們這個東西需要每幀對整個場景進行射線檢測,整個計算過程實際上是開銷比較大的。通過Burst我們相當于把這個東西做成了一個Job,通過Job.Run的方法去直接進行調用,就是在當前這個線程進行的操作。
使用起來跟一個靜態方法沒有太大的差別,還有像大家看到的這個技能,會有大量的子彈,對這些子彈我們同樣需要進行運行軌跡的計算。通過Burst非常有效的把這兩個計算開銷降的非常低,Burst開啟之后,它的性能提升基本能上百倍,通過剛才也提到Job.Run的方式實現同步調用,我們在整個計算流程當中不需要開額外的線程,直接在當前線程,單個靜態方法直接調用就可以了,也是非常方便的。
?
大家可以看一下開啟和不開啟Burst效果的差別,左邊是開啟,右邊是不開啟,我們在一個計算體系化模型工具中測試,左邊只用241毫秒,右邊用了20毫,真是一百倍的差別。而不是說它用了多線程所以更快,大家可以看到每個線程都快了100倍,如果算總耗時,這邊用了143秒,這邊只用了1秒鐘,如果把所有線程的時間加起來,就是100倍的差別,效果非常明顯。
?
什么項目用Dots?
具有大量相同類型運算的項目,例如RTS、SLG、我的世界類型方塊沙盒。
Dots這套解決方案,暫時只能對CPU進行優化,GPU方向期待Unity后續計劃。
Burst目前還是Preview,正式項目中使用可能會有很多坑 。
https://aladdin.blog.csdn.net/article/details/105081530
Unity DOTS技術淺析_IT善男信女鬼的博客-CSDN博客
[Unity 活動]-Unity DOTS技術詳解 - 宣雨松_嗶哩嗶哩_bilibili
ILRuntime作者林若峰分享:次世代手游渲染怎么做 - GameRes游資網
[Unity 活動]-游戲專場|Unity 2019 新特性在次時代手游 《黑暗之潮》中的應用經驗及技術分享_嗶哩嗶哩_bilibili
Unity2019 Dots初試_Hello Captain-CSDN博客
Unity DOTS學習教程匯總_學無止境的專欄-CSDN博客
ECS的泛泛之談 - 知乎
一種類ECS設計范式的介紹 鏈接: https://pan.baidu.com/s/1hH3YwgPvB9m39_e3HzlAcA 提取碼: 5wwm??
總結
以上是生活随笔為你收集整理的Unity项目技术方案Dots架构方案简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python获取股票的市盈率_怎样查找股
- 下一篇: 如何使用TestFlight进行Beta