Unity Eğitim
Dersler
Forum Sınav Merkezi Premium 💎
C# Dersleri

Unity Profiling ile CPU ve GPU Performansını İnceleme

Paylaşan: Unity Eğitim 21 October 2025 9 dakika okuma 145 görüntülenme

Oyun geliştirme sürecinde performans, oyuncu deneyiminin temel taşlarından biridir. Akıcı olmayan, takılan veya yavaş çalışan bir oyun, en iyi fikirlere sahip olsa bile oyuncuları hızla uzaklaştırabilir. İşte bu noktada Unity Profiling devreye girer. Unity Profiler, oyununuzun çalışma zamanı performansını detaylı bir şekilde analiz etmenizi sağlayan güçlü bir araçtır. Bu makalede, özellikle CPU ve GPU performans darboğazlarını nasıl tespit edeceğinize ve optimize edeceğinize odaklanacağız.

Unity Profiling Nedir ve Neden Önemlidir?


Unity Profiler, oyununuzun farklı bileşenlerinin (CPU, GPU, bellek, fizik, ses, ağ vb.) belirli bir anda ne kadar kaynak tükettiğini gösteren bir analiz aracıdır. Bu araç sayesinde, oyununuzun en çok nerede zorlandığını, hangi kod parçalarının veya varlıkların performansı olumsuz etkilediğini kolayca görebilirsiniz. Performans sorunlarını gözlemlerle tahmin etmek yerine, somut verilerle tespit etmek, doğru ve etkili optimizasyonlar yapmanın tek yoludur. Unity Profiling, oyununuzun sadece iyi görünmesini değil, aynı zamanda iyi hissettirmesini de sağlar.

Unity Profiler Arayüzüne Genel Bakış


Unity Profiler'ı açmak için Unity Editöründe Window > Analysis > Profiler yolunu izleyebilirsiniz. Profiler penceresi, oyununuz çalışırken çeşitli grafikler ve veriler sunar. En üstte, farklı modüller arasında geçiş yapabileceğiniz sekmeler bulunur: CPU Usage, GPU Usage, Memory, Rendering, Audio, Physics, UI vb. Her bir sekme, ilgili bileşenin performans verilerini gösterir.

Özellikle CPU Usage ve GPU Usage sekmeleri, oyununuzun genel performansını anlamak için kritik öneme sahiptir. Profiler'ı kullanırken, Deep Profile seçeneğine dikkat edin. Bu seçenek, Unity'nin her bir fonksiyon çağrısını profilleyerek daha detaylı bilgi sağlar ancak kendisi de önemli bir performans yükü oluşturur. Bu nedenle, genellikle belirli bir alanı derinlemesine incelemek istediğinizde kısa süreliğine açıp, işiniz bitince kapatmanız önerilir.

CPU Performansını Anlamak ve Analiz Etmek


CPU Usage sekmesi, merkezi işlem biriminizin (CPU) oyununuzu çalıştırmak için ne kadar meşgul olduğunu gösterir. Buradaki ana grafikler, oyununuzun ana iş parçacığı (Main Thread), render iş parçacığı (Render Thread) ve diğer arka plan iş parçacıklarının zaman içinde nasıl davrandığını gösterir. Yüksek CPU kullanımı, genellikle takılmalara (stutter) veya düşük kare hızlarına (FPS) neden olur.

