.NET Framework 4を使用してC#でプログラミングしていて、XNAでタイルベースのゲームを作成しようとしています。私は1つの大きなテクスチャ(256ピクセルx 4096ピクセル)を持っています。これはタイルベースのゲームなので、このテクスチャは32ピクセル×32ピクセルのタイルが多数含まれているため、非常に大量です。私は専門家が間違いなくタイルベースのゲームが何であるかを知っていると思います。向きは直交(チェスボードのような)で、等角ではありません。Draw()20,000 32 x 32テクスチャまたは1つの大きなテクスチャ20,000 Times
Game.Draw()メソッドでは、2つの選択肢がありますが、そのうちの1つは他よりも非常に効率的です。
選択/方法#1:
セミ擬似コード:
public void Draw()
{
// map tiles are drawn left-to-right, top-to-bottom
for (int x = 0; x < mapWidth; x++)
{
for (int y = 0; y < mapHeight; y++)
{
SpriteBatch.Draw(
MyLargeTexture, // One large 256 x 4096 texture
new Rectangle(x, y, 32, 32), // Destination rectangle - ignore this, its ok
new Rectangle(x, y, 32, 32), // Notice the source rectangle 'cuts out' 32 by 32 squares from the texture corresponding to the loop
Color.White); // No tint - ignore this, its ok
}
}
}
キャプション:だから、効果的に、第1の方法は、一つの大きなテクスチャを毎回多くの多くの回を参照していますこの大きなテクスチャの小さな四角形を使用して適切なタイルイメージを描画します。
選択/方法#2:
セミ擬似コード:
public void Draw()
{
// map tiles are drawn left-to-right, top-to-bottom
for (int x = 0; x < mapWidth; x++)
{
for (int y = 0; y < mapHeight; y++)
{
Texture2D tileTexture = map.GetTileTexture(x, y); // Getting a small 32 by 32 texture (different each iteration of the loop)
SpriteBatch.Draw(
tileTexture,
new Rectangle(x, y, 32, 32), // Destination rectangle - ignore this, its ok
new Rectangle(0, 0, tileTexture.Width, tileTexture.Height), // Notice the source rectangle uses the entire texture, because the entire texture IS 32 by 32
Color.White); // No tint - ignore this, its ok
}
}
}
キャプション:だから、効果的に、第二の方法は、多くの小さなテクスチャを何度も描いています。
質問:どの方法と理由ですか?個人的には、私は最初の方法を使う方がずっと効率的だと思います。マップ内のタイル配列の意味について考えてみましょう(2000タイルで2000タイルの大きなマップを考えてみましょう)、各タイルオブジェクトはソースのXとYの位置に2つの整数しか入れなくてはなりません1つの大きなテクスチャの長方形 - 8バイト。ただし、メソッド#2を使用する場合、マップのタイル配列の各Tileオブジェクトは、RGBAピクセルのメモリを32×32回割り当てなければならない32バイトのテクスチャ(画像)をタイルごとに4096バイトそれで?だから、どの方法と、なぜですか?第一の優先事項はスピード、次にメモリー負荷、効率、またはあなたの専門家が信じるものです。
包括的な回答をいただきありがとうございます。どうもありがとう! – Jason