Entity Component System

Overview

ECS はインメモリデータベースのように(かんが) えることができます。
  • Entity: コンポーネントを() ける一意(いちい) の ID(Rust u32
  • Component: ゲーム(ない) のデータ(Rust Structs)
  • System: データに作用(さよう) する関数(かんすう) (Rust Functions)

Performance

  • キャッシュフレンドリー
  • 並列性(へいれつせい)

Usability

  • ゲーム開発(かいはつ) では OOP より(すぐ) れています

コードの複雑性(ふくざつせい)() すにつれて、ゲームに柔軟性(じゅうなんせい)並列性(へいれつせい)(あた) えます。

  flowchart TB
    SS[SpaceShip]
    C[Cat]
    Vl([Velocity])
    P([Position])
    Fl([Fuel])

    SS ----> Vl
    SS ----> P
    SS ----> Fl

    C ----> Vl
    C ----> P
    C ----> Fl

Storage

SQL Table vs. Entity Component Layout Table

ECS Layout Table

Commands

Commands は、エンティティのスポーン、デスポーン、コンポーネントの追加(ついか) などのタスクを容易(ようい) にする、安全(あんぜん)効率的(こうりつてき)遅延(ちえん) 方式(ほうしき) でゲームの状態(じょうたい)変更(へんこう) する方法(ほうほう)提供(ていきょう) します。
  • エンティティのスポーン/デスポーンや既存(きそん) エンティティへのコンポーネントの追加(ついか) /削除(さくじょ) アクションをキューに() れます。
  • 即座(そくざ) には反映(はんえい) されず、キュー(ない) のコマンドは World を変更(へんこう) しても安全(あんぜん) なときに自動的(じどうてき)適用(てきよう) されます。
  • World への排他的(はいたてき) アクセスが必要(ひつよう) で、並列(へいれつ)適用(てきよう) することはできません。
  • データベースでの INSERT または DELETE 操作(そうさ)() ています。

Spawning Entities

commands.spawn((
    Position { x: 0.0, y: 0.0 },
    Velocity { x: 1.0, y: 1.0 }
));

Queries

Queries は既存(きそん) のコンポーネントへの即時(そくじ) アクセスを提供(ていきょう) し、ECS アーキテクチャ(ない) でのデータの取得(しゅとく)変更(へんこう)可能(かのう) にします。
  • Bevy の ECS に保存(ほぞん) されているコンポーネントに直接(ちょくせつ) アクセスして()() きできます。
  • 2 つのシステムが(おな) じコンポーネントタイプをクエリし、(すく) なくとも 1 つのアクセスが mutable でない(かぎ) り、並列(へいれつ)実行(じっこう) できます。
  • データベースでの SELECT または UPDATE 操作(そうさ)() ています。

Querying Components

Bevy は自動的(じどうてき) にパラメータを注入(ちゅうにゅう) します:

fn update_position(mut query: Query<(&Velocity, &mut Position)>) {
    // ...
}

Related

  • Bevy - ECS を使用(しよう) する Rust ゲームエンジン
  • Godot - オープンソースゲームエンジン