Jaki jest limit rozmiaru do Tilemap Unity 2017.2?

17

Przeglądałem dokumentację dotyczącą funkcji Tilemap w Unity 2017.2.

Czy Unity ogranicza maksymalną liczbę płytek, które będzie obsługiwał dla konkretnej siatki tilemap?

Wiem, że każdy kafelek jest tworzony raz i służy do teksturowania quadów na siatce Tilemap w czasie wykonywania, więc zgaduję, że limit liczby quadów siatki zależy ostatecznie od sprzętu i mniej więcej jest arbitralnie wysoki.

Czy to prawidłowe założenie, czy też silnik jest mocno zakryty?

Stephan
źródło
1
Dlaczego głosowanie negatywne? To uzasadnione pytanie.
Filip

Odpowiedzi:

25

Twoja pamięć RAM jest twoim limitem .

W systemie o tych specyfikacjach przeprowadzono następujące testy:

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

Oto skrypt, który uruchomiłem, który tworzy mapę tilem, wypełniając ją pojedynczą płytką (32 x 32 piksele). Metoda Grow()dodaje kolejną kolumnę i kolejny wiersz do bieżącej mapy. Metoda jest wywoływana 100 razy przy każdej aktualizacji.

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

Po kilku minutach w moim komputerze zabrakło pamięci i Unity się zawiesił. W tym momencie było to na kafelkach o wielkości 8400 x 8400 (70 milionów), a według menedżera zadań Unity.exe zużywał nieco ponad 11 GB pamięci RAM.

No ale co z rzadkimi mapami?

Oto inny skrypt, który umieścił pojedynczy kafelek przy zwiększaniu współrzędnych xiy w odstępach co 100 kafelków:

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

Ślad pamięci Unity.exe w rzeczywistości bardzo niewiele wzrósł, co wskazuje, że puste komórki zestawu klocków nie wymagają prawie pamięci RAM. Jednak liczba klatek na sekundę spadała wraz z powiększaniem się zestawu płytek. Osiągnął 60 Fps przy 30000 x 30000, 30 Fps przy 60000 x 60000 i 15 Fps przy 90000 x 90000. Liczba klatek na sekundę pozostała tak niska, gdy usunąłem skrypt podczas działania gry testowej. Więc to spowolnienie nie było spowodowane zmianą mapy tilem. Po prostu z renderowania. Więc jeśli chcesz stworzyć naprawdę ogromną grę z otwartym światem, być może będziesz musiał użyć wielu mniejszych map tilemap, które tworzysz i niszczysz w czasie wykonywania.

Wnioski: Ogromne, ale w większości puste tilemapy nie używają dużo pamięci RAM, ale stanowią wąskie gardło renderowania , nawet jeśli większość z nich nie znajduje się w okienku kamery.

Następnie eksperymentowałem z tym skryptem, który generuje mapy warstwowe o danym rozmiarze:

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

Użyłem tego skryptu do wygenerowania mapy 8192x8192. Zajęło to kilka minut, ale kiedy skrypt został ukończony, działał ze stałą prędkością 95 Fps.

Wniosek: Mapy z milionami kafelków są możliwe, przynajmniej na komputerach do gier .

Philipp
źródło
5
To najpiękniejsza odpowiedź, jaką widziałem od dłuższego czasu. "Dowiedzmy Się!" pisze skrypty, aby uruchomić system. Skrypt komputer zaczyna palić „Wygląda na to, że cię to nie ogranicza!” Dzięki @Philipp!
Stephan
Jaka była liczba klatek na sekundę podczas generowania testu 8192 ^ 2? Jestem ciekawy, jak bardzo wysiłki pokolenia zawiodły system.
Stephan
1
@Stephan Zero FPS. Jak powiedziałem, generacja zajmuje kilka minut. A ponieważ ten skrypt nie pozostawia Updatemetody podczas generowania, gra i edytor Unity zawieszają się do momentu zakończenia generowania. Jeśli chcesz, aby twoja gra reagowała podczas generowania mapy, przenieś generację do coroutine, która generuje jeden kawałek na raz i ustępuje między nimi.
Filip
@Stephan A przy okazji, szybsze może być użycie SetTilesBlock do ustawienia wszystkich kafelków jednocześnie. Ale szybkie wygenerowanie mapy testowej nie było tutaj moim celem.
Filip
O! duh, ok. Z jakiegoś powodu myślałem, że to przerwie. To interesująca myśl. Będę musiał się z tym bawić w ten weekend. Wydaje się, że nie ma jeszcze okropnie wielu wyników dotyczących tej funkcji, ponieważ jest ona tak nowa. Dzięki za dokładną odpowiedź! Już przykuł dużą uwagę. Pomaganie potomności!
Stephan