3

XNAゲームを開発しています。今回はアーキテクチャに注意します。今日まで、私は常に次のように独自の描画メソッドを実装してきました。

public void Draw(SpriteBatch sb, GameTime gameTime)
{
    sb.Begin();
    // ... to draw ...
    sb.End();
}

私はDrawableGameComponentを掘り下げていて、Drawメソッドが次のようになっているのを見ました。

public void Draw(GameTime gameTime)
{
    // ...
}

まず、SpriteBatchはBeginとEndの間に多くのTexture2Dを収集できるので、それらを並べ替えたり、同じ効果で描画したりすると便利です。

私の質問は、SpriteBatchを渡すためのパフォーマンスとコストについてです。DrawableGameComponentでは、spritebatchがパブリックである場合、ゲームオブジェクトのspritebatchを呼び出すことができます。

何が提案されていますか、xna-gameプログラマーは何をすべきですか?

アドバイスありがとうございます。

4

3 に答える 3

5

この質問に出くわした場合は、おそらく、優れた一般的な解決策を探していたでしょう。私はあなたがこれを見てみることをお勧めします:

https://gamedev.stackexchange.com/questions/14217/several-classes-need-to-access-the-same-data-where-should-the-data-be-declared/14232#14232

「最善の方法は議論として渡すことです。それ以外は複雑です」という理由で、この質問を修正する必要があると感じました。単に正しくありません

個人的には、GameBaseクラスでこのようにしています。

    protected override void LoadContent()
    {
        // Create a new SpriteBatch, which can be used to draw textures.
        SpriteBatch = new SpriteBatch(GraphicsDevice);
        this.Services.AddService(typeof(SpriteBatch), SpriteBatch);
    }

これで、GameクラスのInitializeメソッドにDrawableGameComponentsを追加しているので、呼び出すことができます。

    this.Game.Services.GetService(typeof(SpriteBatch))

それが問題を解決するための最もクリーンなアプローチだと思います。

于 2013-05-30T14:13:07.903 に答える
4

の重大な欠点の1つは、DrawableGameComponent提供されたメソッドシグネチャにロックされていることです。「間違った」ものは何もありませんが、それ自体はDrawableGameComponent、「1つの真のアーキテクチャ」とは考えないでください。考えられるアーキテクチャの例として考えた方がよいでしょう。

SpriteBatch「ゲームコンポーネント」のdrawメソッドに(または他の何かを)渡す必要がある場合は、引数として渡すのが最善の方法です。それ以外は複雑です。

明らかに、これはXNAが提供するシステムを使用できないことを意味しGameComponent、独自の代替手段を作成する必要があります。しかし、これはほとんど些細なことです。最も基本的なレベルでは、適切な仮想メソッドを持ついくつかの基本タイプのリストにすぎません。


もちろん、使用する必要がある場合、GameComponentまたはゲームが非常に単純で(プロトタイプなど)、アーキテクチャをあまり気にしない場合は、基本的に、描画メソッドを取得するために任意のメソッドを使用できます。SpriteBatchそれらはすべて欠点があります。

おそらく、次にアーキテクチャ的に堅牢な方法は、SpriteBatchインスタンスを各コンポーネントのコンストラクターに渡すことです。これにより、コンポーネントがゲームクラスから切り離されたままになります。

一方、建築を風に吹かせる場合は、MyGame.spriteBatchフィールドを作成することをお勧めしますpublic static。これは、どこからでもアクセスできるようにするための最も簡単な方法です。実装は簡単で、必要なときに/必要に応じて後でクリーンアップするのも簡単です。


パフォーマンスに関する質問に答えるには:アラウンドの受け渡しに関係することはSpriteBatch、パフォーマンスにほとんど影響を与えません(//への呼び出しの順序は同じDrawままです)。ご心配なく。BeginEnd

(コードで見ると、それは参照を表します。参照は32ビット値です(32ビットプログラムでは、すべてのXNAゲームがそうです)。これは、またはSpriteBatch whateverと同じサイズです。非常に小さく、非常に安価です。渡す/アクセスするなど)intfloat

于 2012-10-04T10:53:04.437 に答える
1

DrawableGameComponentが親の一部である必要がある場合はSpriteBatch、コンストラクターを介してそれを渡し、プライベートメンバーに格納します(または、必要に応じてプロパティとして公開します)。

SpriteBatch必要に応じて、提案したように、をクラスのプロパティとして公開することもできGameますが、参照するたびに、特定のクラスタイプthis.Gameにキャストする必要があります。Game

((MyGame)this.Game).SpriteBatch.Draw(...)

またはDrawableGameComponent、新しいを作成することもできますSpriteBatch。それは何も悪いことではありません(私が今まで見た限りでは)。作成するsの数と頻度によって異なると思いDrawableGameComponentます。

また、検索DrawableGameComponent結果を参照してください-そこにはたくさんの良いアドバイスがあります。

于 2012-10-03T19:32:33.670 に答える