SlideShare a Scribd company logo
1 of 35
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

オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
 
Windowsフォームで大丈夫か?一番良いのを頼む。
Windowsフォームで大丈夫か?一番良いのを頼む。Windowsフォームで大丈夫か?一番良いのを頼む。
Windowsフォームで大丈夫か?一番良いのを頼む。
Yuya Yamaki
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
Shuhei Fujita
 
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
DADA246
 
ゲームエンジンとMVC
ゲームエンジンとMVCゲームエンジンとMVC
ゲームエンジンとMVC
AimingStudy
 

What's hot (20)

オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
 
Windowsフォームで大丈夫か?一番良いのを頼む。
Windowsフォームで大丈夫か?一番良いのを頼む。Windowsフォームで大丈夫か?一番良いのを頼む。
Windowsフォームで大丈夫か?一番良いのを頼む。
 
テストを書こう!!
テストを書こう!!テストを書こう!!
テストを書こう!!
 
あるコンテキストスイッチの話
あるコンテキストスイッチの話あるコンテキストスイッチの話
あるコンテキストスイッチの話
 
UniRx完全に理解した
UniRx完全に理解したUniRx完全に理解した
UniRx完全に理解した
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
 
shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理shared_ptrとゲームプログラミングでのメモリ管理
shared_ptrとゲームプログラミングでのメモリ管理
 
ゲームエンジンとMVC
ゲームエンジンとMVCゲームエンジンとMVC
ゲームエンジンとMVC
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
 
JIRA / Confluence の 必須プラグインはこれだ
JIRA / Confluence の必須プラグインはこれだJIRA / Confluence の必須プラグインはこれだ
JIRA / Confluence の 必須プラグインはこれだ
 
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
[Cloud OnAir] BigQuery の仕組みからベストプラクティスまでのご紹介 2018年9月6日 放送
 
C#や.NET Frameworkがやっていること
C#や.NET FrameworkがやっていることC#や.NET Frameworkがやっていること
C#や.NET Frameworkがやっていること
 
C++の黒魔術
C++の黒魔術C++の黒魔術
C++の黒魔術
 
Unityで始めるバージョン管理 Git LFS 入門編
Unityで始めるバージョン管理 Git LFS 入門編Unityで始めるバージョン管理 Git LFS 入門編
Unityで始めるバージョン管理 Git LFS 入門編
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
MRU : Monobit Reliable UDP ~5G世代のモバイルゲームに最適な通信プロトコルを目指して~
 
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門関数型・オブジェクト指向宗教戦争に疲れたなたに送るGo言語入門
関数型・オブジェクト指向 宗教戦争に疲れたなたに送るGo言語入門
 
Java開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovyJava開発の強力な相棒として今すぐ使えるGroovy
Java開発の強力な相棒として今すぐ使えるGroovy
 
The Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionThe Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnion
 

Similar to Component basedgameenginedesign

Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Yoshifumi Kawai
 
Unity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだことUnity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだこと
Katsutoshi Makino
 

Similar to Component basedgameenginedesign (20)

Azure PlayFab トレーニング資料
Azure PlayFab トレーニング資料Azure PlayFab トレーニング資料
Azure PlayFab トレーニング資料
 
ガールアックス:リアルタイム通信処理の効率的な実装
ガールアックス:リアルタイム通信処理の効率的な実装ガールアックス:リアルタイム通信処理の効率的な実装
ガールアックス:リアルタイム通信処理の効率的な実装
 
Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例Amazon EKS によるスマホゲームのバックエンド運用事例
Amazon EKS によるスマホゲームのバックエンド運用事例
 
Game Development and Automation @ Agile Sapporo 2018 #1
Game Development and Automation @ Agile Sapporo 2018 #1Game Development and Automation @ Agile Sapporo 2018 #1
Game Development and Automation @ Agile Sapporo 2018 #1
 
LEGO MINDSTORMS EV3 API
LEGO MINDSTORMS EV3 APILEGO MINDSTORMS EV3 API
LEGO MINDSTORMS EV3 API
 
DeNAのサーバー"コード"レスアーキテクチャ
DeNAのサーバー"コード"レスアーキテクチャDeNAのサーバー"コード"レスアーキテクチャ
DeNAのサーバー"コード"レスアーキテクチャ
 
大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化大規模ゲーム開発における build 高速化と安定化
大規模ゲーム開発における build 高速化と安定化
 
.NET Core時代のCI/CD
.NET Core時代のCI/CD.NET Core時代のCI/CD
.NET Core時代のCI/CD
 
Docker と ECS と WebSocket で最強のマルチプレイ・ゲームサーバを構築
Docker と ECS と WebSocket で最強のマルチプレイ・ゲームサーバを構築Docker と ECS と WebSocket で最強のマルチプレイ・ゲームサーバを構築
Docker と ECS と WebSocket で最強のマルチプレイ・ゲームサーバを構築
 
Deep-Dive into Scriptable Build Pipeline
Deep-Dive into Scriptable Build PipelineDeep-Dive into Scriptable Build Pipeline
Deep-Dive into Scriptable Build Pipeline
 
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
 
剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術
剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術
剣と魔法のログレス いにしえの女神 〜スマホ時代の MMORPG を支える技術
 
東海GTUG 20110910発表資料
東海GTUG 20110910発表資料東海GTUG 20110910発表資料
東海GTUG 20110910発表資料
 
【GTMF2018TOKYO】ハードウェアの性能を活かす為の、Unityの新しい3つの機能
【GTMF2018TOKYO】ハードウェアの性能を活かす為の、Unityの新しい3つの機能【GTMF2018TOKYO】ハードウェアの性能を活かす為の、Unityの新しい3つの機能
【GTMF2018TOKYO】ハードウェアの性能を活かす為の、Unityの新しい3つの機能
 
Unity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだことUnity * スマートフォン開発で学んだこと
Unity * スマートフォン開発で学んだこと
 
Runtime c++editing
Runtime c++editingRuntime c++editing
Runtime c++editing
 
20150127 jawsug京王線 ec2_config
20150127 jawsug京王線 ec2_config20150127 jawsug京王線 ec2_config
20150127 jawsug京王線 ec2_config
 
TensorFlow Lite Delegateとは?
TensorFlow Lite Delegateとは?TensorFlow Lite Delegateとは?
TensorFlow Lite Delegateとは?
 
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
 
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作るGoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
 

Component basedgameenginedesign