Какое ограничение по размеру для карты листов Unity 2017.2?

17

Я копался в документации по функции Tilemap в Unity 2017.2.

Ограничивает ли Unity максимальное количество плиток, которые оно будет поддерживать для конкретной сетки тайлкарт?

Я знаю, что каждый фрагмент создается один раз и используется для текстурирования четырехугольников на сетке Tilemap во время выполнения, поэтому я предполагаю, что предел количества квадов сетки в конечном счете зависит от аппаратного обеспечения и более или менее произвольно высок.

Это правильное предположение, или в двигателе жесткая крышка?

Stephan
источник
1
Почему отрицательный голос? Это законный вопрос.
Филипп

Ответы:

25

Ваша RAM - это ваш предел .

Следующие тесты были выполнены в системе с этими спецификациями:

  • Intel i5-6600
  • 16 ГБ ОЗУ
  • NVIDIA GeForce GTX 1070
  • Windows 7 Home Premium

Вот скрипт, который я запустил, который увеличивает карту листов, заполняя ее одной плиткой (32x32 пикселей). Метод Grow()добавляет еще один столбец и еще одну строку к текущей карте. Метод вызывается 100 раз при каждом обновлении.

public class TileTest : MonoBehaviour {

    public Tile tile;
    private Tilemap tilemap; 

    public int currentSize;


    void Start () {
       tilemap = GetComponent<Tilemap>;
        Grow();
    }

    void Update() {

        for (var i = 0; i < 100; i++) {
            Grow();
        }
        Debug.Log(currentSize);        
    }

    private void Grow() {
        for (int x = 0; x < currentSize; x++) {
            tilemap.SetTile(new Vector3Int(x, currentSize, 0), tile);
        }
        for (int y = 0; y < currentSize; y++) {
            tilemap.SetTile(new Vector3Int(currentSize, y, 0), tile);
        }
        tilemap.SetTile(new Vector3Int(currentSize, currentSize, 0), tile);

        currentSize++;
    }
}

Через несколько минут на моем компьютере не хватило памяти, и Unity упала. На тот момент он составлял 8400x8400 (70 миллионов) тайлов, а Unity.exe занимал чуть более 11 ГБ ОЗУ, согласно диспетчеру задач.

Ну, а как насчет разреженных карт?

Вот другой скрипт, который помещал одну плитку с увеличением координат x и y с шагом 100 плиток:

public class TileTest : MonoBehaviour {

    public Tile tile;
    private Tilemap tilemap; 
    public int currentSize;


    void Start () {
        tilemap = GetComponent<Tilemap>();
    }

    void Update() {
        tilemap.SetTile(new Vector3Int(currentSize, currentSize, 0), tile);
        currentSize+= 100;
    }    
}

Объем памяти Unity.exe фактически увеличился очень мало, что намекает на то, что пустым ячейкам набора тайлов почти не требуется ОЗУ. Тем не менее, FPS продолжал падать по мере роста набора тайлов. Он достиг 60 кадров в секунду при 30000x30000, 30 кадров в секунду при 60000x60000 и 15 кадров в секунду при 90000x90000. Fps оставался таким низким, когда я убрал скрипт, когда тестовая игра была запущена. Так что это замедление не было связано с изменением карты тайлов. Это было просто от рендеринга. Поэтому, когда вы хотите создать действительно огромную игру с открытым миром, вам, возможно, придется использовать несколько небольших мозаичных карт, которые вы создаете и уничтожаете во время выполнения.

Выводы: Огромные, но в основном пустые карты тайлов не используют много оперативной памяти, но они являются узким местом рендеринга , даже когда большая часть этого не находится в области просмотра камеры.

Затем я поэкспериментировал с этим сценарием, который генерирует мозаичные карты с заданным размером:

public class TileTest : MonoBehaviour {

    public Tile tile;
    public int xSize;
    public int ySize;

    void Start () {
        Tilemap tilemap = GetComponent<Tilemap>();

        for (int x = 0; x < xSize; x++) {
            for (int y = 0; y < ySize; y++) {
                tilemap.SetTile(new Vector3Int(x, y, 0), tile);
            }
        }
    } 
}

Я использовал этот скрипт для генерации карты 8192x8192. Это заняло несколько минут, но когда сценарий был закончен, он работал со стабильными 95 кадрами в секунду.

Вывод: карты с миллионами плиток возможны, по крайней мере, на игровых ПК .

Philipp
источник
5
Это самый красивый ответ, который я видел за долгое время. "Давай выясним!" пишет сценарии, чтобы забить систему, запускает сценарий, компьютер начинает курить "Похоже, это не ограничивает тебя!" Спасибо, Филипп!
Стефан
Какова была частота кадров при генерации теста 8192 ^ 2? Мне любопытно, сколько усилий поколения затопили систему.
Стефан
1
@ Стефан Ноль FPS. Как я уже сказал, генерация занимает несколько минут. И поскольку этот сценарий не оставляет свой Updateметод во время генерации, игра и редактор Unity останавливаются до завершения генерации. Если вы хотите, чтобы ваша игра реагировала на генерацию карт, переместите поколение в сопрограмму, которая генерирует один блок за раз и уступает между ними.
Филипп
@Stephan И, кстати, может быть быстрее использовать SetTilesBlock, чтобы установить все плитки одновременно. Но быстрое создание тестовой карты не было моей целью.
Филипп
Ой! да ладно По какой-то причине я думал, что это прервет. Это интересная мысль. Мне придется поиграть с этим в эти выходные. Похоже, еще не так уж много результатов по этой функции, поскольку она такая новая. Спасибо за тщательный ответ! Это уже привлекло много внимания. Помогая потомству!
Стефан