Object pooling
- Oyun Geliştirme kursu
- Uzman
- Ders 3/47
- 4 dk
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.
Başlangıç kodu
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");
// Havuzdan nesne cek ve ekrana kalanla birlikte yazdir
}
}Örnek çözüm
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}");
}
}Beklenen çıktı
Kullanilan: Mermi_1 | Kalan: 1
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Object Pooling mekanizmasının en temel amacı nedir?
- Instantiate ve Destroy ek yükü ile GC takılmalarını önlemek Doğru cevap
- 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
Açıklama: Object Pooling, önceden oluşturulmuş nesneleri tekrar kullanarak bellek tahsisi ve Garbage Collection duraksamalarını engeller.
2 Kuyruk havuzu oluştur
Queue<string> pool = new ____();
Queue<string> pool = new Queue<string>();
Açıklama: FIFO (ilk giren ilk çıkar) mantığıyla havuz yönetimi için Queue koleksiyonu başlatılır.
3 Havuz bileşenleri
| Kavram | Anlamı |
|---|---|
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 |