SlideShare a Scribd company logo
Component based
game engine design
@DADA246
自己紹介
• ゲームプログラマやってます
• 低レベルから GPU,web,DB まで幅広く書いて
ます
• Steam,Origin,iPad で海外ゲームを遊んでいま
す
• Starcraft2 hots 楽しいですね
はじめに
• 今回の話は 1999 ~ 2003 年付近で議論さ
れていたものです
• 特に新しい話ではありません
• ゲームごとに最適な設計は異なるので、
今回の話が正しい設計ということではあ
りません
stackoverflow
• http://
stackoverflow.com/questions/1901251/componen
「コンポーネント主体のゲームプログラム
について情報を教えてほしい」
→ コンポーネント関係のリンク集になって
いる
Entity
• プレイヤーや敵などを表現する
• Game Object とも呼ばれる
class Entity
{
public:
void Update(float time);
void Render();
}
継承
• 継承で Entity を構築した場合
継承問題
• 継承はハードコーディングなので、変化に
弱い
• FPS にて、ゲームデザイナーから
「弾を操作したい」と言われたら?
例: Unreal Tournament
Redeemer
→ 撃った弾を操作出来る
継承の追加
• 弾を操作したいため、弾クラスを継承し
て「操作可能な弾クラス」を作る
→Player クラスと似たクラスが出来てしまう
→ 継承をコーディング
しなければならない
→ コンパイルも必要
継承問題
• ゲーム開発には試行錯誤が必要
→ 開発が終盤になるほど継承関係を変更す
る手間が増える
• Entity の種類が増えると基底クラスの機能
が肥大化する
has-a
• 継承を避ける
→is-a ではなく、 has-a にする
コンポーネント
• コンポーネントを基底クラスとする
Entity
• Entity はユニークな ID とコンポーネント
のリストを持つ
→ ユニークな ID はコンポーネント管理クラ
スからコンポーネントを参照するときに
使う
class Entity
{
private:
int32_t id;
std::list<component*> componentList;
}
Entity の構築
• コンパイル時ではなく、実行時に Entity の
種類が決まる
auto pPlayer = new Entity();
pPlayer->RegisterComponent(new Human());
pPlayer->RegisterComponent(new Player());
Data Driven
• Entity の構築はコードに書かなくても良い
<Entity>
<Name>Player</Name>
<Component>Human</Component>
<Component>Player</Component>
</Entity>
{
“Name”:”Player”,
“Component”:[“Human”,”Player”]
}
ゲームエディタ
• ゲームエディタの入力から Entity を構築す
る
→ ゲームデザイナが Entity を構築できる
→ コンポーネントの組み合わせで多様な
Entity を生成出来る
コンポーネントの種類
• 更新処理や描画処理もコンポーネントと
して抽象化出来る
コンポーネントの例
• Input( コントローラー入力 )
• Updatable
• Renderable
• Physics
• Collision
• Motion
• Actor
• Audio
• Network
• AI
• Health( 体力 )
…
コンポーネントの組み合わせ
• 賑やかしのための NPC
→Collision を外して軽量化する
• 壁
→Updatable を外して軽量化する
• 音の発生地点
→Renderable を外して描画させない
LOD
• コンポーネントを動的に付け外しすると
、処理負荷を下げられる
例:カメラから遠い NPC はアニメーション
しない
pNPC->RegisterComponent(COMPONENT_MOTION );
pNPC->UnRegisterComponent(COMPONENT_MOTION );
更新頻度の変更
• 数フレームごとに実行される Updatable を
作ると、処理負荷を下げられる
例:ドアは 15 フレームに一度しか更新しな
い
auto pDoor = new Entity();
pDoor ->RegisterComponent(new DefferedUpdatable() );
更新処理
• 継承ベースの設計でよく見かける処理
→ 全 Entity の Update を呼ぶ
更新処理
• Entity を処理するのではなく、登録されて
いるコンポーネントを処理する
→ 全 Entity を検索する必要がなくなる
Messaging
• Update 処理を抽象化してしまったら、何
を呼べば良い?
→ コンポーネントに対してメッセージを投
げる
→ 処理負荷は掛かるが、ポインタよりも疎
結合に出来る
class Component
{
private:
Entity* pOwnerEntity;
public:
virtual void HandleMessage(const Message& message);
}
Messaging
• メッセージに対する処理を書いていく
void PlayerComponent::HandleMessage(const Message& message)
{
switch(message.GetType() )
{
defalut:
break;
case CREATED:
// コンポーネント生成時の処理
break;
case JUMP:
// ジャンプ時の処理
break;
case GAME_OVER:
// ゲームオーバー時の処理
break;
}
}
Messaging
• メッセージはコンポーネント間のやりと
りにも使える
void PlayerComponent::HandleMessage(const Message& message)
{
…
//Entity のユニーク ID を指定してメッセージを発行
PostMessage(enemyEntityId,new Message(DAMAGE) );
// 全 Entity にメッセージを発行
BroadcastMessage(new Message(SAVE) );
…
}
実装例
• コンポーネントはあくまでも設計論なの
で、様々な実装例がある
実装例
• Entity にコンポーネントのリストを持たせ
るパターン
→ 純粋なコンポーネント実装
class Entity
{
public:
void RegisterComponent(Component* pComponent);
void GetComponent(std::list<Component*> pComponentList);
}
実装例
• 処理速度を上げるために、 Update と
Render はコンポーネントにしないパター
ン
→ コンポーネント化は設計論の一つなので
、ゲームごとに最適解は異なるclass Entity
{
public:
void Update(float time);
void Render();
void RegisterComponent(Component* pComponent);
void GetComponent(std::list<Component*> pComponentList);
}
実装例
• コンポーネントを継承させていくパター
ン
→ コントローラー入力の代わりに自動テス
ト用ダミー入力を使うなど
実装例
• コンポーネントは C++ で書かれていなくて
も良い
→Entity の一部をゲームデザイナーが書く
懸念点
• メッセージを多用すると、ポインタアクセス
に比べて処理速度が落ちる
→ 入力処理など、処理速度が遅くても良い箇所
に限定してメッセージを使用する
• データドリブンの場合、コンパイラを通せな
いので、エラーが見つかりにくい
→ デバッグ機能を強化する
• Generic なプログラムを求められる
まとめ
• Entity を継承ではなく、 has-a にしてコン
ポーネント化する設計もある
• ゲームタイトルごとにデザイン、対象プ
ラットフォーム、開発規模が違うので、
コンポーネント化が常に正しいとは限ら
ない
設計手法の一つとして考慮するのも面白い
と思います
参考文献
• A Data Driven Game Object System(GDC 2002)
• Theory and Practice of Game Object Component Architecture
(GDC Canada 2009)
• Game Engine Architecture
• Game Programming Gems 4: A System for Managing Game
Entities
• Game Programming Gems 5: Component Based Object
Management
• Game Programming Gems 5: A Generic Component Library
• Game Programming Gems 6: Game Object Component System
• MSDN XNA Programming Guide “Application Model Overview”
Question?
ご清聴ありがとうございました

