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:
1public class PlayerController: MonoBehaviour2{3void OnEnable()4{5GameManager.OnLevelComplete += HandleLevelComplete; // Subscribe6}78void OnDisable()9{10// HATA: Unsubscribe edilmedi!11}1213void HandleLevelComplete()14{15Debug.Log("Level tamamlandı");16}17}Doğru yapı:
1public class PlayerController: MonoBehaviour2{3void OnEnable()4{5GameManager.OnLevelComplete += HandleLevelComplete;6}78void OnDisable()9{10GameManager.OnLevelComplete -= HandleLevelComplete; // Unsubscribe11}1213void 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}67void DestroyEnemyAndCleanup(GameObject enemy)8{9Destroy(enemy);10Resources.UnloadUnusedAssets(); // Kullanılmayan kaynakları kaldır11}Aktif Coroutine'leri StopCoroutine() ile durdurun:
1Coroutine damageCoroutine;23void StartDamage()4{5damageCoroutine = StartCoroutine(ApplyDamageOverTime());6}78void StopDamage()9{10if (damageCoroutine!= null)11{12StopCoroutine(damageCoroutine);13damageCoroutine = null;14}15}1617IEnumerator 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.
0 yorum