Rehber Unity'de Memory Management ve Garbage Collection

  • Konuyu başlatan Konuyu başlatan Syntax
  • Başlangıç Tarihi Başlangıç Tarihi
  • Mesaj Mesaj 0
  • Görüntüleme Görüntüleme 94
  • Etiketler Etiketler
    unity

Syntax

Üstün
Katılım
11 Şubat 2024
Mesajlar
1.836
Çözümler
10
Beğeniler
1.844
Oyunlardaki performans sorunlarının en büyük nedenlerinden biri kötü Memory (bellek) yönetimidir. Düşük grafikli oyunların kötü performans verme sebebi bu oluyor genelde. İndie yapımcılar çok önem göstermiyor. Zaten yüksek gereksinim gerektirmiyor neden optimizasyon ile uğraşayım düşüncesindeler.

Memory Management nedir?
Türkçeye çevirdiğimizde ne olduğu anlaşılıyor aslında. "bellek yönetimi" yani bilgisayardaki RAM'i nasıl kullandığımız oluyor.

Stack ve Heap memory farkı nedir?
Bu ikisinin ne olduğunu değil de aralarındaki farklardan gideceğim. İkisi de Unity kullandığı bellek türü.

Stack basit veri tiplerini kullanıyor diyebiliriz. Mesela int, float ve bool. Bunlar biz kullanmadığımızda bellekten otomatik silinen veriler.
Heap ise gameobject, transform, arrays (diziler) gibi veriler. Ve bu veriler biz silene kadar bellekte yer kaplıyor. Stack gibi otomatik silinen veri değiller.

Garbage Collection (GC) nedir?
Garbage Collection, artık kullanılmayan nesneleri otomatik olarak temizleyen sistemdir. Ama bu sistem temizlik yaparken oyunun donmasına sebep oluyor. Özellikle mobil oyunlarda etkisi gözüküyor.

Memory leak nedir?
Memory leak, artık kullanılmayan ama GC tarafından temizlenemeyen nesnelerin birikmesidir. Bir şeyleri Update fonksiyonunda çalıştırdığınızda bunlar doğal olarak sürekli kullanılıyor. Bu da veri kaplıyor.


Örnek - Yanlış kullanım

C#:
void Update()
{
 GetComponent<Rigidbody>().velocity = Vector3.zero; // Sürekli çalıştırılıyor.
}

GetComponent() Heap memmory olduğu için fazla veri kullanıyor. Biz bunu Update fonksiyonu içine yazdığımız içinde sürekli kullanılıyor ve silinmiyor.

Doğru kullanım

C#:
private Rigidbody rb;

void Start()
{
 rb = GetComponent<Rigidbody>();
}

void Update()
{
 rb.velocity = Vector3.zero;
}

Eğer GetComponent(), Start() fonksiyonu içinde kullanılırsa sadece başlangıçta çalışmış oluyor. Sürekli kullanılmadığı için siliniyor. Ve böylece heap allocation yaşanmamış oluyor.

Object Pooling nedir?
Object Pooling, bir optimizasyon yöntemi. Object Pooling yöntemini kullandığımız en yaygın örnek sürekli oluşturulan ve yok edilen objeler.

Örnek

C#:
using System.Collections.Generic;
using UnityEngine;

public class ObjectPool : MonoBehaviour.
{
 public static ObjectPool SharedInstance;
 public List<GameObject> pooledObjects; //
 public GameObject objectToPool; // Hangi prefab'i kullanacağız.
 public int amountToPool; // Kaç tane hazırda olsun.

 void Awake()
 {
 SharedInstance = this;
 }

 void Start()
 {
 // Havuzu hazırla.
 pooledObjects = new List<GameObject>();
 GameObject tmp;

 for(int i = 0; i < amountToPool; i++)
 {
 tmp = Instantiate(objectToPool); // Prefab'den obje yarat.
 tmp.SetActive(false);
 pooledObjects.Add(tmp);
 }
 }
}

Bu kod oyun başlamadan belirli sayıda mermi yaratmamız için. Bunlar kullanmadığımız zaman gizli kalıyor.



Object To Pool kısmına mermi prefabımızı koyuyoruz. Amount To Pool ise görünmez olarak hazırda bekleyen mermilerin sayısı.

C#:
public GameObject GetPooledObject()
{
 //
 for(int i = 0; i < amountToPool; i++)
 {
 // Eğer obje aktif değilse (kullanılmıyorsa)
 if(!pooledObjects[i].activeInHierarchy)
 {
 return pooledObjects[i]; //
 }
 }
 return null; // Havuz boşsa null döndür.
}

Bu fonksiyon bizim görünmez olarak duran mermilerimizi alıp kullanmak için. Böylece Instantiate() ve Destroy() komutlarını sürekli kullanmaktan kaçınmış olacağız. Yani sürekli mermi oluşturup onu yok etme yükü kalkacak. Kullanılan mermiyi de SetActive(false) tekrardan yaparak yok etmekten kurtulacağız.

Object Pooling örneğini Unity'nin sitesinden aldım. Çok güzel anlatmışlar. https://learn.unity.com/tutorial/introduction-to-object-pooling#5ff8d015edbc2a002063971d

Elimden geldiğince basit anlatmaya çalıştım. Eğer hatalarım varsa düzeltirseniz sevinirim.
 
Son düzenleyen: Moderatör:
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…