More Related Content

What's hot (20)

shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
DADA246
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
 
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングなぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリング
Satoshi Kodaira
 
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてカスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
Genya Murakami
 
Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
torisoup
 
Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編
Unity Technologies Japan K.K.
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
murachue
 
UE4とUnrealC++について
UE4とUnrealC++についてUE4とUnrealC++について
UE4とUnrealC++について
Masahiko Nakamura
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
masayoshi takahashi
 
UE4 LODs for Optimization -Beginner-
UE4 LODs for Optimization -Beginner-UE4 LODs for Optimization -Beginner-
UE4 LODs for Optimization -Beginner-
com044
 
Deflate
DeflateDeflate
Deflate
7shi
 
Observableで非同期処理
Observableで非同期処理Observableで非同期処理
Observableで非同期処理
torisoup
 
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
UnityTechnologiesJapan002
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
Masahito Zembutsu
 
60fpsアクションを実現する秘訣を伝授 解析編
60fpsアクションを実現する秘訣を伝授 解析編60fpsアクションを実現する秘訣を伝授 解析編
60fpsアクションを実現する秘訣を伝授 解析編
エピック・ゲームズ・ジャパン Epic Games Japan
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
Yuta Imai
 
目grepのはなし
目grepのはなし目grepのはなし
目grepのはなし
祥之 山根
 
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
DADA246
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
 
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングなぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリング
Satoshi Kodaira
 
カスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについてカスタムメモリマネージャと高速なメモリアロケータについて
カスタムメモリマネージャと高速なメモリアロケータについて
alwei
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
Genya Murakami
 
Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
torisoup
 
Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編
Unity Technologies Japan K.K.
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
murachue
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
masayoshi takahashi
 
UE4 LODs for Optimization -Beginner-
UE4 LODs for Optimization -Beginner-UE4 LODs for Optimization -Beginner-
UE4 LODs for Optimization -Beginner-
com044
 
