Unity 2017.2 Tilemap'in boyut sınırı nedir?


17

Unity 2017.2'nin Tilemap özelliğindeki belgeleri inceliyorum.

Unity, belirli bir tilemap ağı için destekleyeceği maksimum karo sayısını sınırlıyor mu?

Her bir döşemenin bir kez başlatıldığını ve çalışma zamanında Tilemap ağındaki dörtlüleri dokulandırmak için kullanıldığını biliyorum, bu yüzden örgü dörtlü sayım sınırının nihayetinde donanıma bağlı olduğunu ve az çok keyfi olarak yüksek olduğunu tahmin ediyorum.

Bu doğru bir varsayım mı, yoksa motorda sert bir kapak var mı?


1
Neden inişli çıkışlı? Bu meşru bir soru.
Philipp

Yanıtlar:


25

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 .


5
Bu uzun zamandır gördüğüm en güzel cevap. "Hadi bulalım!" sistem çekiç çalıştırmak için komut dosyaları yazar komut dosyası bilgisayar sigara içmeye başlar "Görünüşe göre sizi sınırlamıyor!" Teşekkürler @Philipp!
Stephan

8192 ^ 2 testinin oluşturulması sırasındaki kare hızı neydi? Üretim çabalarının sistemi ne kadar aşağı çektiğini merak ediyorum.
Stephan

1
@Stephan Zero FPS. Dediğim gibi, nesil birkaç dakika sürüyor. Ve bu betik Updatenesil boyunca-yöntemini bırakmadığından , oyun ve Unity editörü nesil bitene kadar donuyor. Harita oluşturma sırasında oyununuzun duyarlı olmasını istiyorsanız, nesli bir kerede bir yığın oluşturan ve aralarında verim sağlayan bir koroutine taşıyın.
Philipp

@Stephan Ve bu arada, tüm karoları bir kerede ayarlamak için SetTilesBlock'u kullanmak daha hızlı olabilir . Ancak test haritasını hızlı bir şekilde oluşturmak burada amacım değildi.
Philipp

Ah! duh, tamam. Nedense araya gireceğini düşünüyordum. Bu ilginç bir düşünce. Bu hafta sonu onunla oynamak zorundayım. Bu özellikte henüz çok yeni olduğu için çok fazla sonuç yok gibi görünüyor. Kapsamlı yanıt için teşekkürler! Zaten çok dikkat çekti. Gelecek kuşaklara yardım!
Stephan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.