Unity'de Object Pooling ile Mobil Oyun Performansını Artırma

13.03.2026
Burak Erol
46 Görüntülenme
Unity'de Object Pooling ile Mobil Oyun Performansını Artırma

Unity'de Object Pooling ile Mobil Oyun Performansını Artırma

Özellikle ekranda sürekli bir şeylerin patladığı, mermilerin uçuştuğu veya sürekli yeni objelerin üretildiği (örneğin baloncuk patlatma tarzı) mobil oyunlarda Instantiate ve Destroy fonksiyonları performansın bir numaralı düşmanıdır.

Bu fonksiyonlar bellekte sürekli yeni yer ayrılmasına ve silinen objelerin arkalarında "çöp" bırakmasına neden olur. Bu çöpler biriktiğinde Garbage Collector (GC) devreye girer ve oyunda anlık donmalara (spike/lag) yol açar. İşte bu sorunu çözmenin en zarif yolu Object Pooling (Obje Havuzu) tasarım desenini kullanmaktır.

Object Pooling Nedir?

Mantık çok basittir: İhtiyacınız olacak objeleri oyunun başında (veya sahne yüklenirken) bir kez üretir, görünmez yapar ve bir "havuzda" (genellikle bir List veya Queue içinde) bekletirsiniz. Bir objeye ihtiyacınız olduğunda yenisini üretmek yerine, havuzdan bir tane alır ve görünür yaparsınız. İşiniz bittiğinde ise silmek (Destroy) yerine tekrar görünmez yapıp havuza geri koyarsınız.

Unity C# ile Basit Bir Havuz Sistemi

Modern Unity projelerinde Queue (kuyruk) yapısı kullanarak çok hızlı bir havuz oluşturabiliriz:

using System.Collections.Generic;
using UnityEngine;

public class ObjectPooler : MonoBehaviour
{
    public static ObjectPooler Instance;
    public GameObject pooledObjectPrefab;
    public int poolSize = 20;

    private Queue<GameObject> objectPool;

    void Awake()
    {
        Instance = this;
        objectPool = new Queue<GameObject>();

        for (int i = 0; i < poolSize; i++)
        {
            GameObject obj = Instantiate(pooledObjectPrefab);
            obj.SetActive(false);
            objectPool.Enqueue(obj);
        }
    }

    public GameObject GetPooledObject()
    {
        GameObject obj = objectPool.Dequeue();
        
        obj.SetActive(true);
        objectPool.Enqueue(obj); // Tekrar kullanmak üzere kuyruğun sonuna ekle
        
        return obj;
    }
}

Object Pooling Kullanırken Dikkat Edilmesi Gerekenler

  • Verileri Sıfırlamayı Unutmayın: Havuzdan çektiğiniz bir objenin canı, hızı veya rengi bir önceki kullanımdan kalmış olabilir. Obje her aktif olduğunda OnEnable() metodu içinde gerekli değişkenleri (hız, can vb.) mutlaka sıfırlayın.
  • Havuz Boyutunu Doğru Ayarlayın: Ekranda aynı anda en fazla kaç obje olacaksa havuz boyutunuzu ona göre ayarlayın. Gereğinden çok büyük bir havuz baştan gereksiz RAM tüketimine neden olur.

Sonuç

Instantiate ve Destroy yerine Object Pooling kullanmak, oyununuzu özellikle eski nesil Android ve iOS cihazlarda çok daha akıcı hale getirecektir. Mobil oyun geliştiricileri için bu yapı opsiyonel değil, bir zorunluluktur.