Unityde Draw Call Optimizasyonu

EmreDogan
3 min readAug 24, 2023

--

Oyununuzda düşük kare hızı varsa, cihazınız ısınıyor ve cihazınızın pili çabuk tükeniyorsa büyük ihtimalle Çizim çağrılarınız(Draw Call) fazladır.

Draw Call : Çizim çağrısı, bir ağı işlemek için kullanılan bir komuttur. CPU tarafından verilir. GPU tarafından alınır.
Komut verildikten sonra GPU, oluşturma durumu değerlerini (material, texture, shader …) ve tüm köşe verilerini alır , bu bilgileri ekranınızdaki piksellere dönüştürür.

Render İstatistik Penceresi

Çizim çağrılarını görmek için en basit yöntem , İstatik penceresine bakmaktır. Burada bazı bilgilere daha yakından bakacağız.
Batches : Unity’nin bir çerçeve sırasında işlediği toplam çizim çağrısı.
Saved by batching : Toplu olarak birleştirilen Unity çekiliş çağrılarının sayısı.
SetPass calls : Unity’nin bir karede GameObjects’i işlemek için gölgelendirici geçişinde kullandığı geçiş sayısı.

Optimizasyon açısından Batches ve SetPass calls sayılarını kadar düşürebilirsek o kadar iyi.

Çizim çağrıları sayısını azaltmak için öncelikle modellerimiz aynı materyali kullanmalı. Bunun için doku atlasları oluşturmak gerekir.
Doku atlası, oyunlarımızın tüm görsellerini veya dokularını tek bir dosyada gruplamamızın bir yoludur. Doku atlası Blenderdan yapılabilir ya da Asset storeda bu işlem için çeşitli assetler bulabilirsiniz.

Doku Atlası Örneği
Assets from Palmov Island

Görüntüdeki gibi her renk ya da model için ayrı materyal atamak yerine tüm modellere Doku atlasımızı atayarak tek bir materyalle aynı görüntüyü elde edebiliriz.

Static Batching : Çizim çağrılarını azaltmak için hareket etmeyen ağları birleştiren bir çizim çağrısı toplu işlem yöntemidir. Birleştirilmiş ağları dünya alanına dönüştürür ve bunlar için ortak bir köşe ve dizin arabelleği oluşturur. Daha sonra Unity, gruptaki tüm nesneleri bir kerede çizmek için bu birleştirilmiş ağı kullanan tek bir çizim çağrısı gerçekleştirir.

Objeleri Static Yapma İşlemi

Objeleri static yapmak için 1 numaralı yerdeki static bölümünü işaretlemek gerekir. Diğer Objeler “ground park 7" objesinin çocukları olduğu için 2 numaralı düğmeyi seçerek tüm çocuklara birden static yapabiliyoruz.

non-static vs Static

Static Batching işleminden sonra Batches sayımızı 61'den 9'e düşürmeyi başardık.

non-static vs Static Batching

Aynı işlemin Frame Debugger penceresinden görünümleride yukarıdaki gibidir. Batching işlemi yapmadığımız durum soldaki gibi tüm meshleri tek tek çiziyor. Batching işlemi ile birlikte toplu halde çizim yapıyor.

Statik olmayan nesnelerde toplu işleme yapmak için GPU Instancing optimizasyon tekniği kullanılabilir.
Eğer Projenizde SRP Batcher aktif ise öncelik sırasından dolayı GPU Instancing çalışmayacaktır. Aşağıdaki görselde SRP Batcher’ı deaktif etmeyi gösterdim.

SRP Batcher Deaktif Etme

GPU Instancing : Tek bir çizim çağrısında aynı malzemeyle bir ağın birden fazla kopyasını oluşturan bir çizim çağrısı optimizasyon yöntemidir. Bu, bir sahnede birden çok kez görünen şeyleri çizmek için kullanışlıdır.

GPU Instancing Aktif Etme

Örnek olması açısından sahneye gölde yüzen piknik çantaları ekledim. Bunlar hareketli olacağı için Static Batching uygulayamayız. Bu yüzden GPU Instancing tekniğini kullancacağız. Bunun için çantaların kullandığı ortak materyalin Enable GPU Instancing bölümünü aktif ediyoruz.

non-GPU Instancing vs enabled GPU Instancing

Static objelerimizin yanına hareketli objelerimizi eklediğimiz için Batches sayımız 9 dan 33 e çıktı. Daha sonra GPU Instancing tekniğini uygulayınca sağda göründüğü üzere Batches sayısını 33'den 12 ye düşürdük.

Bu yazıda Draw Call Optimizasyonlarından olan iki tekniği inceledik. Umarım faydalı olmuştur.

--

--