| FAutoConsoleCommand GDumpTemplateSizesCommand(TEXT("Widget.DumpTemplateSizes"), TEXT("Dump the sizes of all widget class templates in memory"), FConsoleCommandDelegate::CreateStatic([]() { struct FClassAndSize { FString ClassName; int32 TemplateSize=0; }; TArray< FClassAndSize > TemplateSizes; for(TObjectIterator< UWidgetBlueprintGeneratedClass > WidgetClassIt;WidgetClassIt;++WidgetClassIt) { UWidgetBlueprintGeneratedClass *WidgetClass=*WidgetClassIt; if(WidgetClass->HasAnyClassFlags(CLASS_Abstract|CLASS_Deprecated|CLASS_NewerVersionExists)) { continue; } FClassAndSize Entry; Entry.ClassName=WidgetClass->GetName(); if(UUserWidget *TemplateWidget=WidgetClass->GetDefaultObject< UUserWidget >()) { int32 TemplateSize=WidgetClass->GetStructureSize(); if(const UWidgetTree *TemplateWidgetTree=WidgetClass->GetWidgetTreeArchetype()) { TemplateWidgetTree->ForEachWidget([&TemplateSize](UWidget *Widget) { TemplateSize+=Widget->GetClass() ->GetStructureSize(); }); } Entry.TemplateSize=TemplateSize; } TemplateSizes.Add(Entry); } TemplateSizes.StableSort([](const FClassAndSize &A, const FClassAndSize &B) { return A.TemplateSize > B.TemplateSize; }); uint32 TotalSizeBytes=0; UE_LOG(LogUMG, Display, TEXT("%-60s %-15s"), TEXT("Template Class"), TEXT("Size (bytes)")); for(const FClassAndSize &Entry :TemplateSizes) { TotalSizeBytes+=Entry.TemplateSize; if(Entry.TemplateSize > 0) { UE_LOG(LogUMG, Display, TEXT("%-60s %-15d"), *Entry.ClassName, Entry.TemplateSize); } else { UE_LOG(LogUMG, Display, TEXT("%-60s %-15s"), *Entry.ClassName, TEXT("0 - (No Template)")); } } UE_LOG(LogUMG, Display, TEXT("Total size of templates %.3f MB"), TotalSizeBytes/(1024.f *1024.f)); }), ECVF_Cheat) |
( |
TEXT("Widget.DumpTemplateSizes") |
, |
|
|
FConsoleCommandDelegate::CreateStatic([]() { struct FClassAndSize { FString ClassName; int32 TemplateSize=0; }; TArray< FClassAndSize > TemplateSizes; for(TObjectIterator< UWidgetBlueprintGeneratedClass > WidgetClassIt;WidgetClassIt;++WidgetClassIt) { UWidgetBlueprintGeneratedClass *WidgetClass=*WidgetClassIt; if(WidgetClass->HasAnyClassFlags(CLASS_Abstract|CLASS_Deprecated|CLASS_NewerVersionExists)) { continue; } FClassAndSize Entry; Entry.ClassName=WidgetClass->GetName(); if(UUserWidget *TemplateWidget=WidgetClass->GetDefaultObject< UUserWidget >()) { int32 TemplateSize=WidgetClass->GetStructureSize(); if(const UWidgetTree *TemplateWidgetTree=WidgetClass->GetWidgetTreeArchetype()) { TemplateWidgetTree->ForEachWidget([&TemplateSize](UWidget *Widget) { TemplateSize+=Widget->GetClass() ->GetStructureSize(); }); } Entry.TemplateSize=TemplateSize; } TemplateSizes.Add(Entry); } TemplateSizes.StableSort([](const FClassAndSize &A, const FClassAndSize &B) { return A.TemplateSize > B.TemplateSize; }); uint32 TotalSizeBytes=0; UE_LOG(LogUMG, Display, TEXT("%-60s %-15s"), TEXT("Template Class"), TEXT("Size (bytes)")); for(const FClassAndSize &Entry :TemplateSizes) { TotalSizeBytes+=Entry.TemplateSize; if(Entry.TemplateSize > 0) { UE_LOG(LogUMG, Display, TEXT("%-60s %-15d"), *Entry.ClassName, Entry.TemplateSize); } else { UE_LOG(LogUMG, Display, TEXT("%-60s %-15s"), *Entry.ClassName, TEXT("0 - (No Template)")); } } UE_LOG(LogUMG, Display, TEXT("Total size of templates %.3f MB"), TotalSizeBytes/(1024.f *1024.f));}) |
, |