1. 程式人生 > >遊戲開發架構 ECS Model 學習筆記

遊戲開發架構 ECS Model 學習筆記

ECS是Entity-Component-System的縮寫,Wiki:Entity-Component-System,ECS模型遵循Composition over inheritance的原則。這是守望先鋒程式團隊在GDC上的ECS架構與網路同步分享以及知乎關於OW的ECS架構以及ECS模型本身的討論,關於遊戲架構設計上使用ECS的好處以及ECS模型相對於傳統OOP的優越性在上述文章中都可以找到,以下是個人的學習筆記。

  • Entity : 無資料無邏輯,單純是一個例項,擁有若干Component
  • Component:只有資料沒有邏輯,可以被Entity動態新增和移除
  • System:只有邏輯,只關心Component不關心Entity
  • World:快取所有Entity與Component,並對System進行輪詢,負責整個系統的運轉

簡單的例子:

Entity

// AddComponent的功能是在world中建立Component並且新增到該EntityComponent集合中。
public Entity bullet = new Entity(_entityID);
bullet.AddComponent<TransformComponent>();
bullet.AddComponent<MoveComponent>();

Component

class TransformComponent
{ Vector3 position; Vector3 rotation; } class MoveComponent { Vector3 speed; }

System

class MoveSystem
{
    public void Update(float time)
    {
        foreach(var movecomponent in movecomponents)
        {
            // 查詢該Entity是否擁有TransformComponent
            var transformcomponent = movecomponent.sibling<TransformComponent>()
            if
(transformcomponent != null) transformcomponent.position += movecomponent.speed * time; } } }
  • ECS 模型的結構是非常簡潔明晰的,而且由於Component 中只有狀態沒有邏輯,可以很大的提高 Component 的複用度,以及同類 Component 在記憶體中是連續分佈的,可以很大的提高快取命中率(關於這點還在想該如何設計資料結構才能達到目的)

  • 對於System需要使用的(整個 world 中唯一的)狀態,遵循 System 中無狀態的原則,使用 SingletonComponent 的方式去實現(參考 OW ECS 架構中的 SingletonComponent 部分)

  • 將共享的 System 函式分解成 Utility ,減少呼叫,整合呼叫點

  • 延遲執行(Deferment)的使用,即先快取需要執行的狀態,在更好的時間點集中呼叫(這點有很廣泛的應用價值)