Tu RAM es tu límite .
Las siguientes pruebas se realizaron en un sistema con estas especificaciones:
- Intel i5-6600
- 16 GB de RAM
- NVIDIA GeForce GTX 1070
- Windows 7 Home Premium
Aquí hay un script que ejecuté que hace crecer un mosaico al llenarlo con un único mosaico (32x32 píxeles). El Método Grow()
agrega otra columna y otra fila al mapa actual. El método se llama 100 veces cada actualización.
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++;
}
}
Después de unos minutos, mi computadora se quedó sin memoria y Unity se bloqueó. En ese momento, estaba en 8400x8400 (70 millones) de mosaicos y Unity.exe consumía un poco más de 11 GB de RAM según el administrador de tareas.
Bueno, pero ¿qué pasa con los mapas dispersos ?
Aquí hay una secuencia de comandos diferente que colocó un único mosaico en el aumento de las coordenadas xey en incrementos de 100 mosaicos:
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;
}
}
La huella de memoria de Unity.exe, de hecho, aumentó muy poco, lo que sugiere que las celdas de mosaico vacías casi no requieren RAM. Sin embargo, el FPS siguió cayendo a medida que el conjunto de fichas crecía. Alcanzó 60 Fps a 30000x30000, 30 Fps a 60000x60000 y 15 Fps a 90000x90000. Los Fps se mantuvieron tan bajos cuando eliminé el script mientras se ejecutaba el juego de prueba. Entonces, esta desaceleración no fue por cambiar el mosaico. Fue simplemente por representarlo. Entonces, cuando quieras crear un juego de mundo abierto realmente enorme, es posible que tengas que usar múltiples mapas de fichas más pequeños que creas y destruyes en tiempo de ejecución.
Conclusiones: los mapas de mosaicos enormes pero en su mayoría vacíos no usan mucha RAM, pero son un cuello de botella de representación , incluso cuando la mayor parte no está en la ventana de visualización de la cámara.
Luego experimenté con este script que genera mapas de mosaico con un tamaño dado:
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);
}
}
}
}
Usé este script para generar un mapa 8192x8192. Tomó unos minutos, pero cuando terminó el guión, se ejecutó a 95 Fps constantes.
Conclusión: los mapas con millones de mosaicos son factibles, al menos en PC para juegos .