Berapa batas ukuran untuk Unity 2017.2 Tilemap?

17

Saya telah menggali dokumentasi pada fitur Tilemap dari Unity 2017.2.

Apakah Unity membatasi jumlah ubin maksimum yang akan didukungnya untuk tilemap mesh tertentu?

Saya tahu bahwa setiap ubin dipakai sekali dan digunakan untuk tekstur paha depan pada Tilemap mesh pada saat runtime, jadi saya akan menebak bahwa batas jumlah quad mesh pada akhirnya tergantung pada perangkat keras, dan lebih atau kurang adalah tinggi sewenang-wenang.

Apakah itu asumsi yang benar, atau apakah ada penutup yang keras pada mesin?

Stephan
sumber
1
Mengapa downvote? Ini pertanyaan yang sah.
Philipp

Jawaban:

25

RAM Anda adalah batas Anda .

Tes berikut dilakukan pada sistem dengan spesifikasi ini:

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

Berikut ini adalah skrip yang saya jalankan yang menumbuhkan tilemap dengan mengisinya dengan ubin tunggal (32x32 piksel). Metode Grow()menambahkan kolom lain dan baris lain ke peta saat ini. Metode dipanggil 100 kali setiap pembaruan.

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

Setelah beberapa menit, komputer saya kehabisan memori dan Unity crash. Pada titik itu berada di 8400x8400 (70 juta) ubin dan Unity.exe mengkonsumsi sedikit di atas 11 GB RAM menurut task manager.

Nah, tapi bagaimana dengan peta yang jarang ?

Berikut ini skrip berbeda yang menempatkan ubin tunggal pada peningkatan koordinat x dan y dalam penambahan 100 ubin:

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

Jejak memori Unity.exe sebenarnya meningkat sangat sedikit, yang mengisyaratkan bahwa sel tileset kosong hampir tidak memerlukan RAM. Namun, FPS terus jatuh saat tileset tumbuh. Ini mencapai 60 Fps pada 30000x30000, 30 Fps pada 60000x60000 dan 15 Fps pada 90000x90000. Fps tetap rendah ketika saya menghapus skrip saat tes-game berjalan. Jadi perlambatan ini bukan karena mengubah tilemap. Itu hanya dari rendering itu. Jadi ketika Anda ingin membuat gim dunia terbuka yang sangat besar, Anda mungkin harus menggunakan beberapa tilemaps kecil yang Anda buat dan hancurkan saat runtime.

Kesimpulan: Tilemaps yang besar tetapi sebagian besar kosong tidak menggunakan banyak RAM, tetapi merupakan hambatan rendering , bahkan ketika sebagian besar tidak ada dalam viewport kamera.

Saya kemudian bereksperimen dengan skrip ini yang menghasilkan tilemaps dengan ukuran tertentu:

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

Saya menggunakan skrip ini untuk menghasilkan peta 8192x8192. Butuh beberapa menit, tetapi ketika skrip selesai, itu berjalan pada 95 Fps mantap.

Kesimpulan: Peta dengan jutaan ubin layak, setidaknya pada PC game .

Philipp
sumber
5
Ini adalah jawaban terindah yang pernah saya lihat dalam waktu yang lama. "Ayo cari tahu!" menulis skrip untuk memalu sistem yang menjalankan skrip komputer mulai merokok "Sepertinya itu tidak membatasi Anda!" Terima kasih @Philipp!
Stephan
Apa framerate selama generasi tes 8192 ^ 2? Saya ingin tahu berapa banyak upaya generasi yang menghambat sistem.
Stephan
1
@Stephan Zero FPS. Seperti yang saya katakan, generasi membutuhkan beberapa menit. Dan karena skrip ini tidak meninggalkan Update-metode selama generasi, permainan dan editor Persatuan membeku sampai generasi selesai. Jika Anda ingin gim Anda responsif selama pembuatan peta, pindahkan generasi ke coroutine yang menghasilkan satu keping sekaligus dan menghasilkan di antaranya.
Philipp
@Stephan Dan omong-omong, mungkin lebih cepat menggunakan SetTilesBlock untuk mengatur semua ubin sekaligus. Tetapi menghasilkan peta pengujian dengan cepat bukanlah tujuan saya di sini.
Philipp
Oh! ya, baiklah. Untuk beberapa alasan saya berpikir itu akan mengganggu. Itu pemikiran yang menarik. Saya harus bermain-main dengan itu akhir pekan ini. Sepertinya belum ada banyak hasil yang luar biasa pada fitur ini karena ini sangat baru. Terima kasih atas tanggapan menyeluruh! Sudah mengumpulkan banyak perhatian. Membantu anak cucu!
Stephan