0

これはXNAの質問です...

ゲームにDrawableGameComponentsであるオブジェクトが多数あり、それらはすべて同じSpriteBatchを共有しています。ただし、各コンポーネントを描画するには、毎回SpriteBatch.Begin()と.End()を呼び出す必要があります。パフォーマンスを向上させるためにすべてを1つのバッチで描画したいのですが、.Draw()が自動的に呼び出されるため(DrawableGameComponentsであるため)、.Begin()と.End()がどこに移動できるかわかりません。

それらをDrawableGameComponentsとして保持しながら、それらすべてを単一の.Begin()呼び出しと.End()呼び出しの間に描画させるために私ができることを誰かが知っていますか?

編集:

このWebサイトから申し分なくhttp://www.progware.org/Blog/post/XNA-Game-Development-(Decentralize).aspxメインゲームループのbase.Draw()呼び出しで呼び出されていることがわかりました...だから私はそれをBeginメソッドとEndメソッドでラップすることができます

protected override void Draw(GameTime gameTime) {
    if (Cell.Cell.CellSpriteBatch != null) {
        Cell.Cell.CellSpriteBatch.Begin(
            SpriteSortMode.BackToFront, BlendState.AlphaBlend, 
            SamplerState.AnisotropicClamp, null, null, null,
            gamePlay.Camera.GetTransformation()
        );
    }

    base.Draw(gameTime);

    if (Cell.Cell.CellSpriteBatch != null) {
        Cell.Cell.CellSpriteBatch.End();
    }
}

現在は機能していますが、この方法で描画するということは、このSpriteBatchの.End()が常に最後に呼ばれます。

これに対する解決策はありますか?

4

1 に答える 1

0

まず、バッチが制限されていることをすでに知っていない限り、おそらくこれを行う価値はありません。すべての.Draw呼び出しが同じテクスチャからプルしている場合は、速度がいくらか向上する可能性があります。それらが異なるテクスチャである場合、単一の開始/終了に切り替えても違いはありません。SpriteBatchはとにかくドローコールを分割します。

これを行うと、コードもかなり混乱することがわかりました。コンポーネント間を追跡する必要があります。

現在の問題に対する唯一の解決策は、SpriteBatchを即時にして、End呼び出しで描画するのではなく、draw呼び出しを呼び出すときに描画するようにすることです。ただし、バッチ処理がまったく行われないため、これによりパフォーマンスが低下します。

個人的には、パフォーマンスの問題が発生するまで、コンポーネントごとの開始/終了に固執します。5000個のコンポーネントがないと仮定すると、その場合は、おそらく少し異なる方法で設計する必要があります。

于 2010-12-28T02:26:47.927 に答える