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/deleteile yönetmeyin;NewObject,SpawnActor,Destroykullanın. - UPROPERTY olmayan bir sınıfta (ör. düz C++ struct) UObject tutmak gerekiyorsa
FGCObjectarayüzünü implemente edipAddReferencedObjectsyazın veyaTStrongObjectPtrkullanın. - Sahiplenmeden gözlemlemek için
TWeakObjectPtrkullanı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üzdenIsValid(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.
İlgili Unreal & C++ soruları
- Oyun motorlarında neden custom memory allocator kullanılır? Linear (arena), pool ve stack allocator nasıl çalışır?
- Cache-friendly veri yapısı ne demektir? Array of Structs (AoS) ile Struct of Arrays (SoA) farkı nedir?
- C++'ta move semantics nedir? Aşağıdaki kodda hangi constructor'lar çağrılır?
- C++'ta virtual fonksiyonlar ve vtable nasıl çalışır? Destructor neden virtual olmalıdır?
- Unreal'da replication nasıl çalışır? Replicated property, RepNotify ve RPC türleri arasındaki fark nedir?
- Unreal'ın Gameplay Framework'ünde GameMode, GameState, PlayerController, PlayerState ve Pawn'ın rolleri nelerdir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.