Draw () 20,000 32 на 32 текстуры или 1 большая текстура 20,000 раз

Я программирую на 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 байт на плитку? Итак, какой метод и почему? Первым приоритетом является скорость, затем загрузка памяти, затем эффективность или что-то еще, как вы считаете, эксперты.

5
задан Martin. 26 January 2012 в 06:09
поделиться