4

画像を表すバイト配列があります。

各バイトは、特定のピクセルの R、G、または B の強度値 (0 ~ 255) を表します。したがって、640x480 の画像の場合、バイト配列のサイズは 640*480*3 になります (各ピクセルには、それを表す 3 バイトがあります)。

バイトはピクセル順です。例えば:

image[0] = the R value of x=0 y=0 
image[1] = the G value of x=0 y=0
image[2] = the B value of x=0 y=0
image[3] = the R value of x=1 y=0

等々。

XNAでこれを画面に描画する最も効率的な方法は何ですか?

私の考えは、次のことを行うことです。

  1. 新しい Texture2d オブジェクトを作成する
  2. draw() メソッドの間、バイト配列をループし、Texture2D オブジェクトに値を設定します。
  3. この塗りつぶされたオブジェクトを画面に描画します。

これはこれを行うための最速の方法ですか?より効率的であれば、バイト配列を別の順序/形式で格納することもできます。draw() メソッド中にループを実行することの欠点はありますか? update() 中に実行したほうがよいでしょうか?

編集:

バイト配列が更新されるたびに (通常はフレームに 1 回) 新しいテクスチャを作成するために、Texture2D で setData() を使用しようとしました。fps は 15 未満になりましたが、以前は 60 でした。コードは次のとおりです。

    public static Texture2D getImageFrame(GraphicsDevice gd)
    {
        if (cameraTex == null)
        {
            cameraTex = new Texture2D(gd, 640, 480, false, SurfaceFormat.Color);
        }
        cameraTex.SetData(imageFrame);
        return cameraTex;
    }

draw() サイクルごとに呼び出されます。

確かに、これを行うためのより効率的な方法が必要ですか?

4

1 に答える 1

2

バイト配列が更新される方法に応じて (注目に値する可能性があります)、index および count パラメーターを使用する SetData オーバーロードを使用して、おそらくテクスチャの小さなセグメントを更新できます。

明らかに、これを機能させるには、ピクセルのどの領域が最後に変更されたかを追跡する方法を追加する必要があります (これもプログラムの構造によって異なります)。いずれにせよ、最近、別のテクスチャに血しぶきテクスチャを描画すると、同様のパフォーマンス ヒットが発生し、この方法を使用してヒットを最小限に抑えることができました。

public void SetData (T[] データ、int startIndex、int elementCount)

public void SetData (int レベル、Nullable rect、T[] データ、int startIndex、int elementCount)

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.texture2d.setdata.aspx

于 2012-03-19T23:02:42.203 に答える