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