Yaygın CPU Darboğazları:



  • Garbage Collection (GC): C# dilinde otomatik bellek yönetimi (çöp toplama), gereksiz nesneleri temizlerken kısa süreli duraklamalara neden olabilir. Profiler'da GC.Alloc çağrıları görüyorsanız, bu genellikle her frame'de yeni bellek ayrıldığı anlamına gelir ve optimize edilmesi gerekir.

  • Physics.Simulate: Fizik motorunun karmaşık çarpışma hesaplamaları veya çok sayıda fizik nesnesi, CPU'yu zorlayabilir.

  • Animator.Update: Çok sayıda veya karmaşık animasyonlar, karakter iskeletlerinin güncellenmesi CPU'da yük oluşturabilir.

  • Script.Update/FixedUpdate/LateUpdate: Kendi yazdığınız komut dosyalarınızdaki pahalı işlemler (örneğin, her frame'de GetComponent çağırmak, karmaşık algoritmalar çalıştırmak) CPU'yu yorabilir.

  • Batching: Unity'nin draw call'ları gruplama (batching) mekanizmaları (Dynamic Batching, Static Batching), CPU üzerinde de bir miktar maliyet oluşturur. Eğer batching düzgün çalışmıyorsa, CPU'da gereksiz iş yükü oluşabilir.


Profiler'daki Hierarchy (Hiyerarşi) ve Timeline (Zaman Çizelgesi) görünümleri, CPU darboğazlarını tespit etmede çok yardımcıdır. Hiyerarşi görünümü, bir frame içinde hangi fonksiyonların ne kadar zaman aldığını ağaç yapısında gösterirken, Zaman Çizelgesi görünümü, fonksiyon çağrılarının zaman içindeki dağılımını görselleştirir.

Kod Örneği (GC.Alloc Optimizasyonu):


Her frame yeni bir string oluşturmak, sık görülen bir GC.Alloc nedenidir:
// Kötü örnek: Her frame yeni string oluşturma
void Update()
{
string message = "Current time: " + Time.time.ToString(); // Her frame yeni string oluşturur
// ... bu 'message' ile bir şeyler yap
}

// İyi örnek: StringBuilder kullanma veya önbelleğe alma
System.Text.StringBuilder sb = new System.Text.StringBuilder();
void UpdateOptimized()
{
sb.Clear();
sb.Append("Current time: ");
sb.Append(Time.time.ToString());
string message = sb.ToString(); // Sadece bir kez string oluşturulur
// ... bu 'message' ile bir şeyler yap
}


GPU Performansını Anlamak ve Analiz Etmek


GPU Usage sekmesi, grafik işlem biriminizin (GPU) oyununuzun görsel öğelerini işlemek için ne kadar meşgul olduğunu gösterir. Yüksek GPU kullanımı, genellikle düşük kare hızlarına veya görsel takılmalara neden olabilir. GPU, render iş parçacığından (Render Thread) gelen komutları işler. Eğer Render Thread, GPU'ya çok fazla iş gönderiyorsa, GPU darboğazı oluşabilir.

Yaygın GPU Darboğazları:



  • Overdraw (Fazla Çizim): Bir pikselin birden fazla kez çizilmesi durumu. Şeffaf nesneler, parçacık efektleri ve karmaşık UI öğeleri overdraw'a yol açabilir.

  • Batch Count (Draw Call Sayısı): CPU'dan GPU'ya gönderilen çizim komutlarının sayısı. Yüksek draw call sayısı, GPU'yu meşgul eder ve performansı düşürür. Unity'nin batching mekanizmaları (Static Batching, Dynamic Batching, SRP Batcher) bu sayıyı azaltmayı hedefler.

  • Texture Memory (Doku Boyutu): Yüksek çözünürlüklü veya sıkıştırılmamış dokular, GPU belleğini hızla doldurabilir ve yükleme sürelerini artırabilir.

  • Karmaşık Shader'lar: Çok fazla hesaplama yapan veya çok sayıda ışık kaynağını işleyen shader'lar GPU'yu yorabilir.

  • Post-processing Efektleri: Ekran sonrası efektler (Bloom, Depth of Field, Anti-aliasing vb.) görsel kaliteyi artırırken GPU üzerinde önemli bir yük oluşturur.


GPU darboğazlarını teşhis etmek için Profiler'ın yanı sıra Window > Analysis > Frame Debugger aracını kullanmak da çok faydalıdır. Frame Debugger, bir frame'in nasıl çizildiğini adım adım göstererek overdraw, draw call'lar ve shader karmaşıklığı gibi sorunları görselleştirmenize olanak tanır.

Pratik İpuçları



  1. Sadece Editörde Değil, Cihazda Test Edin: Unity Editörü, oyununuzu çalıştırırken kendi içinde ek bir yük oluşturur. En doğru performans verilerini almak için, oyununuzu hedeflediğiniz cihazda (PC, mobil, konsol) derleyip orada Unity Profiling yapın. Unity Hub veya Android Studio gibi araçlarla doğrudan cihazdan profilleyebilir veya bir Development Build oluşturup bağlayabilirsiniz.

  2. Adım Adım İzolasyon: Profiler'da bir darboğaz gördüğünüzde, tüm oyunu optimize etmeye çalışmak yerine, sorunun kaynağını adım adım izole edin. Örneğin, bir sahnenin belirli bir bölümünde mi, belirli bir objede mi yoksa belirli bir kod parçasında mı sorun var? Bu, daha hedefe yönelik optimizasyonlar yapmanızı sağlar.

  3. Deep Profile'ı Dikkatli Kullanın: Deep Profile, çok detaylı bilgi sağlasa da, kendisi de önemli bir performans düşüşüne neden olur. Bu nedenle, genel bir bakış için kapalı tutun ve yalnızca belirli bir fonksiyon çağrısını derinlemesine incelemeniz gerektiğinde kısa süreliğine açın.

  4. Frame Debugger'dan Yararlanın: GPU performans sorunlarını çözmek için Frame Debugger vazgeçilmez bir araçtır. Overdraw alanlarını, draw call sıralamasını ve her bir çizim çağrısının maliyetini görmenizi sağlar. Bu sayede, hangi geometrinin veya shader'ın GPU'yu en çok zorladığını anlayabilirsiniz.


Yaygın Hatalar ve Çözümleri



  • Hata 1: Her Frame Yeni Bellek Ayırmak (GC.Alloc): Özellikle string birleştirme, geçici listeler oluşturma veya new anahtar kelimesini sıkça kullanma.
    Çözüm: Nesne havuzlama (object pooling), StringBuilder kullanma, koleksiyonları önbelleğe alma ve tekrar kullanma.

  • Hata 2: Update İçinde Pahalı İşlemler: Her frame'de GetComponent çağırmak, karmaşık raycast'ler yapmak veya pahalı matematiksel hesaplamalar.
    Çözüm: Awake veya Start metodunda referansları önbelleğe alın. Karmaşık algoritmaları daha seyrek çalışan metodlara taşıyın (örn: FixedUpdate, Coroutine'ler) veya optimize edin.

  • Hata 3: Yüksek Poligonlu Modeller ve Büyük Dokular: Özellikle mobil platformlarda performans katili olabilirler.
    Çözüm: LOD (Level of Detail) grupları kullanın, doku sıkıştırma ayarlarını optimize edin, doku atlaslama ile draw call'ları azaltın.

  • Hata 4: Aşırı Draw Call Sayısı: Sahnedeki çok sayıda ayrı materyal, küçük nesneler veya şeffaf objeler.
    Çözüm: Static/Dynamic Batching'i doğru kullanın, SRP Batcher'dan faydalanın (URP/HDRP kullanıyorsanız), Occlusion Culling ve Frustum Culling ile görünmeyen objeleri render etmeyin.


Performans ve Optimizasyon Notları


Performans optimizasyonu, tek seferlik bir görev değil, oyun geliştirme sürecinin ayrılmaz bir parçasıdır. Geliştirmenin her aşamasında Unity Profiling yaparak olası darboğazları erken tespit etmek, ilerleyen zamanlarda çok daha büyük sorunların önüne geçebilir. Hedeflediğiniz platformun donanım kısıtlamalarını her zaman göz önünde bulundurun. Mobil oyunlar için masaüstü oyunlarına göre çok daha sıkı optimizasyonlar gerekebilir.

Unity, performansı artırmak için birçok yerleşik araç sunar: LOD Group bileşeni, Occlusion Culling, Lightmap'ler, GPU Instancing gibi. Bu araçları doğru bir şekilde kullanmak, önemli performans kazanımları sağlayabilir.

Sonuç olarak, Unity Profiler, oyunlarınızın performansını anlamak ve geliştirmek için size rehberlik eden vazgeçilmez bir araçtır. CPU ve GPU performansını düzenli olarak analiz ederek, oyuncularınıza daha akıcı ve keyifli bir deneyim sunabilirsiniz. Unutmayın, optimizasyon bir sanattır ve sürekli pratikle ustalaşılır!

🧠 Ders Sonu Değerlendirme Testi

Dersi tamamladıktan sonra bilgilerinizi test edin ve ekstra puanlar kazanın.

🔥 +50 XP Ödül
🔒

Sınava Katılmak İçin Giriş Yapın

Bu ders sonu testini çözebilmek, bilginizi test edip **+50 XP** kazanmak ve **Sınav Şampiyonu** rozetinin kilidini açmak için üye girişi yapmalısınız.

Yorumlar (0)

Yorum yazabilmek ve derslere katkıda bulunabilmek için giriş yapmalısınız.

İlk yorumu siz yapın!