Ich habe die Dokumentation zur Tilemap-Funktion von Unity 2017.2 durchgearbeitet.
Beschränkt Unity die maximale Anzahl von Kacheln, die für ein bestimmtes Tilemap-Netz unterstützt werden?
Ich weiß, dass jede Kachel einmal instanziiert wird und zur Laufzeit verwendet wird, um die Quads auf dem Tilemap-Netz zu texturieren. Daher würde ich vermuten, dass die maximale Anzahl der Mesh-Quadrate letztendlich von der Hardware abhängt und mehr oder weniger willkürlich hoch ist.
Ist das eine richtige Annahme oder gibt es eine harte Kappe im Motor?
Antworten:
Ihr RAM ist Ihre Grenze .
Die folgenden Tests wurden an einem System mit diesen Spezifikationen durchgeführt:
Hier ist ein Skript, das ich ausgeführt habe und das eine Tilemap vergrößert, indem es mit einer einzelnen Kachel (32 x 32 Pixel) gefüllt wird. Die Methode
Grow()
fügt der aktuellen Karte eine weitere Spalte und eine weitere Zeile hinzu. Die Methode wird bei jedem Update 100 Mal aufgerufen.Nach ein paar Minuten ging meinem Computer der Speicher aus und Unity stürzte ab. Zu diesem Zeitpunkt waren es 8400 x 8400 (70 Millionen) Kacheln, und Unity.exe verbrauchte laut Task-Manager etwas mehr als 11 GB RAM.
Nun, aber was ist mit spärlichen Karten?
Hier ist ein anderes Skript, das eine einzelne Kachel in Schritten von 100 Kacheln an steigenden x- und y-Koordinaten platziert:
Der Speicherbedarf von Unity.exe ist in der Tat sehr gering, was darauf hindeutet, dass leere Kachelsatzzellen fast keinen RAM benötigen. Die FPS sanken jedoch weiter, während der Kachelsatz wuchs. Es erreichte 60 Fps bei 30000 x 30000, 30 Fps bei 60000 x 60000 und 15 Fps bei 90000 x 90000. Die Fps blieben so niedrig, als ich das Skript entfernte, während das Testspiel lief. Diese Verlangsamung resultierte also nicht aus einer Änderung der Tilemap. Es war einfach vom Rendern. Wenn Sie also ein wirklich riesiges Open-World-Spiel erstellen möchten, müssen Sie möglicherweise mehrere kleinere Tilemaps verwenden, die Sie zur Laufzeit erstellen und zerstören.
Schlussfolgerungen: Riesige, aber meist leere Karten belegen nicht viel RAM, stellen jedoch einen Rendering-Engpass dar , selbst wenn sich der größte Teil nicht im Kamera-Ansichtsfenster befindet.
Ich habe dann mit diesem Skript experimentiert, das Tilemaps mit einer bestimmten Größe generiert:
Ich habe dieses Skript verwendet, um eine 8192x8192-Karte zu generieren. Es dauerte ein paar Minuten, aber als das Skript fertig war, lief es mit stetigen 95 Fps.
Fazit: Karten mit Millionen von Kacheln sind zumindest auf Gaming-PCs machbar .
quelle
Update
Methode während der Generierung nicht verlässt , frieren das Spiel und der Unity-Editor ein, bis die Generierung abgeschlossen ist. Wenn Sie möchten, dass Ihr Spiel während der Kartengenerierung anspricht, verschieben Sie die Generierung auf eine Coroutine, die jeweils einen Block generiert und zwischen diesen Renditen erzielt.