Contenu connexe
Similaire à 【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~Entity Component System 編~ (20)
Plus de Unity Technologies Japan K.K. (20)
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~Entity Component System 編~
- 9. 背景 (近年の計算機の特徴)
• Memory Cache機構
• core数、スレッド数の増加
• ベクトル演算器の搭載
• タイトなメモリレイアウトになるようコントロールしたい
• マルチスレッド処理したい
• Vectorizationしたい
- 10. 背景 (近年の計算機の特徴)
• Memory Cache機構
• core数、スレッド数の増加
• ベクトル演算器の搭載
• タイトなメモリレイアウトになるようコントロールしたい
• マルチスレッド処理したい
• Vectorizationしたい
• C#で普通にClassをInstanceするとメモリ空間のあちこちにAllocされる
• Instanceへの参照列をIterateするとCache効率が悪い
• GameObject/ MonoBehaviourスタイルも例外ではない
- 14. ECSとはなんぞや
• Entity: 速いGameObject
• Component: MonoBehaviourのデータ部分
• System: MonoBehaviourの振る舞い部分
public struct RotationSpeed : Component
{
public float Speed;
}
public struct Energy : Component
{
public int energy;
}
class EnemyAISystem : System
{
override protected OnUpdate()
{
float deltaTime = Time.deltaTime;
for (各GameObjectに対して)
{
//振る舞い
}
}
}
- 17. Entity(データを複数合わせたもの)
var entity = EntityManager.CreateEntity(); //Entityの生成
EntityManager.AddComponent(entity, new MyComponentData1()); //ComponentDataを追加できる
EntityManager.AddComponent(entity, new MyComponentData2()); //ComponentDataは複数持てる
EntityManager.SetComponent(entity, new MyComponentData2()); //Setもできる
ComponentData
Entity
- 20. public struct RotationSpeed : IComponentData
{
public float Speed;
}
データの記述
• Struct
• Blittable型のみで構成 (C++とC#でメモリ上の表現が同じになる型)
//Dataのみ
- 21. 振る舞いの記述
class RotatorSystem : ComponentSystem
{
struct Group //要求リスト (全ての型を含むEntityがマッチ)
{
public int Length;
public ComponentDataArray<MyRotation> myrotation;
public ComponentDataArray<RotationSpeed> rotationSpeed;
}
[Inject] private Group m_Data; //マッチング結果のArrayが自動設定される
override protected OnUpdate() //1Fに一回呼ばれる
{
float deltaTime = Time.deltaTime;
for (int i = 0; i < m_Data.Length; ++i) //同じindexで同じEntityのComponentを参照できる
{
m_Data.mytrotation[i].Rotation *= Quaternion.AxisAngle(m_Data.rotationSpeed[i].Speed * deltaTime, Vector3.up);
}
}
}
- 22. 振る舞いの記述 • マッチング条件を記述
• [Inject]
• OnUpdate()でマッチング結果を処理する
• Job化するのが常套手段
class RotatorSystem : ComponentSystem
{
struct Group //要求リスト (全ての型を含むEntityがマッチ)
{
public int Length;
public ComponentDataArray<MyRotation> myrotation;
public ComponentDataArray<RotationSpeed> rotationSpeed;
}
[Inject] private Group m_Data; //マッチング結果のArrayが自動設定される
override protected OnUpdate() //1Fに一回呼ばれる
{
float deltaTime = Time.deltaTime;
for (int i = 0; i < m_Data.Length; ++i) //同じindexで同じEntityのComponentを参照できる
{
m_Data.mytrotation[i].Rotation *= Quaternion.AxisAngle(m_Data.rotationSpeed[i].Speed * deltaTime, Vector3.up);
}
}
}
- 25. Chunk Memory
• Entityのインスタンス実体
• 1Chunk Memoryは L1キャッシュ並の大きさ
• 例えばstructのメンバが
• A(4bytes), B(2bytes), C(2bytes)のとき
• 各Memory Chunkは自分のEntityArchTypeを知っており効率よく配置される
- 30. 開発状況
• 絶賛開発中
• 2018.1? (2かも) でexperimental (β機能)
• https://github.com/Unity-Technologies/EntityComponentSystemSamples
• ↑最新状況を知るには当面上記githubが良い
• 色々なAPI方式を試しながら更新されている
• README.md→DocumentにもAPI仕様が書かれ更新されている
• EntityComponentSystemSamples/TwoStickShooter/PureというUnityプロジェ
クトの改造から始めるがお勧め
• このページから落とせるUnityとセットでないと動かないので注意
- 31. 開発状況
• 2018 4月時点
• 色々な仕様の組み合わせを試している状況、細かい仕様は高頻度で変わる
• Β版でフィードバックを集め中
• 作りやすい仕様を選択していく
- 32. 開発状況
• 今後GameObjectと似た感覚で操作できるように整備していく
• Hierarchy window やInspector windowで表示、編集可能に
• Save Scene / Open Scene / Prefabs感覚で使えるように
• さらに Geometry操作、Animation機能、Physicsクエリなどを用意していく...
• つなぎ期間用 Hybrid 方式
• 既存のMonoBehaviourコードをECSに移植するとき用
• GameObjectと同じEntityがOnEnable時に作れたり
• Monobehaviourへのアダプター