void FObjectMemoryAnalyzer::AnalyzeObjects( UClass* InBaseClass ) { if (InBaseClass == NULL) { InBaseClass = UObject::StaticClass(); } uint32 ExclusionFlags = (AnalyzeFlags&EAnalyzeFlags::IncludeDefaultObjects)==0 ? (RF_ClassDefaultObject|RF_ArchetypeObject) : 0; // Determine root objects for( FObjectIterator It(InBaseClass, false, (EObjectFlags)ExclusionFlags); It; ++It ) { UObject* Object = *It; if (!(AnalyzeFlags&EAnalyzeFlags::IncludeDefaultObjects) && Object->IsDefaultSubobject()) { continue; }; FObjectMemoryUsage& Annotation = MemUsageAnnotations.GetAnnotationRef(Object); if ( Object->HasAllFlags(RF_Standalone) ) { Annotation.Flags |= FObjectMemoryUsage::EObjFlags::IsRoot; } ProcessSubObjRecursive(Object, Object); } // mark 'loose' objets as root objects as well for( FObjectIterator It(InBaseClass, false, (EObjectFlags)ExclusionFlags); It; ++It ) { UObject* Object = *It; if (!(AnalyzeFlags&EAnalyzeFlags::IncludeDefaultObjects) && Object->IsDefaultSubobject()) { continue; }; FObjectMemoryUsage& Annotation = MemUsageAnnotations.GetAnnotationRef(Object); if (!Annotation.IsRoot() && !Annotation.IsReferencedByRoot() && !Annotation.IsReferencedByNonRoot()) { Annotation.Flags |= FObjectMemoryUsage::EObjFlags::IsRoot; } } for( FObjectIterator It(InBaseClass, false, (EObjectFlags)ExclusionFlags); It; ++It ) { UObject* Object = *It; if (!(AnalyzeFlags&EAnalyzeFlags::IncludeDefaultObjects) && Object->IsDefaultSubobject()) { continue; }; FObjectMemoryUsage& Annotation = MemUsageAnnotations.GetAnnotationRef(Object); SIZE_T InclusiveSize = CalculateSizeRecursive(Object); Annotation.InclusiveMemoryUsage = InclusiveSize; } }