在幻奏的ECS系統設計裡…
獨立遊戲<幻奏> ECS篇
ObjectHandlerSystem
-
在幻奏的ECS系統設計裡,ObjectHandler的設計是把entity也模擬成一個物件,每個種類的物件例如子彈A、子彈B對應一種ObjectHandler,這樣在跑System時就可以直接去找屬於該物件ID的Handler去執行Handler裡該執行的方法,所以是類OOP的作法。
-
為何選擇這樣子設計,正統的ECS應該是設計一堆的System,例如專門負責飛行,專門負責子彈,專門負責腳色。但是這樣設計System量非常的多,且不易維護,所以參照OOP的設計方法可以把繼承抽象引入,設計ObjectHandler,在system時只跑ObjectHandler的接口。
-
有著OOP的優點也就有著OOP的缺點,因為模擬OOP所以幾乎全物件都有ObjectHandler,而system在找entity時是隨機的所以再迴圈裡調用ObjectHandler時會重複占用記憶體。

1 | foreach (var (stateMachine, buffer, handler, entity) in SystemAPI.Query<RefRW<State_StateMachine>, RefRW<State_Buffer>, RefRO<Object_Handler>>().WithEntityAccess()) |
解法
- 先依照分類進行併行排序,排完敘後就可依照ID執行ObjectHandler。
- 假如整個世界有一隻role與50顆bullet_01與49顆bullet_02這樣原本要做100次的快取變成只要三次就行了。

1 | Dictionary<int,List<Entity>> buffer = new(); |