Mobil Oyun Optimizasyonu: Draw Calls Düşürme Teknikleri
Mobil cihazlarda CPU ve GPU gücü masaüstüne göre daha sınırlıdır. Bu yüzden oyun geliştirirken draw call (çizim çağrısı) sayısını düşük tutmak, akıcı FPS için en kritik optimizasyonlardan biridir. Özellikle Unity gibi motorlarda, sahnede “aynı karede kaç ayrı çizim işi gönderildiği” performansı doğrudan etkiler.
Draw Call Nedir ve Neden Önemlidir?
Draw call, CPU’nun GPU’ya “şu mesh’i, şu materyal/şader ile, şu texture’larla çiz” diye gönderdiği komuttur. Kulağa basit gelse de draw call sayısı arttıkça CPU tarafında hazırlık yükü büyür; GPU da sık sık state change (özellikle materyal/şader/texture değişimi) yaşadığı için verimli çalışamaz.
En pahalı senaryolardan biri şudur: Aynı karede onlarca hatta yüzlerce objede sürekli materyal değişimi yapmak. Çünkü her materyal değişimi, GPU’nun farklı bir “çizim durumuna” geçmesini ister.
Unity’de Draw Call’ları Nasıl Takip Edersiniz?
- Stats penceresi: Game view’da sağ üstte (Editor) temel draw call/tri sayıları.
- Profiler: Rendering bölümünde CPU/GPU yükünü ayrıntılı görürsünüz.
- Frame Debugger: Kare kare hangi draw call’ların atıldığını ve neden bölündüğünü gösterir.
İpucu: Draw call’ı azaltırken “körlemesine” değil, Frame Debugger ile neden bölündüğünü anlayarak ilerlemek en hızlı yoldur.
1) Texture Atlas Kullanımı
En etkili ve en kolay uygulanabilir yöntemlerden biri texture atlas kullanmaktır. Birden fazla küçük görseli (UI butonları, ikonlar, karakter parçaları, environment detayları) tek bir büyük görselde birleştirirsiniz. Böylece Unity, mümkün olan durumlarda bu görselleri tek materyal + tek texture ile çizdirebilir.
Texture Atlas Ne Kazandırır?
- Materyal/texture değişimi azalır → draw call sayısı düşer.
- UI tarafında özellikle büyük fark yaratır (çok sayıda ikon/buton).
- Mobilde FPS dalgalanmaları azalır, daha stabil kare süreleri elde edilir.
Performans artışı proje yapısına bağlıdır: doğru atlas kullanımı bazı sahnelerde gözle görülür fark yaratabilir (örneğin çok sayıda UI elemanı olan menülerde veya “parçalı” sprite kullanan oyunlarda). Ancak “%40 her zaman” gibi kesin bir değer vermek doğru olmaz; sonuç sahnenin draw call probleminin kaynağına göre değişir.
Unity’de Atlas Uygulaması
- Sprite Atlas (2D/UI için): Unity’nin yerleşik çözümüdür.
- 3D texture atlas: Dış araçlarla (TexturePacker vb.) veya kendi pipeline’ınızla oluşturulabilir.
Dikkat Edilmesi Gerekenler
- Aynı materyal kullanılmalı: Atlas tek başına yetmez; farklı shader/material varsa draw call yine bölünür.
- Boyut seçimi: Çok dev atlaslar bellek tüketir. Mobil için genelde 1024/2048 dengesi tercih edilir.
- MipMap/Compression: Doğru sıkıştırma formatları (ASTC/ETC2 vb.) bellek ve bant genişliğini iyileştirir.
- Padding: Sprite bleeding (kenarlardan taşma) olmaması için atlas padding önemlidir.
2) Materyal Sayısını Azaltın
Draw call’ların en büyük düşmanı genellikle materyal çeşitliliğidir. Aynı görünen objelerde bile farklı materyal instance’ları varsa batching bozulabilir.
- Aynı shader + aynı texture seti ile tek materyali paylaşın.
- “Material (Instance)” çoğalıyorsa sebebini bulun (renk/parametre değişimi, runtime set işlemleri vb.).
- Objeye özel renk gerekiyorsa materyal klonlamak yerine MaterialPropertyBlock gibi yöntemleri değerlendirin (pipeline’a göre).
3) Batching’i Doğru Kullanın
Static Batching
Hareket etmeyen objeler (binalar, dekor, zemin parçaları) için Unity’nin Static işaretlemesi ile static batching devreye girebilir. Bu, benzer materyal kullanan statik mesh’leri gruplayarak draw call’ı düşürür.
Dynamic Batching
Küçük ve benzer mesh’ler için (özellikle basit geometri) dynamic batching işe yarayabilir. Ancak her projede sihirli çözüm değildir; mobilde CPU maliyeti artabileceği için profiler ile kontrol edin.
SRP Batcher / GPU Instancing
URP/HDRP kullanıyorsanız SRP Batcher ve GPU Instancing doğru konfigürasyonla ciddi kazanım sağlayabilir. Özellikle çok sayıda “aynı objeden” (ağaç, taş, çalı, mermi vb.) olan sahnelerde instancing öne çıkar.
4) Mesh Birleştirme (Mesh Combining)
Çok sayıda küçük 3D objeyi tek tek çizdirmek yerine, uygun durumlarda mesh’leri birleştirerek draw call’ı azaltabilirsiniz. Bu özellikle environment parçalarında faydalıdır.
- Birleştirme sonrası culling (kamera dışında kalanları çizmemek) davranışı değişebilir, dikkatli olun.
- Çok büyük tek mesh bazen ters tepebilir; “mantıklı gruplar” daha iyi sonuç verir.
5) UI Tarafında Draw Call Düşürme
Mobil oyunlarda menüler bile FPS’i öldürebilir. UI’da draw call’lar genelde şu sebeplerle artar:
- Farklı sprite/texture kullanımı (atlas yoksa)
- Çok fazla Canvas / yanlış Canvas bölünmesi
- Mask / Outline / Shadow gibi efektlerin aşırı kullanımı
- Farklı font/material kombinasyonları
UI İçin Pratik İpuçları
- UI sprite’larını Sprite Atlas içine alın.
- Tek bir büyük Canvas yerine, sık değişen UI öğelerini ayrı Canvas’ta tutarak “rebuild” maliyetini azaltın.
- Gereksiz mask/outline efektlerinden kaçının; mobilde pahalı olabilir.
6) Şeffaflık ve Overdraw’ı Azaltın
Draw call düşürmek kadar önemli başka bir konu da overdraw (üst üste şeffaf katman çizimi) olabilir. Özellikle:
- Şeffaf UI katmanları
- Partiküller
- Transparent shader’lar
Bu öğeler sahnede fazla ise draw call düşük olsa bile GPU dolabilir. Bu yüzden şeffaf öğeleri sadeleştirmek, partikül sayısını azaltmak ve mümkünse “opaque” çözümleri tercih etmek mobilde altın değerindedir.
Hızlı Kontrol Listesi
- Sprite/UI görselleri atlaslandı mı?
- Gereksiz materyal çeşitliliği var mı? “Material (Instance)” şişiyor mu?
- Statik objeler Static işaretli mi ve batching çalışıyor mu?
- Çok sayıda aynı objede GPU instancing uygun mu?
- UI’da Canvas yapısı doğru mu, mask/outline gereksiz mi?
- Şeffaflık ve partiküllerde overdraw aşırı mı?
- Frame Debugger’da draw call’ların bölünme nedeni net mi?
Sonuç
Mobil oyun optimizasyonunda draw call sayısını düşürmek, daha stabil FPS ve daha düşük pil tüketimi demektir. En hızlı kazanımlar genellikle texture atlas + materyal sadeleştirme + doğru batching üçlüsünden gelir. Ardından UI, instancing ve mesh birleştirme gibi adımlarla optimizasyonu derinleştirebilirsiniz.