한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Buku Putih Lag Game › L1 Proses game di klien

Garbage collection di klien Client GC (Unity C#, Unreal, Lua)

ID penyebab cg-gc · Penanggung jawab utama Pengembangan klien (Tim Pengembang Game)

Buka kartu interaktif dengan gambar dan simulasi →

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

Gejala
Patah-patah, Freeze
Faktor
Stall
Siapa yang mengalami
Hanya saya
Kapan
Secara berkala, Saat banyak pemain berkumpul
Penanggung jawab
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

  1. Garbage collection modes Unity
    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
  2. Scripting.GarbageCollector.CollectIncremental Unity
    Target default waktu yang dipakai incremental GC sekali jalan (time slice) adalah 3 ms (incrementalTimeSliceNanoseconds)
  3. Garbage Collection Settings in the Unreal Engine Project Settings Epic Games
    Pengaturan bahwa GC Unreal berjalan pada interval tertentu (Time Between Purging Pending Kill Objects, dalam detik). Nilai default tidak disebutkan di dokumen ini
  4. Profiler markers reference Unity
    GC.Collect: bagian saat kode program berhenti selama garbage collection (kurang dari 1 ms hingga ratusan ms), GC.Alloc: alokasi managed heap
  5. Stat Commands in Unreal Engine Epic Games
    stat GC (statistik garbage collection), stat Hitches (mencatat ke log frame yang melewati t.HitchFrameTimeThreshold)

Lihat juga

Lapisan yang sama: L1 Proses game di klien

Penyebab di lapisan lain dengan gejala yang sama (Patah-patah)

Lihat kartu interaktif dengan gambar dan simulasi