Oyun Geliştirmede Bellek Sızıntısı: Bulma ve Çözme

Oyun geliştirmede bellek sızıntısı, kullanılmayan nesnelerin bellekten temizlenmemesi sonucu performans düşüşü ve çökmeler yaratır. Özellikle uzun süreli oturumlarda ciddi sorun olur.

Nesne oluşturulur ama referansı hiç temizlenmez. Çöp toplayıcı (garbage collector) bunu serbest bırakamaz. Örneğin, bir oyunda sürekli parçacık sistemi oluşturup eski örnekleri silmezseniz, bellek dolup oyun donabilir.

Unity kullanıyorsanız, Window Analysis Profiler açın. Memory sekmesinde hangi nesnelerin belleği işgal ettiğini görebilirsiniz. Oyunu çalıştırıp bir sahne arası yapın. Bellekte artış görürseniz, sızıntı vardır.

Event listener'ları ve callback'leri düzgün kaldırmalısınız. sık yapılan hata:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1public class PlayerController: MonoBehaviour
2{
3void OnEnable()
4{
5GameManager.OnLevelComplete += HandleLevelComplete; // Subscribe
6}
7
8void OnDisable()
9{
10// HATA: Unsubscribe edilmedi!
11}
12
13void HandleLevelComplete()
14{
15Debug.Log("Level tamamlandı");
16}
17}

Doğru yapı:

1public class PlayerController: MonoBehaviour
2{
3void OnEnable()
4{
5GameManager.OnLevelComplete += HandleLevelComplete;
6}
7
8void OnDisable()
9{
10GameManager.OnLevelComplete -= HandleLevelComplete; // Unsubscribe
11}
12
13void HandleLevelComplete()
14{
15Debug.Log("Level tamamlandı");
16}
17}

Instantiate() ile oluşturduğunuz nesneleri Destroy() ile silin. Texture, Audio ve Mesh gibi kaynakları kullanmadığınızda Resources.UnloadUnusedAssets() çağırın:

1void SpawnEnemy()
2{
3GameObject enemy = Instantiate(enemyPrefab);
4//... oyun kodu...
5}
6
7void DestroyEnemyAndCleanup(GameObject enemy)
8{
9Destroy(enemy);
10Resources.UnloadUnusedAssets(); // Kullanılmayan kaynakları kaldır
11}

Aktif Coroutine'leri StopCoroutine() ile durdurun:

1Coroutine damageCoroutine;
2
3void StartDamage()
4{
5damageCoroutine = StartCoroutine(ApplyDamageOverTime());
6}
7
8void StopDamage()
9{
10if (damageCoroutine!= null)
11{
12StopCoroutine(damageCoroutine);
13damageCoroutine = null;
14}
15}
16
17IEnumerator ApplyDamageOverTime()
18{
19for (int i = 0; i < 10; i++)
20{
21health -= 5;
22yield return new WaitForSeconds(1f);
23}
24}

Bellek sızıntısını önlemek için: Profiler'ı düzenli kullanın, event listener'ları unsubscribe edin, dinamik nesneleri silin ve Coroutine'leri durdurun. Düzenli kontrol, uzun oturumlarda stabil performans sağlar.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz