Updated at: 2015-09-06
Component 指向のフレームワークを考える
Updated at: 2015-09-06
とりあえずこんなの作った
- 2D と 3D の View を同時に扱うテスト
- 1 つの Stage3D インスタンスで Starling / Away3D / Starling の描画レイヤーを扱う
Play Demo (HD)
- こういうのをスマートに書きたい
- Entity に対して 2D の見た目が必要なら 2DView を、 3D なら 3DView を attach する感じで、見た目に関係なく同等に扱いたい
krewFramework の反省点
前に作った Actor モデルのフレームワーク krewFramework について
よいところ
- オブジェクト主体の考え方は人間にはわかりやすい
- 各機能や部品を Actor とそのメッセージングで提供することで、共通のインタフェースで扱える
- 必要ない Actor は使わなければいいだけなのでフレームワークレイヤーが太らない
- 便利メソッドを Actor に詰め込むことで、コーディングが手軽に
- Scene に必要なリソースを宣言的に書ける
改善点
- 便利メソッドを Actor に詰め込みたくなるので、よくある ベースクラスでかくなる問題 が起こる
- 最小の構成要素はもっと小さくしたい(メモリ的にも)
- 割り切りのつもりだったが、Actor が Starling の Sprite だったのはよくない設計だった
- View を持つ必要が無い Actor はいっぱいいる
- 3D も同じように扱いたい、と思っても無理
- 単純な Collision システムを組み込んでいたが、他の物理エンジン使いたくなったときに無駄な存在になる
- エンジンに対して、システム単位でも足し引きができるようにすると柔軟性が上がる
- Pooling しにくい
- 後付けでちょっと仕組みを足したが、最初から考えておくべきだった
- オブジェクト生まれては消えるゲーム作るときに new 減らすのはやっぱり必須
ECS にすべきか
Entity-Component System おさらい
- 通称 ECS
- ゲームのソフトウェア設計では昔からあるやり方のひとつ
- 日本だとあまり聞かないけど英語でググるとたくさん出てくる
- 書籍「ゲームエンジン・アーキテクチャ」では 15 章で言及されてる
- オブジェクト主体の見方に対して、データ(プロパティ)主体の見方
- OOP に対して Data-Oriented な考え方
- 純粋なコンポーネントモデルまで行くと、ゲームの Entity は Component(ほぼ Value Object)
のコンテナでしかない感じ
- Entity を走査するのではなく、各 Component を扱う System 達が Component を走査する
- 処理をオブジェクトではなく、システムに書く。横断的な視点
- OOP におけるカプセル化は破壊することを受け入れる
- Unity は Component 指向だが純粋な ECS ではない
Pros
- メモリ効率を上げやすい(メモリ上で物理的に近くに並ぶデータ型を走査するので)
- Component の部分を Pooling しやすい
- でかい継承構造(blob アンチパターン)を避けられる
- うまくやれば Component の組み合わせで柔軟な表現ができる
Cons
- うまくやらないといけない
- 人間に分かりやすい OOP からのパラダイムシフトが要る
- チームで導入するには 2015 年現在では抵抗ありそう(関数型と似てる)
- 個人的には、中規模以上のものを作る時に System のレイヤーが見通しよいままでいられるのかが懐疑的
参考リンク
継承よりコンポジションという話
- Composition over inheritance - Wikipedia, the free encyclopedia
- クラスの「継承」より「合成」がよい理由とは?ゲーム開発におけるコードのフレキシビリティと可読性の向上 | プログラミング | POSTD
- Component · Decoupling Patterns · Game Programming Patterns
ECS 関連
- エンティティ・コンポーネント・システム - Wikipedia
- 階層構造を進化させる
- What is an entity system framework for game development? | Richard Lord
- Why use an entity system framework for game development? | Richard Lord
- Avoiding the Blob Antipattern: A Pragmatic Approach to Entity Composition - Tuts+ Game Development Tutorial
- データ指向設計 (または何故OOPで自爆してしまうのか) - 雑記帳
- Entity/Component Game Design That Works: The Artemis Framework | Piemaster.net
- Games And Entity Systems | Shaun Smith
- ゲーム パフォーマンス: データ指向プログラミング - Google Developer Japan Blog
- Component basedgameenginedesign
- Entity Systems in game development | rokatainment
- Overview of Entity Component System (ECS) variations with pseudo-code
- Entity Component System framework, redux | IceFall Games
僕の方針
- 純粋なコンポーネントモデルにはしない
- 「空の Entity に Component アタッチする感」は出す
- 大衆向けのやり方として、Component に処理は書いちゃう(純粋な Value Object にはしない)
- Actor に書いてたようなことは Script Component に書く(Unity のノリ)
- Component が Entity から別の Component 取得する、みたいなのは許す
- Tween Component が Position Component 取得して状態書き換えるとか
- Component ごとの処理の順番はエンジンへの System 登録時に定義
- ここはエンジンのユーザが干渉できるようにする
- 究極、別のライブラリ使いたくなったらその System だけ差し変えられるように
- Component は Pooling したい(new 減らしたい)
Unity でいいのでは
- 再開発は趣味プログラミングならではの贅沢
- あとはまあ勉強目的
このご時勢に AS3 ですか
- 案外オープンソースのソフトウェア資産あるし
- Haxe + OpenFL とかちょっと考えたけど iOS / Android 真面目に考えるとまだ整ってない