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.
- 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.
- Spike karesini bul: CPU Usage grafiğinde zirve yapan kareyi seç, Hierarchy görünümünde
Time msve GC Alloc sütunlarına göre sırala. - Tipik suçluları ele: Aşağıdaki tablodaki işaretlere bak.
- Detay için: Timeline görünümü (thread'ler arası ilişki),
Deep Profile(pahalı, kısa süreli kullan), kendi kodundaProfilerMarkerile işaretleme. - 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.
- Bellek: Memory Profiler paketiyle snapshot alıp karşılaştırarak sızıntıları bul.
| Profiler'da görülen | Olası 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üksek | CPU 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.
İlgili Unity & C# soruları
- Unity'de Update, FixedUpdate ve LateUpdate arasındaki fark nedir?
- GetComponent çağrılarını neden önbelleğe almalısınız?
- Rigidbody, physics layer'lar ve raycast nasıl çalışır? FixedUpdate neden önemlidir?
- C# delegate, event ve UnityEvent arasındaki farklar nelerdir?
- Unity'de garbage collection neden frame düşüşüne yol açar? Update içinde allocation'dan nasıl kaçınırsınız?
- C#'ta struct ile class arasındaki fark nedir? Value type ve reference type oyunda neden önemlidir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.