Oyun Geliştirme
Object pooling
Object pooling ile sürekli Instantiate'den kaçınmayı öğrenirsin.
Object pooling ve GC sorunu
Sık sık mermi, parçacık veya düşman oluşturup silmek için Instantiate ve Destroy kullanmak performans katilidir. Bellekte sürekli çöp üretilir ve Garbage Collector (GC) devreye girdiğinde oyunda ani takılmalar (stutter) yaşanır.
// KOTU: Her atista bellek tahsisi ve ardindan GC
Instantiate(mermiPrefab, pos, rot);
Destroy(mermi, 2.0f);
Çözüm: Nesneleri yok etmek yerine devre dışı bırakıp ihtiyaç olunca yeniden kullanmaktır.
Havuz kuyruğu yönetimi
Bir havuz genellikle Queue<GameObject> koleksiyonuyla yönetilir. Oyun başında nesneler oluşturulup SetActive(false) ile gizlenir. İhtiyaç anında kuyruktan alınıp (Dequeue) aktif edilir; işi bittiğinde tekrar kuyruğa (Enqueue) eklenir.
Queue<GameObject> pool = new Queue<GameObject>();
GameObject GetObject() {
GameObject obj = pool.Dequeue();
obj.SetActive(true);
return obj;
}
Böylece sıfır bellek tahsisiyle pürüzsüz bir oynanış elde edilir.
Uygulama Havuzdan nesne al ve durumu yazdır
Kuyrukta (pool) bulunan ilk mermiyi Dequeue() ile alıp bullet değişkenine ata. Ardından kullanılan mermiyi ve havuzda kalan sayıyı Console.WriteLine ile ekrana yazdır.
Örnek çözümü göster
using System;
using System.Collections.Generic;
class ObjectPoolDemo
{
static void Main()
{
Queue<string> pool = new Queue<string>();
pool.Enqueue("Mermi_1");
pool.Enqueue("Mermi_2");
string bullet = pool.Dequeue();
Console.WriteLine($"Kullanilan: {bullet} | Kalan: {pool.Count}");
}
}
Kendini test et
-
Object Pooling mekanizmasının en temel amacı nedir?
- Instantiate ve Destroy ek yükü ile GC takılmalarını önlemek
- Ekrandaki poligon sayısını otomatik olarak sıfıra indirmek
- Tüm C# sınıflarını tek bir dosyada toplamak
- Sahnedeki tüm nesnelerin fizik çarpışmalarını devre dışı bırakmak
Cevabı göster
Instantiate ve Destroy ek yükü ile GC takılmalarını önlemek — Object Pooling, önceden oluşturulmuş nesneleri tekrar kullanarak bellek tahsisi ve Garbage Collection duraksamalarını engeller.
-
Kuyruk havuzu oluştur
Queue<string> pool = new ____();
Cevabı göster
Queue<string> pool = new Queue<string>();
-
Havuz bileşenleri
- Object Pool
- Yeniden kullanılabilir nesne havuzu
- SetActive(false)
- Nesneyi yok etmeden sahneden gizler
- Garbage Collector
- Sahipsiz bellek bloklarını temizler
- Instantiate
- Sıfırdan yeni nesne örneği oluşturur
Sıradaki ders: LOD grupları