Unity DOTS 学习笔记1 - ECS 0.50介绍和安装
Unity DOTS 學習筆記1 - ECS 0.50介紹和安裝
為什么學習這個技術
ECS的全稱為Entity Component System,是最早由暴雪在GDC2017上提出的一個新的游戲設計框架,數據和處理上都和目前主流的面向對象OOP有很大的差距。他是面向數據編程(DOD),他的優點也就是缺點,不用繁雜的對象和繼承關系,不是面向對象思想,他是面向數據,以處理符合條件的數據來編程的思想,他的最大優點就是快。
看下圖說明:來源
https://learn.unity.com/tutorial/part-1-understand-data-oriented-design?uv=2020.1&courseId=60132919edbc2a56f9d439c3#
在 OOP 中,代碼遍歷 Sphere 類數組以檢查每個類的顏色并設置綠色類的位置。雖然數組是打包的連續數據,但它只包含對 Sphere 類的引用,實際數據可能分散在整個內存中,導致緩存未命中。在 DOD 中,球體被分解為顏色和位置組件并打包到緩沖區中,從而減少緩存未命中并加快處理速度。
下表是大概的內存和緩存(Cache)速度對比。
ECS原理就是提高Cache命中率,把需要計算的數據全部放入Cache,減少內存和Cache交換數據,達到速度提升。
要成功地使用 DOD,您需要忽略許多 OOP 概念,這些概念似乎絕對是編程的基本方面。忘記封裝和數據隱藏。忘記繼承和多態。在很大程度上,忘記引用類型。這些概念對你沒有幫助。
Unity ECS簡介
從ECS剛開始就開始關注這個技術了,每次版本的升級,總是有代碼的變動,要修改很多代碼,間斷的學習,總是會忘記很多,所以才有了這個學習筆記,也算是一種記錄吧。ECS整體版本現在已經到了0.50.0版本了,所以后面我們的筆記都是基于這個版本。
ECS全稱是 Unity’s Entity Component System (ECS). 也是 Unity Data-Oriented Tech Stack(DOTS)面向數據棧編程的核心。
Entities 實體:填充您的游戲或程序的實體或事物。可以理解為承載Component的載體。
Components 組件:與您的實體相關聯的數據,但由數據本身而非實體組織。這種組織上的差異是面向對象設計和面向數據設計之間的主要區別之一。
Systems 系統:將組件數據從當前狀態轉換為下一個狀態的邏輯。例如,一個系統可能會更新所有移動實體的位置,它們的速度乘以自上一幀以來的時間間隔。
具體的還可以通過這篇文章來了解:
https://learn.unity.com/tutorial/shi-yao-shi-dots-wei-shi-yao-shuo-dotsfei-chang-zhong-yao#
ECS的安裝
升級:老版本的升級注意事項,大家可以參考官方
https://docs.unity3d.com/Packages/com.unity.entities@0.50/manual/upgrade-guide.html
這里不多說明。
ECS需要安裝的包
“com.unity.entities”: “0.50.0-preview.24”,
“com.unity.rendering.hybrid”: “0.50.0-preview.24”,
“com.unity.physics”: “0.50.0-preview.24”,
“com.unity.burst”: “1.7.0”,
“com.unity.collections”: “1.1.0”,
“com.unity.jobs”: “0.50.0-preview.8”,
“com.unity.mathematics”: “1.2.5”,
“com.unity.platforms”: “0.50.0-preview.4”,
默認安裝
com.unity.entities
com.unity.rendering.hybrid
com.unity.physics
這三個包,會自動安裝
“com.unity.collections”: “1.1.0”,
“com.unity.jobs”: “0.50.0-preview.8”,
“com.unity.mathematics”: “1.2.5”,
如果這幾個沒有安裝,請手動安裝。
可以再PackageManager里點擊加號通過git URL安裝,輸入包名就可以了,例如com.unity.entities
常見問題
因為安裝這里遇到了不少問題,所以要講以下:
1,首先要安裝Unity2020.3.30+以上的版本,注意這里的小版本3.30,至少得是3.30,因為新的ECS需要新的Editor支持。否則安裝了ECS后會有報錯。
2,ECS的Hybrid,從0.50開始只支持V2版本了,需要通用渲染管線或者高清渲染管線的支持URP9.0,所以你的項目需要創建選擇一種,或者沒有安裝的話,通過PackageManager后面來安裝,具體如何配置渲染管線,可以參考其他文章,這里不做介紹。
另外Hybrid不支持桌面OpenGL或者GLES。對于Android和Linux,目前只能使用Vulkan。在ProjectSetting的Player的Graphics APIs中進行配置。
另外Color Space改為Linear,不支持gamma,所以在項目設置中要改以下。
在URP的設置中需要勾選Advanced SRP Batcher
具體要求參考下面文檔:
https://docs.unity3d.com/Packages/com.unity.rendering.hybrid@0.50/manual/requirements-and-compatibility.html
https://docs.unity3d.com/Packages/com.unity.rendering.hybrid@0.50/manual/creating-a-new-hybrid-renderer-project.html
3,Build ECS項目,必須安裝com.unity.platforms,不支持通過BuildSetting的Build操作。要構建需要生成構建配置。menu: Assets > Create > Build Configuration > Empty Build Configuration.
以上就是安裝和一些配置的注意事項。
Unity ECS 系統包含了哪些
ECS概念
實體組件系統 (ECS) 架構將身份(實體)、數據(組件)和行為(系統)分開。該架構專注于數據。系統讀取組件數據流,然后將數據從輸入狀態轉換為輸出狀態,然后實體對其進行索引。
Archetypes 原型
組件類型的唯一組合稱為E??ntityArchetype。例如,一個 3D 對象可能有一個用于其世界變換的組件,一個用于其線性運動,一個用于旋轉,一個用于其視覺表示。這些 3D 對象的每個實例對應于一個實體,但由于它們共享相同的組件集,ECS 將它們分類為單個原型:
在此圖中,實體 A 和 B 共享原型 M,而實體 C 具有原型 N。
為了平滑地更改實體的原型,您可以在運行時添加或刪除組件。例如,如果您Renderer從實體 B 中移除組件,則它會移動到原型 N。
你可以通過Window > DOTS > Archetypes.來觀看當前的Archetypes
內存塊 Memory Chunks
實體的原型決定了 ECS 存儲該實體組件的位置。ECS 以“塊”的形式分配內存,每個塊都由一個ArchetypeChunk對象表示。塊總是包含單一原型的實體。當一塊內存變滿時,ECS 會為使用相同原型創建的任何新實體分配一塊新的內存。如果您添加或刪除組件,然后更改實體原型,ECS 會將該實體的組件移動到不同的塊。
這種組織方案在原型和塊之間提供了一對多的關系。這也意味著找到具有給定組件集的所有實體只需要搜索現有的原型,這些原型通常數量很少,而不是所有的實體,它們的數量通常要大得多。
ECS 不會按特定順序存儲塊中的實體。當實體被創建或更改為新原型時,ECS 將其放入存儲原型的第一個塊中,并且該塊具有空間。然而,大塊仍然緊緊地包裹著。當一個實體從原型中移除時,ECS 將塊中最后一個實體的組件移動到組件陣列中新騰出的插槽中。
實體查詢 Entity queries
要確定系統應處理哪些實體,請使用EntityQuery。實體查詢在現有原型中搜索具有符合您要求的組件的原型。您可以使用查詢指定以下組件要求:
All — 原型必須包含All類別中的所有組件類型。
Any — 原型必須至少包含Any類別中的一種組件類型。
None— 原型不得包含無類別中的任何組件類型。
實體查詢提供包含查詢所需組件類型的塊列表。然后,您可以直接使用IJobEntityBatch遍歷這些塊中的組件。
例如下面的查詢:
EntityQuery query = GetEntityQuery(typeof(Rotation),ComponentType.ReadOnly<RotationSpeed>());Job 工作
要利用多線程,您可以使用C# Job system。ECS 提供SystemBase類Entities.ForEach以及IJobEntityBatch Schedule()和ScheduleParallel()方法,用于在主線程外轉換數據。Entities.ForEach是最簡單的使用,通常需要更少的代碼行來實現。您可以將 IJobChunk 用于Entities.ForEach無法處理的更復雜的情況。
ECS按照您的系統排列順序在主線程上安排作業。隨著作業的調度,ECS 會跟蹤哪些作業讀取和寫入哪些組件。讀取組件的作業取決于寫入同一組件的任何先前計劃的作業,反之亦然。作業調度器使用作業依賴關系來確定哪些作業可以并行運行,哪些必須按順序運行。
System organization 系統組織
ECS 按World組織系統,然后按group組織系統。默認情況下,ECS 會創建一個包含一組預定義組的默認 World。它找到所有可用的系統,實例化它們,并將它們添加到默認 World 中的預定義模擬組中。
您可以指定同一組內系統的更新順序。組是一種系統,因此您可以像任何其他系統一樣將組添加到另一個組并指定其順序。組內的所有系統在下一個系統或組之前更新。如果您不指定順序,ECS 會以不依賴于創建順序的確定方式將系統插入到更新順序中。換句話說,即使您沒有明確指定順序,同一組系統在其組內也始終以相同的順序更新。
系統更新發生在主線程上。但是,系統可以使用作業將工作卸載到其他線程。SystemBase提供了一種直接的方式來創建和調度作業。
有關系統創建、更新順序以及可用于組織系統的屬性的更多信息,請參閱系統更新順序文檔。
下面的圖大概就可以看出World和Group的關系,可以通過Window > Analysis> Entity Debuger開啟。
ECS authoring 創作
當您在 Unity 編輯器中創建游戲或應用程序時,您可以使用 GameObjects 和 MonoBehaviours 創建一個轉換系統,將這些 UnityEngine 對象和組件映射到實體。
經是通過傳統的Unity對象經過轉換系統,進行變換成ECS系統可以識別的對象。
后面再具體介紹。
總結
以上是生活随笔為你收集整理的Unity DOTS 学习笔记1 - ECS 0.50介绍和安装的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab angle函数
- 下一篇: 阿古斯机器人_新卡评测 地精大战侏儒资料