Selama memori bekas pakai (garbage) dikumpulkan kembali, seluruh game berhenti. Cirinya adalah patah-patah dengan interval yang teratur.
Mengapa Setiap frame membuat lalu membuang string, array, dan list sementara → Akibatnya Saat garbage menumpuk, GC menghentikan main thread untuk mengumpulkannya → Di layar Patah-patah secara teratur setiap beberapa detik hingga puluhan detik
Penanggung jawab utama Pengembangan klien (Tim Pengembang Game)
Tugas Tim Pengembang Game
Kurangi alokasi (hindari penggabungan string, LINQ, dan capture lambda), gunakan object pool, biarkan incremental GC aktif (default sejak Unity 2020), jalankan GC lebih awal saat jeda tidak mengganggu, misalnya di layar loading.
Kisaran angka
Biasanya beberapa ms hingga 100 ms sekali jalan; di ponsel spesifikasi rendah atau game yang memakai banyak memori bisa lebih lama (di simulasi sekitar 150–170 ms). GC Unity memeriksa seluruh heap setiap kali berjalan, jadi makin banyak memori yang dipakai game, makin lama jedanya.
Di grafik
Melonjak secara berkala · Frame time, waktu GC berjalan
Yang diperiksa
Di development build, periksa marker GC.Collect dan GC.Alloc di Unity Profiler. Di Unreal, gunakan stat GC dan stat Hitches (mencatat ke log setiap frame yang melewati waktu yang ditetapkan t.HitchFrameTimeThreshold)
Cocok jika
Setiap frame yang melonjak memiliki bagian GC.Collect yang lamanya mirip dengan lama lonjakan, dan intervalnya teratur setiap beberapa detik hingga puluhan detik. GC.Alloc per frame meningkat di tempat ramai
Tidak cocok jika
Tidak ada bagian GC di frame yang melonjak: lebih mungkin “Pemuatan sinkron dan kompilasi shader di main thread” atau “Beban rendering kerumunan besar”
Sarana pemeriksaan
Log dan metrik server atau klien game
Pelajari lebih lanjut
Umum di klien yang memakai C# seperti Unity. Penyebab utamanya adalah kode yang membuat ulang string log pertempuran, angka damage, dan teks UI di setiap frame. Jika patah-patah hanya terjadi di tempat ramai, berarti ada kode yang menghasilkan garbage sebanding dengan jumlah pemain. Incremental GC membagi pengumpulan sedikit demi sedikit per frame (default Unity 3 ms), tetapi jika garbage dibuat lebih cepat daripada kecepatan pengumpulannya, akhirnya game tetap berhenti sekaligus. Unreal Engine juga punya GC sendiri yang membersihkan game object yang tidak dipakai. Perilakunya berbeda menurut versi engine dan pengaturannya, tetapi dengan pengaturan default GC ini berjalan kira-kira setiap 1 menit dan bisa membuat game tersendat sesaat dengan interval 1 menit. Klien yang menulis aturan game dalam skrip seperti Lua juga menjalankan GC skrip itu secara terpisah.
Sumber
Garbage collection modesUnity Incremental GC adalah default dan mengumpulkan garbage secara terbagi di beberapa frame; jika dimatikan, main thread berhenti selama seluruh heap diperiksa dan jedanya bisa mencapai ratusan ms
Profiler markers referenceUnity GC.Collect: bagian saat kode program berhenti selama garbage collection (kurang dari 1 ms hingga ratusan ms), GC.Alloc: alokasi managed heap
Stat Commands in Unreal EngineEpic Games stat GC (statistik garbage collection), stat Hitches (mencatat ke log frame yang melewati t.HitchFrameTimeThreshold)