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