CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

Player.cs
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

Player.cs
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

Soru
Queue<string> pool = new ____();
Cevap
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

Uzman bölümündeki tüm dersler