Unreal Engine'de garbage collection nasıl çalışır? Bir UObject pointer'ı neden UPROPERTY olmalıdır?

Cevap

Unreal, UObject'ler için mark-and-sweep tipi bir garbage collector kullanır. Belirli aralıklarla root set'ten (root'a eklenmiş nesneler, aktif World, AddToRoot çağrılanlar) başlayıp reflection üzerinden bilinen tüm referansları takip eder; ulaşılamayan UObject'ler silinir.

Kritik nokta: GC sadece reflect edilmiş referansları görür. Düz bir UObject* alanı GC için görünmezdir:

UCLASS()
class AMyActor : public AActor
{
    GENERATED_BODY()

    UItemData* Bad;                 // GC bilmez: nesne silinebilir, dangling pointer

    UPROPERTY()
    TObjectPtr<UItemData> Good;     // GC referansı izler, silinince null'lanır (UE5)

    UPROPERTY()
    TArray<TObjectPtr<UItemData>> Items; // container'lar da izlenir
};

Önemli kurallar:

  • UObject'leri asla new/delete ile yönetmeyin; NewObject, SpawnActor, Destroy kullanın.
  • UPROPERTY olmayan bir sınıfta (ör. düz C++ struct) UObject tutmak gerekiyorsa FGCObject arayüzünü implemente edip AddReferencedObjects yazın veya TStrongObjectPtr kullanın.
  • Sahiplenmeden gözlemlemek için TWeakObjectPtr kullanılır; IsValid() ile kontrol edilir.
  • Actor'lar Destroy() edildiğinde hemen silinmez, pending kill (UE5'te "garbage", MarkAsGarbage) olarak işaretlenir; sonraki GC'de temizlenir. Bu yüzden IsValid(Actor) kontrolü önemlidir.
  • UE5'te TObjectPtr<T>, header'daki UObject üye pointer'ları için önerilen tiptir (editörde lazy load ve erişim takibi sağlar).

GC maliyeti nesne sayısıyla artar; çok sayıda kısa ömürlü UObject üretmek hitch'lere yol açar. Bunun için pooling ve gerekirse cluster/incremental GC ayarları kullanılır.

  1. Oyun motorlarında neden custom memory allocator kullanılır? Linear (arena), pool ve stack allocator nasıl çalışır?ZorUnreal & C++Game Dev
  2. Cache-friendly veri yapısı ne demektir? Array of Structs (AoS) ile Struct of Arrays (SoA) farkı nedir?ZorUnreal & C++Game Dev
  3. C++'ta move semantics nedir? Aşağıdaki kodda hangi constructor'lar çağrılır?ZorUnreal & C++Game Dev
  4. C++'ta virtual fonksiyonlar ve vtable nasıl çalışır? Destructor neden virtual olmalıdır?OrtaUnreal & C++Game Dev
  5. Unreal'da replication nasıl çalışır? Replicated property, RepNotify ve RPC türleri arasındaki fark nedir?ZorUnreal & C++Game Dev
  6. Unreal'ın Gameplay Framework'ünde GameMode, GameState, PlayerController, PlayerState ve Pawn'ın rolleri nelerdir?OrtaUnreal & C++Game Dev

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle