6

私のゲーム ベースは、クラスとして編成された一連のモジュールで構成されており、これらは必要に応じて作成、更新、および対話します。

CWindowManager、、、CGraphicsManagerなどの例がいくつかありCPhysicsManagerます。

私は現在、それらにグローバル ポインターを使用していると言わざるを得ないことを恥じています ( extern CWindowManager* g_WindowManager;)。これはおそらく悪いことだとわかっています。

いずれにせよ、これらのモジュールは動的に作成および削除する必要があり、もちろん正しい順序で行う必要があります。また、モジュールライクCPhysicsManagerはシーンに依存するため、シーンが切り替わると削除され、再度作成されるという問題もあります。

ここで、ゲーム内でモジュールを操作するためにグローバルを使用するのをやめたいと思います。

私はリファクタリングを恐れていませんが、グローバルに代わる最良の方法は何かを本当に考えることはできません.

CModuleManager クラスを作成し、そこにモジュールのインスタンスをメンバーとして格納し、CModule 基本クラスから派生させることを考えました。これがどのように機能するかについては、詳細には考えられませんが。

これは、ソフトウェア開発、特にゲーム開発における一般的な問題のようです。

- 単純にグローバル ポインターを使用する場合と比較して、モジュールを管理するための最良のオプションは何ですか?

4

1 に答える 1

1

グローバル データを使用する際の考慮事項:

  • マルチスレッド。異なるスレッドが同時にグローバル データにアクセスできる場合は注意が必要です。
  • テスト容易性。単体テストを作成している場合は、コードがグローバル データにアクセスする前にグローバル データを初期化する必要があります。

グローバル データを使用する代わりに、各クラス/メソッドが必要とするオブジェクト インスタンスをパラメーターとして渡すこともできます。これには、クラスのすべての依存関係が API から見えるという利点があります。また、単体テストの記述がはるかに簡単になります。欠点は、オブジェクトをあちこちに渡すと、コードが乱雑になる可能性があることです。

ModuleManager を持つというあなたの考えは、Service Locator パターンのように聞こえます。これは実行可能な解決策だと思います。このリンクが役立つ場合があります: http://gameprogrammingpatterns.com/service-locator.html

グローバル ポインターを引き続き使用する場合は、C++ でスマート ポインター (auto_ptr) を使用してグローバル データを動的に削除できます。

于 2011-08-22T13:57:31.943 に答える