Files
UnrealEngine/Engine/Source/Developer/TraceInsights/Private/Insights/TimingProfiler/ViewModels/FrameTrackHelper.h
2025-05-18 13:04:45 +08:00

233 lines
6.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreTypes.h"
// TraceInsightsCore
#include "InsightsCore/Common/SimpleRtti.h"
#include "Styling/WidgetStyle.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
enum class ESlateDrawEffect : uint8;
class FSlateWindowElementList;
struct FGeometry;
struct FSlateBrush;
namespace TraceServices
{
struct FFrame;
}
namespace UE::Insights { class FDrawContext; }
namespace UE::Insights::TimingProfiler
{
class FFrameTrackViewport;
////////////////////////////////////////////////////////////////////////////////////////////////////
struct FFrameTrackSample
{
int32 NumFrames;
double TotalDuration; // sum of durations of all frames in this sample
double StartTime; // min start time of all frames in this sample
double EndTime; // max end time of all frames in this sample
int32 LargestFrameIndex; // index of the largest frame
double LargestFrameStartTime; // start time of the largest frame
double LargestFrameDuration; // duration of the largest frame
FFrameTrackSample()
: NumFrames(0)
, TotalDuration(0.0)
, StartTime(DBL_MAX)
, EndTime(-DBL_MAX)
, LargestFrameIndex(0)
, LargestFrameStartTime(0.0)
, LargestFrameDuration(0.0)
{}
FFrameTrackSample(const FFrameTrackSample&) = default;
FFrameTrackSample& operator=(const FFrameTrackSample&) = default;
FFrameTrackSample(FFrameTrackSample&&) = default;
FFrameTrackSample& operator=(FFrameTrackSample&&) = default;
bool Equals(const FFrameTrackSample& Other) const
{
return NumFrames == Other.NumFrames
&& TotalDuration == Other.TotalDuration
&& StartTime == Other.StartTime
&& EndTime == Other.EndTime
&& LargestFrameIndex == Other.LargestFrameIndex
&& LargestFrameStartTime == Other.LargestFrameStartTime
&& LargestFrameDuration == Other.LargestFrameDuration;
}
static bool AreEquals(const FFrameTrackSample& A, const FFrameTrackSample& B)
{
return A.Equals(B);
}
};
////////////////////////////////////////////////////////////////////////////////////////////////////
class FFrameTrackSeries
{
friend class FFrameTrackSeriesBuilder;
INSIGHTS_DECLARE_RTTI_BASE(FFrameTrackSeries)
public:
explicit FFrameTrackSeries(int32 InFrameType)
: FrameType(InFrameType)
, bIsVisible(true)
, NumAggregatedFrames(0)
, Samples()
{
}
virtual ~FFrameTrackSeries() = default;
int32 GetFrameType() const { return FrameType; }
bool IsVisible() const { return bIsVisible; }
void SetVisibility(bool bOnOff) { bIsVisible = bOnOff; }
/** Get the number of aggregated frames */
int32 GetNumAggregatedFrames() const { return NumAggregatedFrames; }
/** Set the number of aggregated frames */
void SetNumAggregatedFrames(int32 InNumAggregatedFrames) { NumAggregatedFrames = InNumAggregatedFrames; }
/** Get the number of Samples */
int32 GetNumSamples() const { return Samples.Num(); }
/** Access a single Sample by an index */
FFrameTrackSample& GetSample(int32 InIndex) { return Samples[InIndex]; }
const FFrameTrackSample& GetSample(int32 InIndex) const { return Samples[InIndex]; }
/** Returns the Samples Array by Reference */
TArray<FFrameTrackSample>& GetSamples() { return Samples; }
FLinearColor GetColor() const { return Color; }
void SetColor(const FLinearColor& InColor) { Color = InColor; }
FText GetName() const { return Name; }
void SetName(const FText& InName) { Name = InName; }
void Reset() { NumAggregatedFrames = 0; Samples.Reset(); }
private:
int32 FrameType;
bool bIsVisible;
/** Total number of frames aggregated in samples; i.e. sum of all Sample.NumFrames */
int32 NumAggregatedFrames;
/** The aggregated samples */
TArray<FFrameTrackSample> Samples;
FLinearColor Color;
FText Name;
};
////////////////////////////////////////////////////////////////////////////////////////////////////
class FTimerFrameStatsTrackSeries : public FFrameTrackSeries
{
INSIGHTS_DECLARE_RTTI(FTimerFrameStatsTrackSeries, FFrameTrackSeries)
public:
FTimerFrameStatsTrackSeries(int32 InFrameType, uint32 InTimerId)
: FFrameTrackSeries(InFrameType)
, TimerId(InTimerId)
{
}
virtual ~FTimerFrameStatsTrackSeries() = default;
uint32 GetTimerId() const { return TimerId; }
private:
uint32 TimerId;
};
////////////////////////////////////////////////////////////////////////////////////////////////////
class FFrameTrackSeriesBuilder
{
public:
explicit FFrameTrackSeriesBuilder(FFrameTrackSeries& InSeries, const FFrameTrackViewport& InViewport);
/**
* Non-copyable
*/
FFrameTrackSeriesBuilder(const FFrameTrackSeriesBuilder&) = delete;
FFrameTrackSeriesBuilder& operator=(const FFrameTrackSeriesBuilder&) = delete;
void AddFrame(const TraceServices::FFrame& Frame);
int32 GetNumAddedFrames() const { return NumAddedFrames; }
private:
FFrameTrackSeries& Series; // series to update
const FFrameTrackViewport& Viewport;
float SampleW; // width of a sample, in Slate units
int32 FramesPerSample; // number of frames in a sample
int32 FirstFrameIndex; // index of first frame in first sample; can be negative
int32 NumSamples; // total number of samples
// Debug stats.
int32 NumAddedFrames; // counts total number of added frame events
};
////////////////////////////////////////////////////////////////////////////////////////////////////
class FFrameTrackDrawHelper
{
public:
explicit FFrameTrackDrawHelper(const FDrawContext& InDrawContext, const FFrameTrackViewport& InViewport);
/**
* Non-copyable
*/
FFrameTrackDrawHelper(const FFrameTrackDrawHelper&) = delete;
FFrameTrackDrawHelper& operator=(const FFrameTrackDrawHelper&) = delete;
void SetThresholds(double InUpperThresholdTime, double InLowerThresholdTime)
{
UpperThresholdTime = InUpperThresholdTime;
LowerThresholdTime = InLowerThresholdTime;
}
void DrawBackground() const;
void DrawCached(const FFrameTrackSeries& Series) const;
void DrawHoveredSample(const FFrameTrackSample& Sample) const;
void DrawHighlightedInterval(const FFrameTrackSeries& Series, const double StartTime, const double EndTime) const;
static const TCHAR* FrameTypeToString(int32 FrameType);
static FText FrameTypeToText(int32 FrameType);
static uint32 GetColor32ByFrameType(int32 FrameType);
static FLinearColor GetColorByFrameType(int32 FrameType);
int32 GetNumFrames() const { return NumFrames; }
int32 GetNumDrawSamples() const { return NumDrawSamples; }
private:
const FDrawContext& DrawContext;
const FFrameTrackViewport& Viewport;
const FSlateBrush* WhiteBrush;
const FSlateBrush* HoveredFrameBorderBrush;
double UpperThresholdTime = 1.0 / 30.0;
double LowerThresholdTime = 1.0 / 60.0;
// Debug stats.
mutable int32 NumFrames;
mutable int32 NumDrawSamples;
};
////////////////////////////////////////////////////////////////////////////////////////////////////
} // namespace UE::Insights::TimingProfiler