int32 FServiceConnection::FindOrAddThread(const FStatNameAndInfo& Thread) { SCOPE_CYCLE_COUNTER(STAT_PC_FindOrAddThread); const FName LongName = Thread.GetRawName(); int32* const ThreadIDPtr = ThreadNameArray.Find( LongName ); int32 ThreadID = ThreadIDPtr != nullptr ? *ThreadIDPtr : -1; if (!ThreadIDPtr) { // meta data has been updated CurrentData.MetaDataUpdated = true; // get the thread description FString Desc; Thread.GetDescription(Desc); // Extract out the thread id and add to the descriptions FString ID = Desc.Replace(TEXT("Thread_"), TEXT("")); ID = ID.Replace(TEXT("_0"), TEXT("")); ThreadID = FParse::HexNumber(*ID); ThreadNameArray.Add(LongName, ThreadID); // add to the meta data FScopeLock ScopeLock(&CriticalSection); MetaData.ThreadDescriptions.Add(ThreadID, Thread.GetShortName().ToString()); } return ThreadID; }
int32 FServiceConnection::FindOrAddStat( const FStatNameAndInfo& StatNameAndInfo, uint32 StatType) { SCOPE_CYCLE_COUNTER(STAT_PC_FindOrAddStat); const FName LongName = StatNameAndInfo.GetRawName(); int32* const StatIDPtr = LongNameToStatID.Find( LongName ); int32 StatID = StatIDPtr != nullptr ? *StatIDPtr : -1; if (!StatIDPtr) { // meta data has been updated CurrentData.MetaDataUpdated = true; const FName StatName = StatNameAndInfo.GetShortName(); FName GroupName = StatNameAndInfo.GetGroupName(); const FString Description = StatNameAndInfo.GetDescription(); // do some special stats first if (StatName == TEXT("STAT_FrameTime")) { StatID = LongNameToStatID.Add(LongName, 2); } else if (StatName == FStatConstants::NAME_ThreadRoot) { StatID = LongNameToStatID.Add(LongName, 1); GroupName = TEXT( "NoGroup" ); } else { StatID = LongNameToStatID.Add(LongName, LongNameToStatID.Num()+10); } check(StatID != -1); // add a new stat description to the meta data FStatDescription StatDescription; StatDescription.ID = StatID; StatDescription.Name = !Description.IsEmpty() ? Description : StatName.ToString(); if( StatDescription.Name.Contains( TEXT("STAT_") ) ) { StatDescription.Name = StatDescription.Name.RightChop(FString(TEXT("STAT_")).Len()); } StatDescription.StatType = StatType; if( GroupName == NAME_None && Stream.Header.Version == EStatMagicNoHeader::NO_VERSION ) { // @todo Add more ways to group the stats. const int32 Thread_Pos = StatDescription.Name.Find( TEXT("Thread_") ); const int32 _0Pos = StatDescription.Name.Find( TEXT("_0") ); const bool bIsThread = Thread_Pos != INDEX_NONE && _0Pos > Thread_Pos; // Add a special group for all threads. if( bIsThread ) { GroupName = TEXT("Threads"); } // Add a special group for all objects. else { GroupName = TEXT("Objects"); } } int32* const GroupIDPtr = GroupNameArray.Find( GroupName ); int32 GroupID = GroupIDPtr != nullptr ? *GroupIDPtr : -1; if( !GroupIDPtr ) { // add a new group description to the meta data GroupID = GroupNameArray.Add(GroupName, GroupNameArray.Num()+10); check( GroupID != -1 ); FStatGroupDescription GroupDescription; GroupDescription.ID = GroupID; GroupDescription.Name = GroupName.ToString(); GroupDescription.Name.RemoveFromStart(TEXT("STATGROUP_")); // add to the meta data FScopeLock ScopeLock(&CriticalSection); MetaData.GroupDescriptions.Add(GroupDescription.ID, GroupDescription); } { StatDescription.GroupID = GroupID; FScopeLock ScopeLock(&CriticalSection); MetaData.StatDescriptions.Add(StatDescription.ID, StatDescription); } } // return the stat id return StatID; }