¿Cuál es el límite de tamaño del Unity 2017.2 Tilemap?

17

He estado investigando la documentación sobre la función Tilemap de Unity 2017.2.

¿Unity limita la cantidad máxima de mosaicos que admitirá para una malla de mosaico en particular?

Sé que cada mosaico se instancia una vez y se usa para texturizar los quads en la malla de Tilemap en tiempo de ejecución, por lo que supongo que el límite de conteo cuádruple de malla depende en última instancia del hardware, y más o menos es arbitrariamente alto.

¿Es una suposición correcta o hay una tapa dura en el motor?

Stephan
fuente
1
¿Por qué el voto negativo? Esta es una pregunta legítima.
Philipp

Respuestas:

25

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 .

Philipp
fuente
55
Esta es la respuesta más hermosa que he visto en mucho tiempo. "¡Vamos a averiguar!" escribe scripts para martillar el sistema ejecuta script computer comienza a fumar "¡Parece que no te limita!" Gracias @Philipp!
Stephan
¿Cuál fue el framerate durante la generación de la prueba 8192 ^ 2? Tengo curiosidad por cuánto los esfuerzos de generación empantanaron el sistema.
Stephan
1
@Stephan Zero FPS. Como dije, la generación lleva varios minutos. Y debido a que este script no deja su Updatemétodo durante la generación, el juego y el editor de Unity se congelan hasta que finaliza la generación. Si quieres que tu juego responda durante la generación del mapa, muévelo a una rutina que genere un fragmento a la vez y ceda el paso entre ellos.
Philipp
@Stephan Y, por cierto, podría ser más rápido usar SetTilesBlock para configurar todos los mosaicos a la vez. Pero generar el mapa de prueba rápidamente no era mi objetivo aquí.
Philipp
Oh! duh, ok Por alguna razón, pensaba que iba a interrumpir. Ese es un pensamiento interesante. Tendré que jugar con eso este fin de semana. Parece que todavía no hay una gran cantidad de resultados en esta función, ya que es tan nueva. Gracias por la respuesta completa! Ya ha atraído mucha atención. ¡Ayudando a la posteridad!
Stephan