ECS
Entity、Component、System
- Entity
- Component
- System
模塊解耦
守望先鋒 https://gameinstitute.qq.com/community/detail/114516
從描述的狀態 Component 上,不同的觀察者會看見不同的行為,拆分不同System出來分別實作,
記憶體連續
通過合理組織資料利用 CPU 的快取機制來加快記憶體訪問資料,
舉個例子,當在 Unity 中實時更新若干個 Monster 和 Player 的坐標時,往往是在 Update 中實作 transform.position = new Vector(1,2,3),即需要加載資料是 Position,但是卻把整個 Transform 資料加載進記憶體,更高幾率造成 Cache Miss;此外,對應 Monster 和 Player 的 Update 生命周期更是不可控,導致加載的資料不久后就失效,一定概率造成 Cache Miss,
上面例子中對資料的處理方式對 Cache 不友好,也對 CPU 訪問記憶體的時間區域性不友好,


Entitas
Component
-
Unity Component 包括資料和行為,
-
ECS Component 單純包括資料,



System
Entitas 中的 System 等價于方法,

System 存在以下四種型別:
| System 型別 | 實作功能 | Unity 相似函式 |
|---|---|---|
| Initialize System | 初始化功能 | Unity Awake |
| IExecute System | 每幀更新功能 | Unity Update |
| Reactive System | 觸發式更新功能 | Unity OnCollider 等 |
| TearDown System | 析構功能 | Unity OnDestory |
其中 Reactive System 比較特別,主要實作是通過 Group + Collector 組成,通過監聽特定 Component 來處理對應的 Entity,并且在之后清除對應的 Entity,避免需要每幀處理大量資料,

Entitas 跟 Unity 互動
Unity 通過腳本構建對應的 Entity,并添加對應的 Entity Component 來傳遞訊息,經過 Entitas 處理資料后通過監聽函式回傳 Unity,



錄像回放機制
由于 Entitas 本身是嚴格時序控制,呼叫方在保證浮點數誤差,亂數等一致的情況下,對于同一個輸入源,其輸出結果也是一致的,
因此記錄輸入源即可模擬整個運算程序,有些類似魔獸爭霸3的錄像機制,

性能

通過圖片可以看出,Entitas 在性能上要優于 Unity,
- reactive 標簽表示通過開啟 Reactive System 處理,
- non reactive 標簽表示不通過 Reactive System 處理,
- Job System 標簽表示通過開始執行緒處理,
關閉 Reactive System
Entitas 中如果某個 Component 通過 ReplaceXXX 函式賦值,則 Reactive System 會收集到對應的 Entity,如果通過 XXX 直接賦值,則 Reactive System 不會收集到對應的 Entity,從而節省 CPU 處理消耗,但是在實際應用中,不會專門繞開 Reactive System,
物件池
Entitas 通過盡可能復用所有物件來提高性能,減少記憶體分配時間和碎片,
- 復用 Entity
- 復用 Component
- 索引 Components
- 索引 ComponentValue( EntityIndex )
- 復用 Groups
ECS 撰寫模式為在 System 中處理一批相同 Component 型別的 Entity,導致每次處理某個特定值時,需要檢查全部相同型別 Component 的 Entity,因此引入 EntityIndex 以高效地定位擁有某個具體 Component 值的 Entity,
Job System
Entitas Job System 跟 Unity Job System 實作方式不一致,其中Entitas Job System 是通過手動開辟新的 Thread,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/14618.html
標籤:其他
下一篇:日本IT派遣狀況(東京)
