Я программирую на C # с использованием .NET Framework 4 и намереваюсь создать игру на основе плиток с XNA. У меня есть одна большая текстура (256 пикселей на 4096 пикселей). Помните, что это игра на основе плиток, поэтому эта текстура настолько массивна только потому, что содержит много плиток, каждая из которых 32 на 32 пикселя. Я думаю, что эксперты наверняка будут знать, на что похожа игра на основе тайлов. Ориентация ортогональна (как шахматная доска), а не изометрическая.
В методе Game.Draw () у меня есть два варианта, один из которых будет невероятно более эффективным, чем другой.
Выбор / Метод # 1:
Semi-псевдокод:
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
}
}
}
Надпись: Итак, первый метод эффективно ссылается на одну большую текстуру много раз, каждый раз используя маленький прямоугольник этой большой текстуры для рисования соответствующего изображения плитки.
Выбор / Метод # 2 :
Semi-псевдокод:
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, скажем), каждый объект Tile должен будет содержать только 2 целых числа для позиций X и Y источника прямоугольник в одной большой текстуре - 8 байт. Однако если вы используете метод # 2, каждый объект Tile в массиве плиток карты должен будет хранить текстуру 32by32 - изображение, которое должно выделять память для пикселей RGBA 32 в 32 раза, - это то, что 4096 байт на плитку затем? Итак, какой метод и почему? Первым приоритетом является скорость, затем загрузка памяти, затем эффективность или то, во что верят ваши эксперты.