守望先鋒 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 訪問內存的時間局部性不友好。性能
Unity Component 包括數據和行爲。線程
ECS Component 單純包括數據。3d
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,避免須要每幀處理大量數據。對象
Unity 經過腳本構建對應的 Entity,並添加對應的 Entity Component 來傳遞消息,通過 Entitas 處理數據後經過監聽函數返回 Unity。
因爲 Entitas 自己是嚴格時序控制,調用方在保證浮點數偏差,隨機數等一致的狀況下,對於同一個輸入源,其輸出結果也是一致的。
所以記錄輸入源便可模擬整個運算過程,有些相似魔獸爭霸3的錄像機制。
經過圖片能夠看出,Entitas 在性能上要優於 Unity。
Entitas 中若是某個 Component 經過 ReplaceXXX 函數賦值,則 Reactive System 會收集到對應的 Entity,若是經過 XXX 直接賦值,則 Reactive System 不會收集到對應的 Entity,從而節省 CPU 處理消耗,可是在實際應用中,不會專門繞開 Reactive System。
Entitas 經過儘量複用全部對象來提升性能,減小內存分配時間和碎片。
ECS 編寫模式爲在 System 中處理一批相同 Component 類型的 Entity,致使每次處理某個特定值時,須要檢查所有相同類型 Component 的 Entity,所以引入 EntityIndex 以高效地定位擁有某個具體 Component 值的 Entity。
Entitas Job System 跟 Unity Job System 實現方式不一致,其中Entitas Job System 是經過手動開闢新的 Thread。