2021/07/25
stat gpu数据从何而来
- Stats2.h
//宏定义 函数
#define SET_CYCLE_COUNTER(Stat,Cycles) \
{\
if (FThreadStats::IsCollectingData() || !GET_STATISEVERYFRAME(Stat)) \
FThreadStats::AddMessage(GET_STATFNAME(Stat), EStatOperation::Set, int64(Cycles), true);\
}
template<typename TValue>
static FORCEINLINE_STATS void AddMessage(FName InStatName, EStatOperation::Type InStatOperation, TValue Value, bool bIsCycle = false)
{
if (!InStatName.IsNone() && WillEverCollectData() && IsThreadingReady())
{
FThreadStats* ThreadStats = GetThreadStats();
{
FStatMessage temp(InStatName, InStatOperation, Value, bIsCycle);
if (temp.NameAndInfo.GetShortName() == FName("Stat_GPU_RenderDeferredLighting"))
{
UE_LOG(LogTemp, Warning, TEXT("stat name: %s, InStatOperate: %d, Value: %f, IsCycle: %d"), *InStatName.ToString(),InStatOperation,double(Value),bIsCycle);
}
}
ThreadStats->AddStatMessage(FStatMessage(InStatName, InStatOperation, Value, bIsCycle));
if(!ThreadStats->ScopeCount)
{
ThreadStats->Flush();
}
else if( bIsRawStatsActive )
{
ThreadStats->FlushRawStats();
}
}
}
- Stats 数据通常在Engine/Source/Runtime/Cores/Private/Stats 文件中
- 上述代码获取stat数据名字,当前收集到的值等等
- 宏定义中:SET_CYCLE_COUNTER,INC_DWORD_STAT,INC_MEMORY_STAT_BY等等都调用了AddMessage函数
- FThreadStats* ThreadStats = GetThreadStats(); 获取Stats名字,如果没有创建一个
Stat GPU
- RealtimeGPUProfiler.h: 单例
- TArray<FRealtimeGPUProfilerFrame*> Frames: stat gpu 存储数据的容器
- FRealtimeGPUProfilerFrame还有几个容器是存储数据时间的容器
UpdateStats函数
bool UpdateStats(FRHICommandListImmediate& RHICmdList)
{
// Gather any remaining results and check all the results are ready
const int32 NumEventsThisFramePlusOne = NextEventIdx;
for (; NextResultPendingEventIdx < NumEventsThisFramePlusOne; ++NextResultPendingEventIdx)
{
FRealtimeGPUProfilerEvent& Event = GpuProfilerEvents[NextResultPendingEventIdx];
if (!Event.GatherQueryResults(RHICmdList))
{
#if !(UE_BUILD_SHIPPING || UE_BUILD_TEST)
UE_LOG(LogRendererCore, Warning, TEXT(