static int32 RenderMemoryCounter(const FGameThreadHudData& ViewData, const FComplexStatMessage& All,class FCanvas* Canvas,int32 X,int32 Y) { FPlatformMemory::EMemoryCounterRegion Region = FPlatformMemory::EMemoryCounterRegion(All.NameAndInfo.GetField<EMemoryRegion>()); const bool bDisplayAll = All.NameAndInfo.GetFlag(EStatMetaFlags::ShouldClearEveryFrame); const float MemUsed = All.GetValue_double(EComplexStatField::IncAve); const float MaxMemUsed = All.GetValue_double(EComplexStatField::IncMax); // Draw the label Canvas->DrawShadowedString(X,Y,*ShortenName(*All.GetDescription()),STAT_FONT,StatGlobals.StatColor); int32 CurrX = X + StatGlobals.AfterNameColumnOffset; if( bDisplayAll ) { // Now append the value of the stat RightJustify(Canvas,CurrX,Y,*GetMemoryString(MemUsed),StatGlobals.StatColor); CurrX += StatGlobals.InterColumnOffset; if (ViewData.PoolCapacity.Contains(Region)) { RightJustify(Canvas,CurrX,Y,*FString::Printf(TEXT("%.0f%%"), float(100.0 * MemUsed / double(ViewData.PoolCapacity[Region]))),StatGlobals.StatColor); } CurrX += StatGlobals.InterColumnOffset; } else { CurrX += StatGlobals.InterColumnOffset; CurrX += StatGlobals.InterColumnOffset; } // Now append the max value of the stat RightJustify(Canvas,CurrX,Y,*GetMemoryString(MaxMemUsed),StatGlobals.StatColor); CurrX += StatGlobals.InterColumnOffset; if (ViewData.PoolCapacity.Contains(Region)) { RightJustify(Canvas,CurrX,Y,*FString::Printf(TEXT("%.0f%%"), float(100.0 * MaxMemUsed / double(ViewData.PoolCapacity[Region]))),StatGlobals.StatColor); } CurrX += StatGlobals.InterColumnOffset; if (ViewData.PoolAbbreviation.Contains(Region)) { RightJustify(Canvas,CurrX,Y,*ViewData.PoolAbbreviation[Region],StatGlobals.StatColor); } CurrX += StatGlobals.InterColumnOffset; if (ViewData.PoolCapacity.Contains(Region)) { RightJustify(Canvas,CurrX,Y,*GetMemoryString(double(ViewData.PoolCapacity[Region])),StatGlobals.StatColor); } CurrX += StatGlobals.InterColumnOffset; return FONT_HEIGHT; }
static int32 RenderCounter(const FGameThreadHudData& ViewData, const FComplexStatMessage& All,class FCanvas* Canvas,int32 X,int32 Y) { // If this is a cycle, render it as a cycle. This is a special case for manually set cycle counters. const bool bIsCycle = All.NameAndInfo.GetFlag(EStatMetaFlags::IsCycle); if( bIsCycle ) { return RenderCycle( All, Canvas, X, Y, 0, false ); } const bool bDisplayAll = All.NameAndInfo.GetFlag(EStatMetaFlags::ShouldClearEveryFrame); // Draw the label Canvas->DrawShadowedString(X,Y,*ShortenName(*All.GetDescription()),GetStatRenderGlobals().StatFont,GetStatRenderGlobals().StatColor); int32 CurrX = X + GetStatRenderGlobals().AfterNameColumnOffset; if( bDisplayAll ) { // Append the average. if (All.NameAndInfo.GetField<EStatDataType>() == EStatDataType::ST_double) { RightJustify(Canvas,CurrX,Y,*FString::Printf(TEXT("%.2f"), All.GetValue_double(EComplexStatField::IncAve)),GetStatRenderGlobals().StatColor); } else if (All.NameAndInfo.GetField<EStatDataType>() == EStatDataType::ST_int64) { RightJustify(Canvas,CurrX,Y,*FString::Printf(TEXT("%lld"), All.GetValue_int64(EComplexStatField::IncAve)),GetStatRenderGlobals().StatColor); } } CurrX += GetStatRenderGlobals().InterColumnOffset; // Append the maximum. if (All.NameAndInfo.GetField<EStatDataType>() == EStatDataType::ST_double) { RightJustify(Canvas,CurrX,Y,*FString::Printf(TEXT("%.2f"), All.GetValue_double(EComplexStatField::IncMax)),GetStatRenderGlobals().StatColor); } else if (All.NameAndInfo.GetField<EStatDataType>() == EStatDataType::ST_int64) { RightJustify(Canvas,CurrX,Y,*FString::Printf(TEXT("%lld"), All.GetValue_int64(EComplexStatField::IncMax)),GetStatRenderGlobals().StatColor); } return GetStatRenderGlobals().GetFontHeight(); }
static int32 RenderMemoryCounter(const FGameThreadHudData& ViewData, const FComplexStatMessage& All,class FCanvas* Canvas,int32 X,int32 Y) { FPlatformMemory::EMemoryCounterRegion Region = FPlatformMemory::EMemoryCounterRegion(All.NameAndInfo.GetField<EMemoryRegion>()); // At this moment we only have memory stats that are marked as non frame stats, so can't be cleared every frame. //const bool bDisplayAll = All.NameAndInfo.GetFlag(EStatMetaFlags::ShouldClearEveryFrame); const float MaxMemUsed = All.GetValue_double(EComplexStatField::IncMax); // Draw the label Canvas->DrawShadowedString(X,Y,*ShortenName(*All.GetDescription()),GetStatRenderGlobals().StatFont,GetStatRenderGlobals().StatColor); int32 CurrX = X + GetStatRenderGlobals().AfterNameColumnOffset; // always use MB for easier comparisons const bool bAutoType = false; // Now append the max value of the stat RightJustify(Canvas,CurrX,Y,*GetMemoryString(MaxMemUsed, bAutoType),GetStatRenderGlobals().StatColor); CurrX += GetStatRenderGlobals().InterColumnOffset; if (ViewData.PoolCapacity.Contains(Region)) { RightJustify(Canvas,CurrX,Y,*FString::Printf(TEXT("%.0f%%"), float(100.0 * MaxMemUsed / double(ViewData.PoolCapacity[Region]))),GetStatRenderGlobals().StatColor); } CurrX += GetStatRenderGlobals().InterColumnOffset; if (ViewData.PoolAbbreviation.Contains(Region)) { RightJustify(Canvas,CurrX,Y,*ViewData.PoolAbbreviation[Region],GetStatRenderGlobals().StatColor); } CurrX += GetStatRenderGlobals().InterColumnOffset; if (ViewData.PoolCapacity.Contains(Region)) { RightJustify(Canvas,CurrX,Y,*GetMemoryString(double(ViewData.PoolCapacity[Region]), bAutoType),GetStatRenderGlobals().StatColor); } CurrX += GetStatRenderGlobals().InterColumnOffset; return GetStatRenderGlobals().GetFontHeight(); }
/** * * @param Item the stat to render * @param Canvas the render interface to draw with * @param X the X location to start drawing at * @param Y the Y location to start drawing at * @param Indent Indentation of this cycles, used when rendering hierarchy * @param bStackStat If false, this is a non-stack cycle counter, don't render the call count column */ static int32 RenderCycle( const FComplexStatMessage& Item, class FCanvas* Canvas, int32 X, int32 Y, const int32 Indent, const bool bStackStat ) { FColor Color = GetStatRenderGlobals().StatColor; check(Item.NameAndInfo.GetFlag(EStatMetaFlags::IsCycle)); const bool bIsInitialized = Item.NameAndInfo.GetField<EStatDataType>() == EStatDataType::ST_int64; const int32 IndentWidth = Indent*8; if( bIsInitialized ) { const float InMs = FPlatformTime::ToMilliseconds(Item.GetValue_Duration(EComplexStatField::IncAve)); // Color will be determined by the average value of history // If show inclusive and and show exclusive is on, then it will choose color based on inclusive average // @TODO yrx 2014-08-21 This is slow, fix this. FString CounterName = Item.GetShortName().ToString(); CounterName.RemoveFromStart(TEXT("STAT_")); GEngine->GetStatValueColoration(CounterName, InMs, Color); const float MaxMeter = 33.3f; // the time of a "full bar" in ms const int32 MeterWidth = GetStatRenderGlobals().AfterNameColumnOffset; int32 BarWidth = int32((InMs / MaxMeter) * MeterWidth); if (BarWidth > 2) { if (BarWidth > MeterWidth ) { BarWidth = MeterWidth; } FCanvasBoxItem BoxItem( FVector2D(X + MeterWidth - BarWidth, Y + .4f * GetStatRenderGlobals().GetFontHeight()), FVector2D(BarWidth, 0.2f * GetStatRenderGlobals().GetFontHeight()) ); BoxItem.SetColor( FLinearColor::Red ); BoxItem.Draw( Canvas ); } } Canvas->DrawShadowedString(X + IndentWidth, Y, *ShortenName(*Item.GetDescription()), GetStatRenderGlobals().StatFont, Color); int32 CurrX = X + GetStatRenderGlobals().AfterNameColumnOffset; // Now append the call count if( bStackStat ) { if (Item.NameAndInfo.GetFlag(EStatMetaFlags::IsPackedCCAndDuration) && bIsInitialized) { RightJustify(Canvas,CurrX,Y,*FString::Printf(TEXT("%u"), Item.GetValue_CallCount(EComplexStatField::IncAve)),Color); } CurrX += GetStatRenderGlobals().InterColumnOffset; } // Add the two inclusive columns if asked if( bIsInitialized ) { RightJustify(Canvas,CurrX,Y,*FString::Printf(TEXT("%1.2f ms"),FPlatformTime::ToMilliseconds(Item.GetValue_Duration(EComplexStatField::IncAve))),Color); } CurrX += GetStatRenderGlobals().InterColumnOffset; if( bIsInitialized ) { RightJustify(Canvas,CurrX,Y,*FString::Printf(TEXT("%1.2f ms"),FPlatformTime::ToMilliseconds(Item.GetValue_Duration(EComplexStatField::IncMax))),Color); } CurrX += GetStatRenderGlobals().InterColumnOffset; if( bStackStat ) { // And the exclusive if asked if( bIsInitialized ) { RightJustify(Canvas,CurrX,Y,*FString::Printf(TEXT("%1.2f ms"),FPlatformTime::ToMilliseconds(Item.GetValue_Duration(EComplexStatField::ExcAve))),Color); } CurrX += GetStatRenderGlobals().InterColumnOffset; if( bIsInitialized ) { RightJustify(Canvas,CurrX,Y,*FString::Printf(TEXT("%1.2f ms"),FPlatformTime::ToMilliseconds(Item.GetValue_Duration(EComplexStatField::ExcMax))),Color); } CurrX += GetStatRenderGlobals().InterColumnOffset; } return GetStatRenderGlobals().GetFontHeight(); }