Mobil oyunlarda FPS’i artırmanın temel taşlarından biri draw call’ları minimize etmektir. Özellikle düşük bütçeli cihazlarda CPU-GPU arasındaki iletişim sınırlıdır; fazla draw call CPU tarafında iş yükünü artırır ve frame zamanlarını bozabilir. Aşağıda sahne bazlı analiz, profilleme stratejileri ve somut implementasyon adımları ile draw call’ları bağlamından koparmadan azaltma yöntemlerini derinlemesine ele alıyoruz.
Profiling ve hedef belirleme
– Başlangıçta sahnedeki draw call dağılımını Unity Profiler Rendering sekmesinden inceleyin. Batches ve Draw Calls ekseninde trendleri belirleyin. Frame Debugger ile hangi objelerin hangi materyalle ve hangi mesh ile ayrı çağrılar yaptığını tespit edin.
– SD (Static/Dynamic) Batching’in sınırlarını ve SRP Batcher durumunu kontrol edin. SRP Batcher açıksa bazı çağrıların otomatik olarak azaltılabildiğini not edin.
Batching stratejisinin optimizasyonu
– Static Batching: Değişmeyecek geometrileri birleştirin. Obje’lere Static flag’i atayın ve sahnedeki dinamik olmayan kalabalıkları tekil batching’e yönlendirin.
– Dynamic Batching: Küçük mesh’ler için otomatikleştirilir; fakat tüm durumlarda faydalı olmayabilir. Batching’in çalışması için materyal sayısı ve vertex sınırları gibi kısıtlar vardır.
– Bilinçli materyal paylaşımı: Aynı materyalin çoklu objelerde paylaşılması draw call potansiyelini artırır, ancak materyal özeliklerinde varyantlar yaratılmamalıdır.
Kod tabanlı optimiteler ve uygulama örnekleri
// Ortak materyal paylaşımı kontrolü
Renderer[] renderers = FindObjectsOfType
HashSet
foreach (var r in renderers)
{
foreach (var mat in r.sharedMaterials)
{
if (mat != null)
sharedMats.Add(mat);
}
}
Debug.Log(“Ortak Materyal Sayısı: ” + sharedMats.Count);
// Dinamik batching için uygunluk basit kontrol (Unity bu kontrolleri çoğu durumda otomatik yapar)
foreach (var r in renderers)
{
if (!r.gameObject.isStatic)
{
if (r.sharedMesh != null && r.sharedMaterials.Length <= 1)
{
// Uygunluk göstergesi olarak bir uyarı veya optimizasyon çağrısı konulabilir
}
}
}
GPU Instancing ve mesh birleştirme
- Aynı mesh için birden çok instance kullanımı GPU üzerinden tek draw call ile render edilebilir. Instancing’i mümkün olduğunca kullanın ve materyalinizin enableInstancing özelliğini etkinleştirin.
// GPU Instancing’i etkinleştirme
public class InstancingEnabler : MonoBehaviour
{
public Material instancedMaterial; // Instancing destekli materyal
void Start()
{
if (instancedMaterial != null)
instancedMaterial.enableInstancing = true;
}
}
Meshleri birleştirerek draw call azaltımı
- Bazen sahnedeki çok sayıda küçük mesh’i tek bir büyük mesh’e dönüştürmek en net çözüm olabilir; ancak dinamik öğelere zarar vermeden: dinamik bölümleme, culling ve ışınla ilgili hesaplar dikkatle yönetilmelidir.
// Basit MeshCombine örneği
public class SimpleMeshCombiner : MonoBehaviour
{
public void CombineChildren()
{
var meshFilters = GetComponentsInChildren
var combine = new CombineInstance[meshFilters.Length];
for (int i = 0; i < meshFilters.Length; i++)
{
combine[i].mesh = meshFilters[i].sharedMesh;
combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
}
var combinedMesh = new Mesh();
combinedMesh.CombineMeshes(combine, true, true);
var mf = GetComponent
if (mf != null)
mf.mesh = combinedMesh;
}
}
Texture atlas ve shader optimizasyonu
– Texture atlas kullanımı ile birden çok küçük texture’ı tek bir atlas altında toplamak, setTexture çağrılarını ve material switching’i azaltır. Shader varyantlarını minimumda tutun; gereksiz Keyword kullanımı draw call sayısını artırır.
JSON ve durum raporlama aracı
– Mevcut materyal ve mesh durumunu dışa aktarmak için basit bir JSON yapısı:
“`json
{
“meshes”: [
{“name”: “Tree”, “material”: “Leaves”, “instances”: 32},
{“name”: “Rock”, “material”: “RockMat”, “instances”: 64},
{“name”: “Grass”, “material”: “GrassMat”, “instances”: 128}
],
“notes”: “Bu yapı, GPU Instancing uygulanabilirliğini denetlemek için kullanılır.”
}
“`
n8n ile izleme ve raporlama
– Draw Calls artışını izlemek için basit bir akış kurabiliriz. Örnek Function node içeriği:
[
{
“name”: “CountUniqueMaterials”,
“type”: “function”,
“functionCode”: “const mats = items.map(i => i.json.material).filter((v, i, a) => a.indexOf(v) === i); return [{ json: { uniqueMaterials: mats.length } }];”
}
]
Performans odaklı son kontroller
– SRP Batcher’ın çalışır durumda olduğundan emin olun. URP/HDRP kullanıyorsanız bu oturumu statik olarak kontrol edin ve gerektiğinde yeniden yapılandırın.
– Işıklar ve post-process efektleri draw call’ı tetikleyebilir; sahnedeki ışıkları statik bölgelere sabitleyin ve gölgelendirme ayarlarını optimize edin.
– Kamera çok sayıda öğeyi render ediyorsa sahneyi bölümlere ayırıp, View Distance’i ve culling mask’leri dikkatli yönetin.
Sonuç olarak; draw call’ları düşürmek için ortak materyal paylaşımını artırın, GPU Instancing’i kullanın ve mesh birleştirme stratejisini dikkatli bir şekilde uygulayın. Profil verileriyle desteklenen adımlar, mobil hedeflerde FPS iyileşmesini belirgin kılar ve oyun akışını pürüzsüzleştirir.
Bu yazıyı beğendiyseniz, sosyal medya hesaplarınızda paylaşarak daha fazla kişiye ulaşmasını sağlayabilirsiniz. 😊
Ayrıca bizi sosyal medyada da takip edebilirsiniz;
Instagram: @lupusoft
Facebook: @lupusoft
X: @lupusoft
LinkedIn: @lupusoft
Current time (ISO): 2026-03-15T10:00:21.997+03:00
Bir yanıt yazın