RAM'iniz sınırınız .
Bu özelliklere sahip bir sistem üzerinde aşağıdaki testler yapıldı:
- Intel i5-6600
- 16 GB RAM
- NVIDIA GeForce GTX 1070
- Windows 7 Home Premium
İşte tek bir döşemeyle (32x32 piksel) doldurarak bir tilemap yetiştiren bir komut dosyası. Yöntem Grow()
geçerli haritaya başka bir sütun ve başka bir satır ekler. Yöntem her güncellemenin 100 katı olarak çağrılır.
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++;
}
}
Birkaç dakika sonra bilgisayarımın belleği doldu ve Unity çöktü. Bu noktada, 8400x8400 (70 milyon) fayanstaydı ve görev yöneticisine göre Unity.exe 11 GB RAM'in biraz üzerindeydi.
Peki ama seyrek haritalar?
Burada, 100 döşemenin artışlarında x ve y koordinatlarını artıran tek bir döşemeyi yerleştiren farklı bir komut dosyası vardır:
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;
}
}
Unity.exe'nin bellek ayak izi aslında çok az arttı, bu da boş fayans seti hücrelerinin neredeyse hiç RAM gerektirmediğini ima ediyor. Bununla birlikte, fayans seti büyürken FPS düşmeye devam etti. 30000x30000'de 60 Fps, 60000x60000'de 30 Fps ve 90000x90000'de 15 Fps'ye çarptı. Test oyunu çalışırken betiği kaldırdığımda Fps bu kadar düşük kaldı. Yani bu yavaşlama, tilemapı değiştirmekten değildi. Sadece render etmekten ibaretti. Bu nedenle, gerçekten büyük bir açık dünya oyunu oluşturmak istediğinizde, çalışma zamanında oluşturup yok ettiğiniz birden fazla küçük tilemap kullanmanız gerekebilir.
Sonuçlar: Büyük ama çoğunlukla boş tilemaps çok fazla RAM kullanmaz, ancak çoğu kamera görünümünde olmasa bile , bir oluşturma darboğazıdır .
Daha sonra belirli bir boyutta tilemaps üreten bu komut dosyası ile denedim:
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);
}
}
}
}
Bu komut dosyasını bir 8192x8192 haritası oluşturmak için kullandım. Birkaç dakika sürdü, ancak senaryo bittiğinde sabit 95 Fps'de çalıştı.
Sonuç: Milyonlarca döşemeye sahip haritalar, en azından oyun bilgisayarlarında uygulanabilir .