Ваша 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 кадрами в секунду.
Вывод: карты с миллионами плиток возможны, по крайней мере, на игровых ПК .