EM_Task/TraceInsights/Private/Insights/MemoryProfiler/ViewModels/MemoryGraphTrack.h

174 lines
5.9 KiB
C
Raw Normal View History

2026-02-13 16:18:33 +08:00
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "Math/Color.h"
// Insights
#include "Insights/MemoryProfiler/ViewModels/MemoryTag.h"
#include "Insights/MemoryProfiler/ViewModels/MemoryTracker.h"
#include "Insights/ViewModels/GraphSeries.h"
#include "Insights/ViewModels/GraphTrack.h"
class FMemorySharedState;
class FSlateFontMeasure;
struct FSlateBrush;
////////////////////////////////////////////////////////////////////////////////////////////////////
enum class EGraphTrackLabelUnit
{
Auto,
Byte,
KiB, // 2^10 bytes (kibibyte)
MiB, // 2^20 bytes (mebibyte)
GiB, // 2^30 bytes (gibibyte)
TiB, // 2^40 bytes (tebibyte)
PiB, // 2^50 bytes (pebibyte)
EiB // 2^60 bytes (exbibyte)
};
////////////////////////////////////////////////////////////////////////////////////////////////////
class FMemoryGraphSeries: public FGraphSeries
{
public:
virtual FString FormatValue(double Value) const override;
Insights::FMemoryTrackerId GetTrackerId() const { return TrackerId; }
void SetTrackerId(Insights::FMemoryTrackerId InTrackerId) { TrackerId = InTrackerId; }
Insights::FMemoryTagId GetTagId() const { return TagId; }
void SetTagId(Insights::FMemoryTagId InTagId) { TagId = InTagId; }
double GetMinValue() const { return MinValue; }
double GetMaxValue() const { return MaxValue; }
void SetValueRange(double Min, double Max)
{
MinValue = Min;
MaxValue = Max;
}
private:
Insights::FMemoryTrackerId TrackerId; // LLM tracker id
Insights::FMemoryTagId TagId; // LLM tag id
double MinValue;
double MaxValue;
};
////////////////////////////////////////////////////////////////////////////////////////////////////
enum EMemoryTrackHeightMode
{
Small = 0,
Medium,
Large,
Count
};
////////////////////////////////////////////////////////////////////////////////////////////////////
class FMemoryGraphTrack: public FGraphTrack
{
INSIGHTS_DECLARE_RTTI(FMemoryGraphTrack, FGraphTrack)
public:
FMemoryGraphTrack(FMemorySharedState& InSharedState);
virtual ~FMemoryGraphTrack();
void SetLabelUnit(EGraphTrackLabelUnit InLabelUnit, int32 InLabelDecimalDigitCount)
{
LabelUnit = InLabelUnit;
LabelDecimalDigitCount = InLabelDecimalDigitCount;
}
bool IsAutoZoomEnabled() const { return bAutoZoom; }
void EnableAutoZoom() { bAutoZoom = true; }
void DisableAutoZoom() { bAutoZoom = false; }
void SetAutoZoom(bool bOnOff) { bAutoZoom = bOnOff; }
void SetDefaultValueRange(double InDefaultMinValue, double InDefaultMaxValue)
{
DefaultMinValue = InDefaultMinValue;
DefaultMaxValue = InDefaultMaxValue;
}
void ResetDefaultValueRange();
bool IsStacked() const { return bIsStacked; }
void SetStacked(bool bOnOff) { bIsStacked = bOnOff; }
TSharedPtr<FMemoryGraphSeries> GetMainSeries() const { return MainSeries; }
void SetMainSeries(TSharedPtr<FMemoryGraphSeries> InMainSeries) { MainSeries = InMainSeries; }
virtual void Draw(const ITimingTrackDrawContext& Context) const override;
virtual void Update(const ITimingTrackUpdateContext& Context) override;
virtual void InitTooltip(FTooltipDrawState& InOutTooltip, const ITimingEvent& InTooltipEvent) const override;
TSharedPtr<FMemoryGraphSeries> GetMemTagSeries(Insights::FMemoryTagId MemTagId);
TSharedPtr<FMemoryGraphSeries> AddMemTagSeries(Insights::FMemoryTrackerId MemTrackerId, Insights::FMemoryTagId MemTagId);
int32 RemoveMemTagSeries(Insights::FMemoryTagId MemTagId);
int32 RemoveAllMemTagSeries();
void SetAvailableTrackHeight(EMemoryTrackHeightMode InMode, float InTrackHeight);
void SetCurrentTrackHeight(EMemoryTrackHeightMode InMode);
protected:
void PreUpdateMemTagSeries(FMemoryGraphSeries& Series, const FTimingTrackViewport& Viewport);
void UpdateMemTagSeries(FMemoryGraphSeries& Series, const FTimingTrackViewport& Viewport);
virtual void DrawVerticalAxisGrid(const ITimingTrackDrawContext& Context) const override;
struct TDrawHorizontalAxisLabelParams
{
TDrawHorizontalAxisLabelParams(FDrawContext& InDrawContext, const FSlateBrush* InBrush, const TSharedRef<FSlateFontMeasure>& InFontMeasureService)
: DrawContext(InDrawContext), Brush(InBrush), FontMeasureService(InFontMeasureService)
{
}
FDrawContext& DrawContext;
const FSlateBrush* Brush;
const TSharedRef<FSlateFontMeasure>& FontMeasureService;
FLinearColor TextBgColor;
FLinearColor TextColor;
float X;
float Y;
double Value;
double Precision;
bool bShowTextDetail;
FString Prefix;
};
void DrawHorizontalAxisLabel(const TDrawHorizontalAxisLabelParams& Params) const;
static void GetUnit(const EGraphTrackLabelUnit InLabelUnit, const double InPrecision, double& OutUnitValue, const TCHAR*& OutUnitText);
static FString FormatValue(const double InValue, const double InUnitValue, const TCHAR* InUnitText, const int32 InDecimalDigitCount);
protected:
FMemorySharedState& SharedState;
EGraphTrackLabelUnit LabelUnit;
/**
* Number of decimal digits for labels.
* Specifies the number of decimal digits to use when formating labels of the vertical axis grid.
* If negative, the formatting will use maximum the number of decimal digits specified (trims trailing 0s),
* otherwise, it will use exactly the number of decimal digits specified.
*/
int32 LabelDecimalDigitCount;
double DefaultMinValue;
double DefaultMaxValue;
double AllSeriesMinValue;
double AllSeriesMaxValue;
bool bAutoZoom; // all series will share same scale
float AvailableTrackHeights[static_cast<uint32>(EMemoryTrackHeightMode::Count)];
bool bIsStacked;
TSharedPtr<FMemoryGraphSeries> MainSeries;
};
////////////////////////////////////////////////////////////////////////////////////////////////////