2011-09-16 8 views
5

私のxnaコードfor Windows phone 7のDrawing部分で、数秒後に発生するパフォーマンスの問題を探しています。どのようにSpriteBatch.Beginを呼び出して何かを描画するのがベストプラクティスですか?各クラスのスプライト(各クラスでプレーヤー、背景、背景オブジェクトなどを描画するとき)を呼び出すか、最初の呼び出しを行いますか?>すべてのサブクラスですべてを描画しますか?SpriteBatch.Begin()/ End()を呼び出す頻度。

答えて

2

Begin()はスプライトレンダリングのためのデバイスの準備を意味し、End()は以前の状態への復元を意味するため、必要以上に使用しないでください。これはBegin()のいくつかのフラグによって変化する可能性があります。状態を変更したくない場合は、手動でいくつかの状態を設定する必要があるため、コードが複雑になる可能性があります。

デバイスの状態の変更が遅い場合があります。必要でない場合は実行しないようにする必要があります。また、何かを妨害する可能性があるため、SpriteBatchにないものをレンダリングする場合はEnd()すべてのスプライトに対して一度呼び出す必要があるスプライトをレンダリングしています。

End()を呼び出して前のスプライトに表示されない状態を変更しないようにするには、End()ではなくFlush()を呼び出す必要があります。これにより、キューに入れられたスプライトが現在の変換とデバイス状態でレンダリングされますが、状態はそのまま残ります。 End()関数は、Flush()を呼び出し、Begin()で設定した特定の状態をリセットします。

2

パフォーマンス上のベストなことは、Draw()ごとにbegin/endを1回だけ呼び出すことです。これにより、バッチ内のすべてのスプライトがグラフィックカードによって同時に処理されます。必要に応じて複数のスプライトバッチを使用する必要があります。あなただけの特定のスプライトにエフェクトを適用したいではなく、他の人

  • はあなたが影響して、より複雑な何かをしたいスクリーンショット
  • を取りたい

    • :あなたがする必要があるかもしれませんときの例としては、

    誰でも複数のスプライトバッチ(begin-> end)の他の理由が考えられますか?

  • +0

    Beginのオーバーロードの一覧は次のとおりです。http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.spritebatch.begin.aspxここでは、カスタムエフェクトまたは別の変換マトリックスを渡す場合は、別の呼び出しを行う必要があります。 –

    +0

    こんにちは、特定のスプライトにある画像のスクリーンショットを撮ることができませんでしたが、別のスプライトでスクリーンショットを撮ることができました。あらゆるアイデア、なぜこれが起こったのでしょうか? – nagavamsikrishna

    +0

    @salsabear、それは新しい質問のための材料のように聞こえる。質問にコードを含める場合は、必ずリレート部分のみを含めるようにしてください。 –

    関連する問題