Deflate
DeflateDeflate
Deflate
7shi
 
Observableで非同期処理
Observableで非同期処理Observableで非同期処理
Observableで非同期処理
torisoup
 
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
UnityTechnologiesJapan002
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
Yuta Imai
 

Similar to Component basedgameenginedesign (20)

Entity Component System
Entity Component SystemEntity Component System
Entity Component System
nyarllcreative
 
ブロックバスター制作資料
ブロックバスター制作資料ブロックバスター制作資料
ブロックバスター制作資料
MaxNeetGames
 
CODE FES 2017 講演資料
CODE FES 2017 講演資料CODE FES 2017 講演資料
CODE FES 2017 講演資料
Youichiro Miyake
 
Doom3 commentary
Doom3 commentaryDoom3 commentary
Doom3 commentary
DADA246
 
横浜国立大学PCサークルSCITEXの活動 in SGF2012
横浜国立大学PCサークルSCITEXの活動 in SGF2012横浜国立大学PCサークルSCITEXの活動 in SGF2012
横浜国立大学PCサークルSCITEXの活動 in SGF2012
Tomoki Suzuki
 
Builderscon 2016 講演資料 「人工知能によってプログラムを有機化する」(前篇)
Builderscon 2016 講演資料 「人工知能によってプログラムを有機化する」(前篇)Builderscon 2016 講演資料 「人工知能によってプログラムを有機化する」(前篇)
Builderscon 2016 講演資料 「人工知能によってプログラムを有機化する」(前篇)
Youichiro Miyake
 
猫でもわかるUnreal Engine4
猫でもわかるUnreal Engine4猫でもわかるUnreal Engine4
猫でもわかるUnreal Engine4
pafuhana 1213
 
とことんF#よぷよ! F# + XNA ゲームプログラミング入門
とことんF#よぷよ!  F# + XNA ゲームプログラミング入門とことんF#よぷよ!  F# + XNA ゲームプログラミング入門
とことんF#よぷよ! F# + XNA ゲームプログラミング入門
zecl1231
 
ゲームオブジェクトの管理
ゲームオブジェクトの管理ゲームオブジェクトの管理
ゲームオブジェクトの管理
Shota Homma
 
インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編
Yoshitaka Kimisaki
 
Unity勉強会ハンズオン
Unity勉強会ハンズオンUnity勉強会ハンズオン
Unity勉強会ハンズオン
Kodai Yano
 
基本&ヒント
基本&ヒント基本&ヒント
基本&ヒント
Keigo Ando
 
TECSの基礎(ETロボコン向けTOPPERS活用セミナー2-1)
TECSの基礎(ETロボコン向けTOPPERS活用セミナー2-1)TECSの基礎(ETロボコン向けTOPPERS活用セミナー2-1)
TECSの基礎(ETロボコン向けTOPPERS活用セミナー2-1)
Takuya Azumi
 
XNAとはなにか?XNAうれしいところ、うれしくないところ
XNAとはなにか?XNAうれしいところ、うれしくないところXNAとはなにか?XNAうれしいところ、うれしくないところ
XNAとはなにか?XNAうれしいところ、うれしくないところ
IGDA Japan
 
Ai-Lug(Aizu.LT×つくらぐ)「2.情報大学生ならゲームつくろうぜ!」
Ai-Lug(Aizu.LT×つくらぐ)「2.情報大学生ならゲームつくろうぜ!」Ai-Lug(Aizu.LT×つくらぐ)「2.情報大学生ならゲームつくろうぜ!」
Ai-Lug(Aizu.LT×つくらぐ)「2.情報大学生ならゲームつくろうぜ!」
louis 0023
 
ゲームAI製作のためのワークショップ(II)
ゲームAI製作のためのワークショップ(II)ゲームAI製作のためのワークショップ(II)
ゲームAI製作のためのワークショップ(II)
Youichiro Miyake
 
【Unity道場スペシャル 2018幕張】初動を制する!遊んでもらってナンボだぜ!
【Unity道場スペシャル 2018幕張】初動を制する!遊んでもらってナンボだぜ!【Unity道場スペシャル 2018幕張】初動を制する!遊んでもらってナンボだぜ!
【Unity道場スペシャル 2018幕張】初動を制する!遊んでもらってナンボだぜ!
Unity Technologies Japan K.K.
 
実行時のために最適なデータ構造を作成しよう
実行時のために最適なデータ構造を作成しよう実行時のために最適なデータ構造を作成しよう
実行時のために最適なデータ構造を作成しよう
Hiroki Omae
 
