はじめに#
この専門コラムの内容は、学堂オンラインの「3D ゲームエンジンアーキテクチャ設計基礎」コースの内容です。個人的には、テキストと画像のバージョンに変換しました(テキストバージョンのチュートリアルの方が読みやすく、読む速度がはるかに速いため)。参考リンク:3D ゲームエンジンアーキテクチャ設計基礎。
メモリ管理とプラグインメカニズム#
メモリ管理と拡張プラグインの概要#
メモリ管理#
メモリ管理はエンジンの下層およびコアの一部であり、エンジン内のほぼすべてのトップレベルの基本クラスはメモリの割り当てクラスです。そのため、メモリ管理はシステムの実行効率を決定します。
エンジンのメモリ管理は、オブジェクトごとに CPU メインメモリと GPU のビデオメモリに分けられます。操作の種類によって、データ構造の割り当てと解放、およびデータアクセスに分けられます。
STL、BOOST などのサードパーティの標準ライブラリは、さまざまなデータ構造のメモリ割り当てと管理を提供しています。これらのライブラリを使用すると、ゲームエンジンの下層設計を簡素化することができます。STL では、データ型をコンテナとして抽象化し、データの組織とアルゴリズムを分離しています。主なコンテナには、シーケンスコンテナ(vector、deque、list など)、関連コンテナ(map、multimap、set、multiset など)、コンテナアダプタ(stack、queue、priority_queue など)があります。
サードパーティのライブラリは、メモリ割り当ての保護メカニズムも提供しており、メモリポインタの誤った使用やメモリリークを防ぐために使用されます。例えば、shared_ptr、weak_ptr、scoped_ptr などがあります。
動的メモリ割り当てとは、使用時にメモリを割り当て、使用しなくなったらメモリを解放することを指しますが、そのオーバーヘッドは非常に大きいため、ゲームエンジンではよくカスタムアロケータを使用して動的メモリ割り当てを行います。以下に例を示します:
拡張性#
エンジンの拡張性の要件:
プラグイン技術:
-
プラグインは独立して開発されたプログラムブロックであり、システムのプラグインインターフェースによって管理されます。
-
プラグインベースのアーキテクチャは、柔軟なコンポーネントベースの構造です。
-
プラグインインターフェースを持つプログラムは、複数のプラグインを動的に呼び出すことができます。プログラムの変更はほとんど必要ありません。
-
利点は、エンジンのコア機能がシンプルで明確であること、プラグイン間の結合度が低く、メンテナンスと修正が容易であること、エンジンが必要に応じてプラグインを選択し、実行効率を向上させることです。
-
プラグインインターフェースの設計原則には、汎用性、互換性、安定性、テスト可能性、保守性が含まれます。
-
プラグイン管理メカニズム:プラグインのスマートな識別、プラグインの動的なインストールまたはアンインストールの判断、自動呼び出し、プラグイン間の通信の管理、プラグインの初期化と設定の管理など。
メモリ管理と拡張プラグインの実装例#
OGRE のメモリ管理と拡張プラグイン#
OGRE のメモリ管理の分類:
OGRE のスマートポインタ SharedPtr:
OGRE の GPU バッファ管理:
OGRE のプラグインの実装メカニズム:
OGRE のプラグインクラス Plugin:
OGRE の plugin.cfg