Entitas--ECS框架插件

ECS

Entity、Component、System

  • Entity
  • Component
  • System

模塊解耦

守望先鋒 https://gameinstitute.qq.com/community/detail/114516react

從描述的狀態 Component 上,不一樣的觀察者會看見不一樣的行爲,拆分不一樣System出來分別實現。緩存

內存連續

經過合理組織數據利用 CPU 的緩存機制來加快內存訪問數據。ide

舉個例子,當在 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 單純包括數據。3d


System

Entitas 中的 System 等價於方法。component

System 存在如下四種類型:orm

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。

相關文章
相關標籤/搜索