1.ECS現在只剩下純粹ECS(面向數據編程,數據在內存中更緊湊,更容易遍歷,Cache命中更高)(還提供動畫渲染等解決方案)
2.JobSystem多線程處理複雜計算
3.Burst編譯成最合適目標平台的code
三相之力
大佬們來分析分析實戰的優缺點
有哪些已經使用了DOTS技術的團隊也可以隨便說說
最近 DOTS 玩的比較多, 也來湊合幾句. 首先針對高贊回答中的一些言論正一下試聽:
DOTS 是不是專註解決性能問題?
是也不是, 準確來說, 能解決性能問題的技術是 JobSystem 和 Burst, ECS 只是專註於 Unity 應用長期以來缺乏的架構問題, 只不過 ECS 架構所特有的 Data-Orient 特性能更容易地解決 JobSystem 和 Burst 所需良好結構數據的問題.
能接近 Free Performance 的技術是 Burst, 唯一需要做的就是使用新的 Unity.Mathematics 來編寫程序, 當然目前也有不少的限制(比如必須要blittable數據, 不支持 Class等), 同時也會有許多莫名其妙的 Bug (我甚至遇到過運行時內存數據被污染), 因此建議在開發階段可以完全把 Burst 關掉.
Unity 目前在ECS上的動作是希望利用 ECS 的編譯器將 JobSystem 也變為 Free Performance, 比如下面的代碼就已經是 Jobify 過的代碼, 不過用戶可以幾乎無感:
public class MySystem : SystemBase
{
protected override void OnUpdate()
{
Dependency = Entities
.ForEach((Entity entity, int entityInQueryIndex, ref Data data) =&> {
// my logic
}).Schedule(Dependency);
}
}
對比一下沒有 Jobify 的寫法:
public class MySystem : SystemBase
{
protected override void OnUpdate()
{
Entities
.ForEach((Entity entity, int entityInQueryIndex, ref Data data) =&> {
...
}).Run();
}
}
與此同時, 使用 ECS 的另一個好處(或壞處)是, 你之前關於 Unity 專有的許多性能優化知識都沒用了, 什麼 Object Poolling, Instancing, Scene Streaming, Caching Components , GameObject.Find 等等都永遠說再見了.
耦合度變高了,原本實習生或者策劃能幹的活全堆給程序員了?
恰恰相反, 因為面向數據設計的初衷就是為了解耦合, 你見過誰在設計資料庫時出現"耦合度"問題嗎?實際上 ECS 的編碼過程就是設計數據的過程, 用好資料庫的第一第二範式就能設計出相對良好的程序結構, ECS world 里的數據也可以完全和副作用說拜拜.
至於策劃? 可以看看我翻譯的基於 Game Object Conversion 和 SubScene 的 DOTS 開發工作流 你就能明白為何結論也是恰恰相反: DOTS 讓兩者的角色更加清晰分離, 策劃你就別插手代碼了. 什麼? 你還是想改? Visual Scripting 了解一下.
TinyMode為啥和ECS綁定?
很簡單, 因為 H5 運行的環境恰恰是性能低下的 Mobile 平台, 性能這東西就像錢, 錢多就能買多點, 錢少買的少點, 並不是說我需要渲染上百萬個對象才需要性能, 而是到處都需要性能, 這也是為啥 Unity 的口號是 Performance By Default. 而不是 Performance By 高工資程序員.
C# 不如 C++ 高效?
毫無必要的爭論, 說這話的人知道 unsafe 關鍵字嗎? 事實上, 不是 Unity 不在業務層面用Cpp, 而是 Unity 壓根就不想用C++, 因此把整個引擎都逐漸轉向 C# 了, 原有 C++ 的 Runtime Core 會越來越小, 新出的 Package 都是 C# based 的, 為啥? 因為 C# 開發體驗好, Burst 和 JobSystem 又可以直接榨乾 CPU , 兩全其美.
DOTS學起來太難了!
不不不, 一點都不難, 之所以你覺得難, 是因為你沒有轉變過來 Data-Orient Design 的思想, 滿腦子都還是繼承一個 Person 類得到 Woman類, 這完全是兩種處理問題的思路, 腦子轉不過彎來當然覺得難了.
既然 DOTS 這麼牛逼, 為啥還沒普及?
很簡單, DOTS 現階段在完成度上就是接近廢品的殘次品, 我在這裡說到過現階段的DOTS, 粘過來給你們看看.
非常遺憾, 經過了 Unity 長達近三年的宣傳, DOTS到今天完成度依然極低, 基本上處於不可用的狀態, 一款遊戲引擎必不可少的部分可簡單列為下面八個, 接下來我分開說說在 DOTS 技術棧里他們的現狀
- Physics - 3分 物理自然是大部分遊戲都不可或缺的部分, DOTS配套的 Unity Physics 依然處於非常早期的狀態, Authoring 工具幾乎為零, 甚至 Joint 或者 CharacterConroller 都要從 Sample 里找代碼自己挨個兒實現, 由於它提供了一套船新的 API, 開發的過程只能用極難使用來形容, 來看看Trigger 事件的代碼就知道了, 而在使用過程中也是Bug層出, 經常會遇到類似 Mesh Collider Bake錯誤, 而與之同期宣傳的 Havok Physics for Unity 更是奇妙, 在長達半年的時間裡, 只是單純引入 Havok 的便會導致 HDRP 的渲染出問題. 而更進階的布料, 粒子, 地形等也處於幾乎為零的狀態.
- Graphics - 3分 DOTS與之配套的是圖形系統是 HybridRenderer, 不過目前也只支持 Mesh Renderer, 什麼 Particle 啦, Trail 啦, VFX都還沒影兒, 更可惜的是官方現在優先關注於 HDRP 的兼容性(雖然也不怎麼樣), URP或者Built-In Pipeline就基本別想了, 遇到了問題也只能雙手一攤.
- Audio - 0分 Unity目前只開發了底層的 DSP 系統, 上層的 DOTS audio 說了一兩年了連影子都沒有, 完成度接近於零.
- Animation - 0分 Unity Animation 依然處於極早期的開發中, DOTS Sample 展示了一些最最基本的使用, 類似 Animator 這樣的高層方案現在還沒影兒.
- Network - 2分 也是 Unity 吹了兩年的東西, DOTS Sample 中用的 NetCode 只不過把 FPSSample 中的部分代碼挪過去了, 目前版本號 0.0.4, 意思就是太早期了別用.
- UI - 0分 IMGUI, UI Element 和 Unity UI 三個Unity的產品均不支持 DOTS
- AI - 0分 navmesh, ml-agent, ai planner 三個Unity的產品均不支持 DOTS
- Input - 2分 老的 Input System 相對簡單與DOTS沒啥關係, 可新的 Input System 居然也不支持 DOTS, 幸運的是 InputSystem 相對獨立, 嫁接進DOTS並不困難.
所以, 要怪就怪 Unity 的營銷部門, 吹太過了, 步子太大扯到了蛋, 整個社區里瀰漫著這樣的氣氛: