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 .