1

opengl、direct3d、sdl、または任意のグラフィック API (一般的にはゲーム) を使用してあらゆる種類のアプリケーションをプログラミングしているとき、描画、画像の読み込み、ウィンドウの初期化などに必要なすべてを備えた Graphics という名前のクラスを作成する習慣があります。その中に。このクラスのインスタンスは、別のクラス (プログラム、ゲーム、またはそれを使用するもののメイン クラス) 内にあります。

年月が経つにつれて、私はこれを使用するためにさまざまなアプローチを試みましたが、これらのいくつかが良いと思うかどうか、またはすべてが役に立たないがらくたであり、別の方法で行う必要があるかどうかを知りたい.

1 - プログラム クラス内に Graphics のインスタンスを持ち、プログラム クラス内に関数を持ち、オブジェクト (プレーヤーなどのゲーム オブジェクト) を反復処理し、Graphics メソッドを呼び出して、それに応じてすべてを描画します。

2 - グラフィックスへのポインターをすべてのオブジェクトに渡して、それぞれが Draw 関数を持ち、このポインターを使用して適切なグラフィックス関数自体を呼び出すことができるようにします。

3 - グラフィックス内のすべてを静的にし、グラフィックスのインスタンスを作成する必要をなくします。次に、どこからでもすべてのグラフィック関数を呼び出すことができます (トピック 2 と同様に、各オブジェクトに対して Draw 関数を使用するだけです)。

ありがとうございました。

編集: そして、iostream が cout で行うことと同様のことを行うとしたら、たとえば、「extern Graphics x;」でヘッダーを作成し、cpp ファイルで x を宣言し、この x からすべてを呼び出します。これはひどすぎますか?もしそうなら、なぜですか?

4

3 に答える 3

2

「グラフィックス」クラスは、たとえば、描画しているキャンバスのような状態を持つことができると思います。したがって、それをクラスにするのは良いことです。クラスを作成することで、同じ関数セットをさまざまなタイプの「キャンバス」 (opengl、directx、sdl など) に適用できます。

あなたのオプションの中で、オプション 1 が最適だと思いますが、オプション 2 が最も簡単だと思います (オプション 3 は恐ろしいものです。コードをグローバル変数に依存させ、コードの再利用性を排除するためです。これはハッカーのアプローチです:D )。

オプション 1 は優れています。なぜなら、描画するものをインテリジェントに処理するグラフィック エンジンを作成できるからです。同じテクスチャを共有するが、異なるメッシュを使用する 2 つのオブジェクトがあるとします。適切にプログラムされていれば、グラフィック エンジンは両方のオブジェクトの「メッシュの描画」関数を同じレンダリング設定 (この場合は同じテクスチャ) で呼び出すことができ、レンダリングが高速化されます。これは、オプション 2 では不可能です。オプション 2 では、通常、1 つのオブジェクトの描画関数がグループ化され、レンダリング設定がさらに変更されます。

ただし、オプション 2 の方が実装が簡単です。レンダリング速度があまり必要ない場合は、作業がはるかに少なく、より論理的なプログラム構造につながるため、これを選択します。オプション 1 を実現するには、私が説明したように、オブジェクトに「レンダリング プロパティ」などを持たせる必要があります。これは、レンダリング エンジンによって一致させる必要があり、さまざまな描画設定にさまざまな描画ルーチンが必要です。オブジェクトと比較すると非常に複雑です。 Graphics クラスのような主要な描画関数セットを使用する描画関数。

したがって、「大規模なプロジェクト」を選択する場合は、オプション 1 を選択してください。迅速な結果を得るために、多くのものを描く必要がない場合は、オプション 2 の方がおそらく優れています。オプション 1 と 2 の使いやすさは似ています。

PS: 編集が遅くなって申し訳ありませんが、以前のバージョンでは私の文法はひどいものでした

于 2013-02-08T17:52:51.090 に答える
1

私は 4 番目のオプションを選び、Graphics をクラスではなく名前空間にします。

Graphics がデータ型であるようには聞こえませんが、単なる関数のコレクションです。それがまさに名前空間の目的です。

于 2013-02-08T17:24:09.280 に答える
1

「グラフィックス」オブジェクトが何であるかを理解するのに苦労しています。ソフトウェアのオブジェクトは現実のオブジェクトに似ています。では、Graphics オブジェクトは何を表しているのでしょうか?

私が通常行っている方法は、標準の UI アプリケーションと大差ありません。複数回インスタンス化できる Window クラスと、Window を継承して 1 回だけインスタンス化される MainWindow クラスがあります。その MainWindow クラスには、実行中に使用されるすべてのグラフィックス リソース (Direct3D デバイス オブジェクトなど) があります。

于 2013-02-08T17:30:27.227 に答える