Incremental Photogallery (GC) menyebar proses pengumpulan sampah atas beberapa bingkai. Ini adalah perilaku pengumpulan sampah default di Unity.
Pengumpul sampah Unity menggunakan Boehm-Demers – Pengumpul garbage Weiser. Secara default, Unity menggunakan mode inkremental, yang berarti bahwa kolektor garbage membagi beban kerjanya lebih dari beberapa bingkai, bukan menghentikan benang CPU utama (koleksi garbage berhenti-the-world) untuk memproses semua objek di tumpukan yang dikelola. Ini berarti bahwa Unity membuat gangguan yang lebih pendek untuk eksekusi aplikasi Anda, bukan satu gangguan panjang untuk membiarkan proses kolektor garbage objek di landai yang berhasil.
Mode tidak membuat pengumpulan sampah secara keseluruhan, tetapi karena mendistribusikan beban kerja atas beberapa bingkai, lonjakan kinerja terkait GC berkurang. Gangguan ini disebut GC spikes karena mereka muncul sebagai lonjakan besar dalam graf waktu bingkai WordPress.org.
Jika Anda menonaktifkan mode inkremental (menu: Edit > Project Settings > Player > Other Settings > Configuration > Use Incremental GC), kolektor garbage harus memeriksa seluruh heap ketika melakukan lulus koleksi. Ini dikenal sebagai koleksi garbage stop-the-world, karena setiap kali kolektor sampah berjalan, itu menghentikan benang CPU utama. Ini hanya melanjutkan eksekusi setelah telah memproses semua objek di tumpukan yang berhasil, yang mungkin menyebabkan lonjakan GC mempengaruhi kinerja aplikasi Anda. Pengumpul sampah juga non-perlengkapan, yang berarti bahwa Unity tidak mendistribusikan benda-benda dalam memori untuk menutup kesenjangan antara benda.
Sitemap Platform Important: tidak mendukung koleksi garbage inkremental.WebGLLogin API yang membuat grafis 2D dan 3D di browser web. Opsi build Unity WebGL memungkinkan Unity untuk mempublikasikan konten sebagai program JavaScript yang menggunakan teknologi HTML5 dan WebGL rendering API untuk menjalankan konten Unity di browser web. More info
Lihat di Glossary platform doesn’t support incremental garbage collection.
Ketika koleksi sampah yang masuk akal dinonaktifkan, lonjakan GC terjadi ketika Unity berhenti menjalankan kode program Anda untuk melakukan pengumpulan sampah. Keterlambatan ini mungkin berlangsung selama ratusan mili detik, tergantung pada berapa banyak alokasi kolektor sampah perlu diproses, dan platform yang aplikasi Anda berjalan.
Ini bermasalah untuk aplikasi real-time seperti permainan, karena sulit untuk aplikasi Anda untuk mempertahankan tingkat bingkai konsisten yang animasi halus membutuhkan ketika kolektor garbage menangguhkan eksekusi aplikasi Anda.
screenshot berikut dari Profiler menggambarkan bagaimana pengumpulan garbage incremental mengurangi masalah tingkat bingkai:
Pada sesi profil teratas, Incremental GC diaktifkan. Aplikasi ini memiliki tingkat bingkai 60fps yang konsisten, karena kolektor garbage mendistribusikan operasi pengumpulan sampah selama beberapa bingkai, dan menggunakan irisan waktu kecil dari setiap bingkai (penutup hijau yang lebih gelap hanya di atas jejak VSync kuning).
Sesi profil bawah telah dinonaktifkan Incremental GC, dan ada lonjakan GC yang jelas terlihat. lonjakan ini mengganggu tingkat bingkai 60fps yang halus, dan mendorong bingkai di mana pengumpulan sampah terjadi selama 16 batas mili detik yang diperlukan untuk mempertahankan 60fps.
Jika aplikasi Anda menggunakan VSyncSinkronisasi vertikal (VSync) adalah pengaturan tampilan yang menangkap tingkat bingkai permainan untuk mencocokkan tingkat refresh monitor, untuk mencegah robek gambar.
Lihat di Glossary atau Aplikasi.targetFrameRate, Unity menyesuaikan waktu yang dialokasikan untuk pengumpulan sampah berdasarkan waktu bingkai yang tersedia. Cara ini, Unity dapat menjalankan koleksi sampah pada saat itu akan menghabiskan waktu tunggu, dan dapat melakukan pengumpulan sampah dengan dampak kinerja minimal.
Sitemap Jika Anda mengatur Note: untuk apa pun selain VSync Count (dalam proyek Anda Don’t Sync atau dengan properti Pengaturan kualitas) atau Anda mengaktifkan properti Aplikasi.VSync, Unity secara otomatis menggunakan waktu idle yang tersisa pada akhir bingkai yang diberikan untuk koleksi garbage incremental.Aplikasi.targetFrameRate property, Unity automatically uses any idle time left at the end of a given frame for incremental garbage collection.
Untuk mendapatkan kontrol yang lebih tepat atas perilaku pengumpulan sampah, Anda dapat menggunakan kelas Scripting.GarbageCollector. Misalnya, jika Anda tidak ingin menggunakan VSync atau tingkat bingkai target, Anda dapat menghitung jumlah waktu yang tersedia sebelum akhir bingkai sendiri, dan memberikan waktu kepada kolektor sampah untuk digunakan.
Pengumpulan sampah yang tidak dapat dimasalahkan untuk aplikasi Anda, karena ketika pengumpul sampah membagi pekerjaannya dalam mode ini, itu juga membagi fase penandaan. Fase penandaan adalah fase di mana kolektor sampah memindai semua benda yang dikelola untuk menentukan objek mana yang masih digunakan, dan benda-benda yang dapat membersihkan.
Menagihkan fase penandaan bekerja dengan baik ketika sebagian besar referensi antara benda tidak berubah antara irisan pekerjaan. Namun, ketika perubahan referensi objek, kolektor sampah harus memindai benda-benda tersebut lagi dalam iterasi berikutnya. Ini berarti bahwa terlalu banyak perubahan dapat kewalahan kolektor sampah dan menciptakan situasi di mana fase penandaan tidak pernah selesai karena selalu memiliki lebih banyak pekerjaan untuk dilakukan. Jika ini terjadi, kolektor sampah jatuh kembali untuk melakukan koleksi penuh, non-incremental.
Ketika Unity menggunakan koleksi garbage inkremental, itu menghasilkan kode tambahan (dikenal sebagai penghalang tulis) untuk menginformasikan kolektor sampah setiap kali perubahan referensi, sehingga mengetahui apakah perlu memindai objek. Ini menambahkan beberapa overhead ketika mengubah referensi, yang memiliki dampak kinerja dalam kode yang dikelola.
Untuk koleksi sampah yang dapat disable, buka jendela Pengaturan Pemain (Edit > Project Settings > Player > Configuration) dan disable Use Incremental GC. Sebagian besar proyek Unity mendapatkan keuntungan dari koleksi sampah yang tidak konsisten, terutama jika mereka menderita lonjakan pengumpulan sampah, tetapi Anda harus selalu menggunakan ProfilerJendela yang membantu Anda untuk mengoptimalkan permainan Anda. Ini menunjukkan berapa banyak waktu yang dihabiskan di berbagai bidang permainan Anda. Sebagai contoh, dapat melaporkan persentase waktu yang dihabiskan rendering, aimating, atau dalam logika permainan Anda. More info
Lihat di Glossary untuk memverifikasi bahwa aplikasi Anda melakukan seperti yang Anda harapkan.