遊戲開發架構 ECS Model 學習筆記
阿新 • • 發佈:2019-01-02
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並且新增到該Entity的Component集合中。
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)的使用,即先快取需要執行的狀態,在更好的時間點集中呼叫(這點有很廣泛的應用價值)