天天看點

ECS、Job和Burst——建立實體

由Unity官方推薦,想要在Unity中做出高性能的遊戲場景,需要用到Unity2018推出的ECS系統,但是現在已經有2019了,ECS依然還是預覽版,這就意味着整個ECS系統還會有很多變化,是以這篇文章僅供參考。

本文翻譯的是官方提供的文檔,并加入自己的一部分了解。

安裝Unity ECS系統

首先,要使用ECS,需要在Unity/Window/Packag Mananger中選取Advanced/Show preview packags。(注意:有些人會無限重新整理無法擷取預覽版的packags,需要設定網絡為自動擷取DNS)然後選擇Entities,選擇Install。

ECS、Job和Burst——建立實體

Enitities已包含Burst和Jobs,有些時候這些不同的包在Package Mnanager中的版本比在Entities中高,是以有需要請自己更新。

另外,如果需要使用Entities建立實體的3D物體,還需要導入Hybrid Renderer包,這個包提供的結構體是渲染3D物體需要用到的,當然也可以自己定義包含渲染所需資料的結構體。按照說明還有LOD相關的東西。

ECS、Job和Burst——建立實體

使用EntityManager建立實體

Entities是實體元件系統體系結構的三個主要元素之一。它們代表了遊戲或程式中的單個“事物”。一個實體既沒有行為也沒有資料;相反,它辨別哪些資料片段屬于一起。 Systems提供行為。 Components存儲資料。

實體本質上是一個ID。您可以将其視為一個超輕量級的GameObject,它甚至在預設情況下沒有名稱。實體ID是穩定的。它們是存儲對另一個元件或實體的引用的唯一穩定方法。

EntityManager管理World中的所有實體。EntityManager維護實體清單,并組織與實體關聯的資料,以獲得最佳性能。

盡管實體沒有類型,但是可以根據與實體關聯的資料元件的類型對實體組進行分類。當您建立實體并向其添加元件時,EntityManager将跟蹤現有實體上元件的獨特組合。這種獨特的組合稱為原型。在向實體添加元件時,EntityManager建立一個EntityArchetype結構體。您可以使用現有的entityprototype建立符合該原型的新實體。您還可以預先建立entityprototype并使用它建立實體。

建立實體的最簡單方法是在Unity編輯器中。您可以設定場景中的GameObjects或者運作時實體化的Prefabs。對于遊戲或程式中更動态的部分,您可以在Job中建立多個實體的生成系統(使用建立多個實體的方法)。最後,您可以使用EntityManager.CreateEntity每次建立一個實體。

使用 EntityManager.CreateEntity 函數可以建立實體。所有使用建立的實體與EntityManager在同一個世界中。

您可以通過以下方式逐一建立實體:

  • 使用ComponentType對象數組建立帶有元件的實體。
  • 使用EntityArchetype建立包含元件的實體。
  • 使用Instantiate複制現有實體,包括其目前資料。
  • 建立沒有元件的實體,然後向其添加元件。(您可以立即添加元件,也可以根據需要添加其他元件。)

您還可以在同一時間建立多個實體:

  • 使用CreateEntity用具有相同原型的新實體填充NativeArray。
  • 使用 Instantiate用現有實體(包括其目前資料)的副本填充NativeArray。
  • 使用CreateChunk顯式建立包含指定數量的實體和給定原型的塊。

建立實體之後,您可以添加或删除元件,當您這樣做時,受影響實體的原型将發生更改,EntityManager必須将更改後的資料移動到新的記憶體塊,并将元件數組壓縮到原始塊中。

對導緻結構更改的實體的更改——即添加或删除元件,更改SharedComponentData的值,以及銷毀實體——不能在Job中執行,因為這會使Job正在處理的資料失效。相反,您可以使用 EntityCommandBuffer添加指令來進行這些類型的更改,它會在Job完成後執行這個緩沖區中的指令。

EntityManager提供了從單個實體以及NativeArray中的所有實體中删除元件的功能。更多資訊,請參見Components 。

疊代具有一組比對元件的所有實體是ECS體系結構的核心。參見通路實體資料。

World

一個World同時擁有一個 EntityManager和ComponentSystems。您可以建立任意多個World對象。通常,您會建立一個模拟世界(simulation 

World

)和呈現或表示世界( rendering or presentation 

World

)。

預設情況下,我們在進入播放模式時建立一個單獨的世界,并用項目中所有可用的ComponentSystem對象填充它,但是您可以禁用預設的世界建立,并通過全局定義用您自己的代碼替換它。

  • Default World creation code (see file: Packages/com.unity.entities/Unity.Entities.Hybrid/Injection/DefaultWorldInitialization.cs)
  • Automatic bootstrap entry point (see file:Packages/com.unity.entities/Unity.Entities.Hybrid/Injection/AutomaticWorldBootstrap.cs)

World可以使用new World(string name)建立出來,但是這樣的World并沒有運作

ECS、Job和Burst——建立實體
ECS、Job和Burst——建立實體

從上圖可以看出,直接New出來的World缺少了很多東西。

有能力的自己去看源碼修改吧。

繼續閱讀