// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "TraceServices/Model/Counters.h" #include "TraceServices/Model/LoadTimeProfiler.h" #include "Common/SlabAllocator.h" #include "Common/PagedArray.h" #include "Common/StringStore.h" #include "Model/MonotonicTimeline.h" #include "Model/Tables.h" namespace TraceServices { class FAnalysisSessionLock; class FLoadTimeProfilerProvider : public ILoadTimeProfilerProvider { public: typedef TMonotonicTimeline CpuTimelineInternal; explicit FLoadTimeProfilerProvider(IAnalysisSession& Session, IEditableCounterProvider& EditableCounterProvider); virtual ~FLoadTimeProfilerProvider() {} virtual uint64 GetTimelineCount() const override { return CpuTimelines.Num(); } virtual bool GetCpuThreadTimelineIndex(uint32 ThreadId, uint32& OutTimelineIndex) const override; virtual bool ReadTimeline(uint32 Index, TFunctionRef Callback) const override; virtual ITable* CreateEventAggregation(double IntervalStart, double IntervalEnd) const override; virtual ITable* CreateObjectTypeAggregation(double IntervalStart, double IntervalEnd) const override; virtual ITable* CreatePackageDetailsTable(double IntervalStart, double IntervalEnd) const override; virtual ITable* CreateExportDetailsTable(double IntervalStart, double IntervalEnd) const override; virtual ITable* CreateRequestsTable(double IntervalStart, double IntervalEnd) const override; virtual const ITable& GetRequestsTable() const override { return RequestsTable; } const FClassInfo& AddClassInfo(const TCHAR* ClassName); FLoadRequest& CreateRequest(); FPackageInfo& CreatePackage(); FPackageExportInfo& CreateExport(); CpuTimelineInternal& EditCpuTimeline(uint32 ThreadId); uint64 BeginIoDispatcherBatch(uint64 BatchId, double Time); void EndIoDispatcherBatch(uint64 BatchHandle, double Time, uint64 TotalSize); private: struct FLoaderFrame; static uint64 PackageSizeSum(const FLoadRequest& Row); void CreateCounters(); void DistributeBytesAcrossFrames(uint64 ByteCount, double StartTime, double EndTime, uint64 FLoaderFrame::* FrameVariable); static constexpr double LoaderFrameLength = 1.0 / 60.0; struct FPackageLoad { const FPackageInfo* Package = nullptr; double StartTime = 0.0; double EndTime = 0.0; }; struct FIoDispatcherBatch { double StartTime = 0.0; double EndTime = 0.0; uint64 TotalSize = 0; }; struct FLoaderFrame { uint64 IoDispatcherReadBytes = 0; uint64 HeaderLoadedBytes = 0; uint64 ExportLoadedBytes = 0; }; class FLoaderFrameCounter : public ICounter { public: enum ELoaderFrameCounterType { LoaderFrameCounterType_IoDispatcherThroughput, LoaderFrameCounterType_LoaderThroughput, LoaderFrameCounterType_Count }; FLoaderFrameCounter(ELoaderFrameCounterType Type, const TPagedArray& Frames); virtual ~FLoaderFrameCounter() {} virtual const TCHAR* GetName() const override; virtual const TCHAR* GetGroup() const override; virtual const TCHAR* GetDescription() const override; virtual bool IsFloatingPoint() const override; virtual ECounterDisplayHint GetDisplayHint() const override; virtual void EnumerateValues(double IntervalStart, double IntervalEnd, bool bIncludeExternalBounds, TFunctionRef Callback) const override; virtual void EnumerateFloatValues(double IntervalStart, double IntervalEnd, bool bIncludeExternalBounds, TFunctionRef Callback) const override; virtual void EnumerateOps(double IntervalStart, double IntervalEnd, bool bIncludeExternalBounds, TFunctionRef Callback) const override; virtual void EnumerateFloatOps(double IntervalStart, double IntervalEnd, bool bIncludeExternalBounds, TFunctionRef Callback) const override; private: const TPagedArray& Frames; ELoaderFrameCounterType Type; }; IAnalysisSession& Session; IEditableCounterProvider& EditableCounterProvider; TPagedArray ClassInfos; TPagedArray Requests; TPagedArray Packages; TPagedArray IoDispatcherBatches; TPagedArray Exports; TArray> CpuTimelines; TMap CpuTimelinesThreadMap; TTableView RequestsTable; TTableLayout AggregatedStatsTableLayout; TTableLayout PackagesTableLayout; TTableLayout ExportsTableLayout; TTableLayout RequestsTableLayout; TPagedArray Frames; bool bHasCreatedCounters = false; IEditableCounter* ActiveIoDispatcherBatchesCounter = nullptr; IEditableCounter* TotalIoDispatcherBytesReadCounter = nullptr; IEditableCounter* LoadingPackagesCounter = nullptr; IEditableCounter* TotalLoaderBytesLoadedCounter = nullptr; }; } // namespace TraceServices