Oyununuz belirli anlarda takılıyor (stutter). Unity Profiler ve Frame Debugger ile sorunu nasıl bulursunuz?

Cevap

Yöntem: önce ölç, sonra tahmin et. Hedef cihazda (özellikle mobilde editör değil gerçek cihazda) Development Build ile profil alınır ve darboğazın CPU mu, GPU mu, bellek mi olduğu ayrıştırılır.

  1. Profiler'ı cihaza bağla: Development Build + Autoconnect Profiler. Editörde profil almak editörün kendi yükü yüzünden yanıltıcıdır.
  2. Spike karesini bul: CPU Usage grafiğinde zirve yapan kareyi seç, Hierarchy görünümünde Time ms ve GC Alloc sütunlarına göre sırala.
  3. Tipik suçluları ele: Aşağıdaki tablodaki işaretlere bak.
  4. Detay için: Timeline görünümü (thread'ler arası ilişki), Deep Profile (pahalı, kısa süreli kullan), kendi kodunda ProfilerMarker ile işaretleme.
  5. GPU tarafı için Frame Debugger: Kareyi draw call draw call oynatır; neden batch kırıldığını ("Why this draw call can't be batched"), gereksiz pass'leri ve render sırasını gösterir. Daha derin GPU analizi için RenderDoc, Xcode GPU capture veya Android GPU Inspector kullanılır.
  6. Bellek: Memory Profiler paketiyle snapshot alıp karşılaştırarak sızıntıları bul.
Profiler'da görülenOlası sebep
GC.Collect spike'ıKare başı allocation: string birleştirme, LINQ, boxing
Physics.Simulate yüksekÇok sayıda collider, mesh collider, çok sık fixed timestep
Instantiate / Awake spike'ıPooling eksik
Gfx.WaitForPresent yüksekCPU GPU'yu bekliyor, darboğaz GPU'da
static readonly ProfilerMarker s_AiMarker = new ProfilerMarker("EnemyAI.Think");
void Update()
{
    using (s_AiMarker.Auto()) { Think(); }
}

Sonuç: Düzeltmeden sonra aynı senaryoda tekrar ölçüp iyileştirmeyi sayıyla doğrularım.

  1. Unity'de Update, FixedUpdate ve LateUpdate arasındaki fark nedir?KolayUnity & C#Game Dev
  2. GetComponent çağrılarını neden önbelleğe almalısınız?KolayUnity & C#Game Dev
  3. Rigidbody, physics layer'lar ve raycast nasıl çalışır? FixedUpdate neden önemlidir?OrtaUnity & C#Game Dev
  4. C# delegate, event ve UnityEvent arasındaki farklar nelerdir?OrtaUnity & C#Game Dev
  5. Unity'de garbage collection neden frame düşüşüne yol açar? Update içinde allocation'dan nasıl kaçınırsınız?ZorUnity & C#Game Dev
  6. C#'ta struct ile class arasındaki fark nedir? Value type ve reference type oyunda neden önemlidir?OrtaUnity & C#Game Dev

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle