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?


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 .


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.