Qual è il limite di dimensioni per Unity 2017.2 Tilemap?


17

Ho cercato la documentazione sulla funzionalità Tilemap di Unity 2017.2.

Unity limita il numero massimo di tessere che supporterà per una particolare mesh di tilemap?

So che ogni riquadro viene istanziato una volta e utilizzato per strutturare i quad sulla mesh Tilemap in fase di esecuzione, quindi immagino che il limite di conteggio dei quadratini di mesh sia in definitiva dipendente dall'hardware e più o meno arbitrariamente alto.

È un presupposto corretto o c'è un cappuccio duro nel motore?


1
Perché il downvote? Questa è una domanda legittima.
Philipp,

Risposte:


25

La tua RAM è il tuo limite .

I seguenti test sono stati eseguiti su un sistema con queste specifiche:

  • Intel i5-6600
  • 16 GB di RAM
  • NVIDIA GeForce GTX 1070
  • Windows 7 Home Premium

Ecco uno script che ho eseguito che fa crescere una piastrella riempiendola con una singola tessera (32x32 pixel). Il metodo Grow()aggiunge un'altra colonna e un'altra riga alla mappa corrente. Il metodo viene chiamato 100 volte ogni aggiornamento.

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++;
    }
}

Dopo alcuni minuti, il mio computer ha esaurito la memoria e Unity si è bloccato. A quel punto era di 8400x8400 (70 milioni) di riquadri e Unity.exe consumava poco più di 11 GB di RAM secondo il task manager.

Bene, ma per quanto riguarda le mappe sparse ?

Ecco uno script diverso che posizionava una singola tessera aumentando le coordinate xey con incrementi di 100 tessere:

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;
    }    
}

L'impronta di memoria di Unity.exe è infatti aumentata molto poco, il che suggerisce che celle vuote del set di tessere non richiedono quasi RAM. Tuttavia, l'FPS ha continuato a cadere mentre il set di piastrelle stava crescendo. Ha raggiunto 60 Fps a 30000x30000, 30 Fps a 60000x60000 e 15 Fps a 90000x90000. Gli Fps sono rimasti così bassi quando ho rimosso lo script mentre il test-game era in esecuzione. Quindi questo rallentamento non è dovuto alla modifica della tilemap. Era semplicemente dal renderlo. Quindi, quando si desidera creare un gioco open world davvero enorme, potrebbe essere necessario utilizzare più tilemap più piccole che si creano e si distruggono in fase di esecuzione.

Conclusioni: le tilemap enormi ma per lo più vuote non usano molta RAM, ma rappresentano un collo di bottiglia nel rendering , anche quando la maggior parte di esse non si trova nel viewport della telecamera.

Ho quindi sperimentato questo script che genera tilemap con una determinata dimensione:

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);
            }
        }
    } 
}

Ho usato questo script per generare una mappa 8192x8192. Ci sono voluti alcuni minuti, ma quando la sceneggiatura è terminata, ha funzionato a 95 Fps costanti.

Conclusione: le mappe con milioni di riquadri sono fattibili, almeno sui PC da gioco .


5
Questa è la risposta più bella che abbia mai visto da molto tempo. "Scopriamolo!" scrive script per martellare il sistema esegue script computer inizia a fumare "Sembra che non ti limiti!" Grazie @Philipp!
Stephan,

Qual è stato il framerate durante la generazione del test 8192 ^ 2? Sono curioso di sapere quanto gli sforzi della generazione abbiano impantanato il sistema.
Stephan,

1
@Stephan Zero FPS. Come ho detto, la generazione richiede diversi minuti. E poiché questo script non lascia il suo Updatemetodo durante la generazione, il gioco e l'editor Unity si bloccano fino al termine della generazione. Se vuoi che il tuo gioco sia reattivo durante la generazione della mappa, sposta la generazione in un coroutine che genera un pezzo alla volta e cede tra loro.
Philipp,

@Stephan E a proposito, potrebbe essere più veloce usare SetTilesBlock per impostare tutte le tessere contemporaneamente. Ma generare rapidamente la mappa dei test non era il mio obiettivo qui.
Philipp,

Oh! duh, ok. Per qualche ragione stavo pensando che avrebbe interrotto. Questo è un pensiero interessante. Dovrò giocarci questo fine settimana. Non sembra esserci un sacco di risultati terribili su questa funzionalità, poiché è così nuovo. Grazie per la risposta approfondita! Ha già attirato molta attenzione. Aiutare i posteri!
Stephan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.