さて、むっちゃ初歩的なテクニックなので今回はメモとして記事にしておきます。Zuneに限らず、表示の最適化問題は結構おおきなものです。で、XNA Game Studioで使用するAPIはかなり高度(逆を言うと遅い)なAPIです。さらにTexture2Dを描画するには基本的にスプライト表示になり、なんどもスプライト表示API(spriteBatch)を呼び出すのは非効率なのです。そこで、部分ごとのTexture2Dを生成したり、読み込み済みのTexture2Dを修正したうえで表示するのであれば、spriteBatch処理を1回でその描画については済むことになります。では、spriteBatch1回で加工したTexture2Dを描画するための配列やら色はどうすべきか? というわけで、サンプルプログラム。
まず
graphicsは
GraphicsDeviceManagerの変数です。他はいうまでもなく宣言していますので、どのようになっているかちょっと解説してみますと、まずTexture2Dの変数である、map240を240*240Pixel(dot)でグラフィクスデバイスにて生成をしています。この段階で生成のみですから中の色データは不定です。
つぎに、ピクセルの色データをColorの配列にて変数名dataで宣言し、240*240Pixelの配列として生成しています。
つぎのrectは表示領域である「開始X,開始Y,X幅,Y幅」で初期化しています。240*240ピクセルで開始座標は[0,32]というわけです。
今回は、1ピクセル単位でColor.Whiteをdata配列へfor文を使用して逐次設定しています。まぁ、あくまでサンプルですので、このほうがわかりやすいでしょう。
240*240Pixel分の色データをdata配列に設定がおわったら、それをSetData文でmap240へ割り当てています。これで実際に表示するTexture2Dデータが中身付で生成できたことになります。最後にspriteBatch文で表示すれば完了。
今回、わざわざColor c;変数をループ内においているのは、変数として色を取り扱えるということを明示するためです。そう、ここで1Pixel単位でいろいろ色をおきかえたりできるわけですね。これをもし、1Pixel単位でTexture2Dを読み込んだデータで表示していたらとんでもないことになります。
この手法を応用すると、読み込んだTexture2DデータからColor配列へGetDataを行い、それを合成したうえで一括表示することで、複数回のspriteBatch処理を避ける高速化もできます。公式の日本語ドキュメントを読んでみてもSetData文の使い方や中の配列をどうすればいいかがいまいちよくのっていないようなので(XNA GS 3.0用日本語ドキュメント)サンプルとして載せておきます。
Texture2D map240;
int x, y;
Rectangle rect;
Color c;
map240 = new Texture2D(graphics.GraphicsDevice,240,240);
Color[] data=new Color[240*240];
rect = new Rectangle(0, 32, 240, 240);
for (x = 0; x < 240; x++)
{
for (y = 0; y < 240; y++)
{
c=Color.White;
data[x + y * 240] = c;
}
}
map240.SetData(data);
spriteBatch.Draw(map240, rect, Color.White);