エンジンのアーキテクチャ
メインループ、EngineContext、オブジェクトの所有権、各システムの関係をたどります。
このページの内容
入力からフレームまで
main() は Engine を構築し、ウィンドウが開いている間、3 つの処理を繰り返します。次は基準コードからの抜粋です。
while (engine.IsRunning()) {
engine.ProcessEvent();
engine.Update();
if (!engine.HasFocus()) {
sf::sleep(sf::milliseconds(10));
continue;
}
engine.Render();
}
フォーカスがないときもイベント処理とクロックの更新は続きますが、描画は省略され、10 ms 待機します。Engine::Update もシーンを進める前にフォーカスを確認します。
Engine の責務
Engine はウィンドウ、EngineContext、シーンの登録表、アクティブなシーンへの参照、一時停止オーバーレイを所有し、これらの要素を調整します。
Engine
├── sf::RenderWindow
├── EngineContext
│ ├── renderer · resources · particles
│ ├── input · cursor · gui
│ ├── audio · time · random
│ └── scenes · save · screenshot · clipboard
├── SceneFactory::Scenes
│ └── 名前 → unique_ptr<Scene>
├── currentScene → アクティブな Scene
└── Overlay → TGUI ウィジェット
コンテキストは各シーンに参照で渡されます。ゲームはサービスを重複して構築せずに ctx.renderer、ctx.input、ctx.resources を利用できます。
イベント処理
ProcessEvent の開始時に、エンジンは保留中のシーン変更を処理します。その後、sf::RenderWindow からイベントを取り出し、次のように配信します。
EngineVisitorが終了、フォーカス、サイズ、コントローラー、グローバルショートカットを処理します。GuiManagerがイベントを TGUI に渡します。- オーバーレイが非表示のとき、シーンが
OnEventを受け取ります。 - エンジンがオーバーレイの選択内容を処理し、一時停止状態を同期します。
GUI とシーンは同じ処理フローに参加します。独立したイベントバスは、このリビジョンでは確認されていません。
更新と時間
TimeManager は前フレームからの経過時間を計算し、gConfig.maximumDeltaTime で制限します。その後、カーソルを更新し、オーバーレイが非表示であれば Scene::Update を呼び出します。
固定ステップを積み重ねるアキュムレーターは実装されていません。各ゲームがデルタ時間や独自のタイマーの使い方を決めます。
基準リビジョンでは、各シーンが音声やタイマーを含めた OnPause への応答を実装します。クールダウン用クロックのローカルなリファクタリングは 開発中 とされ、この公開基準 API には含まれていません。
描画とレイヤー
シーンは sf::RenderTexture に描画します。RenderManager はエフェクトチェーンを適用して最終テクスチャを返します。Engine はそれをウィンドウに表示し、その上に GUI とカーソルを描きます。
Scene::Render
↓
RenderManager / RenderTexture
↓
Bloom → Monitor
↓
ウィンドウ → GUI → Cursor → display
エフェクトは sf::Shader::isAvailable() が真を返す場合だけ追加されます。GUI とカーソルはポストプロセスの後に描画されます。Bloom の各パスは描画を参照してください。
所有権とメモリ
- シーンは
unique_ptr<Scene>を値とするunordered_mapに格納されます。 - エフェクトは
unique_ptr<Effect>のベクターに格納されます。 - アクティブなシーンは所有権を持たないポインターです。オブジェクトの所有権は登録表に残ります。
- 各マネージャーは
EngineContextの値メンバーです。 - ResourceManager はマップ内にリソースを値で保持します。
プロジェクトは RAII と標準コンテナーを使用します。独自のメモリマネージャーや汎用 ECS はありません。登録されるシーンはすべて CreateScenes で構築され、シーン遷移のたびに新しいインスタンスを作ることはありません。
コードの構成
| ディレクトリ | 内容 |
|---|---|
Engine/Include |
コア、マネージャー、シーン、エフェクト、ユーティリティの契約と型。 |
Engine/Source |
実装とエントリーポイント。 |
Games/Include |
ゲームクラス、型、設定定数。 |
Games/Source |
ゲームのロジックと描画。 |
Content |
画像、音声、フォント、シェーダー、テーマ、JSON。 |