Kuug 第1回
Kuug 第1回Kuug 第1回
Kuug 第1回
Shinobu Izumi
 
Entity Component System
Entity Component SystemEntity Component System
Entity Component System
nyarllcreative
 
ブロックバスター制作資料
ブロックバスター制作資料ブロックバスター制作資料
ブロックバスター制作資料
MaxNeetGames
 
CODE FES 2017 講演資料
CODE FES 2017 講演資料CODE FES 2017 講演資料
CODE FES 2017 講演資料
Youichiro Miyake
 
Doom3 commentary
Doom3 commentaryDoom3 commentary
Doom3 commentary
DADA246
 
横浜国立大学PCサークルSCITEXの活動 in SGF2012
横浜国立大学PCサークルSCITEXの活動 in SGF2012横浜国立大学PCサークルSCITEXの活動 in SGF2012
横浜国立大学PCサークルSCITEXの活動 in SGF2012
Tomoki Suzuki
 
Builderscon 2016 講演資料 「人工知能によってプログラムを有機化する」(前篇)
Builderscon 2016 講演資料 「人工知能によってプログラムを有機化する」(前篇)Builderscon 2016 講演資料 「人工知能によってプログラムを有機化する」(前篇)
Builderscon 2016 講演資料 「人工知能によってプログラムを有機化する」(前篇)
Youichiro Miyake
 
猫でもわかるUnreal Engine4
猫でもわかるUnreal Engine4猫でもわかるUnreal Engine4
猫でもわかるUnreal Engine4
pafuhana 1213
 
とことんF#よぷよ! F# + XNA ゲームプログラミング入門
とことんF#よぷよ!  F# + XNA ゲームプログラミング入門とことんF#よぷよ!  F# + XNA ゲームプログラミング入門
とことんF#よぷよ! F# + XNA ゲームプログラミング入門
zecl1231
 
ゲームオブジェクトの管理
ゲームオブジェクトの管理ゲームオブジェクトの管理
ゲームオブジェクトの管理
Shota Homma
 
インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編
Yoshitaka Kimisaki
 
Unity勉強会ハンズオン
Unity勉強会ハンズオンUnity勉強会ハンズオン
Unity勉強会ハンズオン
Kodai Yano
 
基本&ヒント
基本&ヒント基本&ヒント
基本&ヒント
Keigo Ando
 
TECSの基礎(ETロボコン向けTOPPERS活用セミナー2-1)
TECSの基礎(ETロボコン向けTOPPERS活用セミナー2-1)TECSの基礎(ETロボコン向けTOPPERS活用セミナー2-1)
TECSの基礎(ETロボコン向けTOPPERS活用セミナー2-1)
Takuya Azumi
 
XNAとはなにか?XNAうれしいところ、うれしくないところ
XNAとはなにか?XNAうれしいところ、うれしくないところXNAとはなにか?XNAうれしいところ、うれしくないところ
XNAとはなにか?XNAうれしいところ、うれしくないところ
IGDA Japan
 
Ai-Lug(Aizu.LT×つくらぐ)「2.情報大学生ならゲームつくろうぜ!」
Ai-Lug(Aizu.LT×つくらぐ)「2.情報大学生ならゲームつくろうぜ!」Ai-Lug(Aizu.LT×つくらぐ)「2.情報大学生ならゲームつくろうぜ!」
Ai-Lug(Aizu.LT×つくらぐ)「2.情報大学生ならゲームつくろうぜ!」
louis 0023
 
ゲームAI製作のためのワークショップ(II)
ゲームAI製作のためのワークショップ(II)ゲームAI製作のためのワークショップ(II)
ゲームAI製作のためのワークショップ(II)
Youichiro Miyake
 
【Unity道場スペシャル 2018幕張】初動を制する!遊んでもらってナンボだぜ!
【Unity道場スペシャル 2018幕張】初動を制する!遊んでもらってナンボだぜ!【Unity道場スペシャル 2018幕張】初動を制する!遊んでもらってナンボだぜ!
【Unity道場スペシャル 2018幕張】初動を制する!遊んでもらってナンボだぜ!
Unity Technologies Japan K.K.
 
実行時のために最適なデータ構造を作成しよう
実行時のために最適なデータ構造を作成しよう実行時のために最適なデータ構造を作成しよう
実行時のために最適なデータ構造を作成しよう
Hiroki Omae
 
Ad

Component basedgameenginedesign