void FScriptExecutionTunnelInstance::RefreshStats(const FTracePath& TracePath) { // Process stat update TArray<TSharedPtr<FScriptPerfData>> BlueprintPooledStats; // Find all the entry site stats for (auto EntrySite : EntrySites) { EntrySite.Value->GetInstancePerfDataByTracePath(TracePath, BlueprintPooledStats); } // Update the owning blueprint stats if (BlueprintPooledStats.Num() > 0) { TSharedPtr<FScriptPerfData> BlueprintData = GetBlueprintPerfDataByTracePath(TracePath); BlueprintData->AccumulateDataSet(BlueprintPooledStats); } // Update the node stats UpdatePerfDataForNode(); }
void FScriptExecutionNode::RefreshStats(const FTracePath& TracePath) { // Process stat update bool bRefreshChildStats = false; bool bRefreshLinkStats = true; TArray<TSharedPtr<FScriptPerfData>> BlueprintPooledStats; // Update stats based on type switch(GetStatisticContainerType()) { case EScriptStatContainerType::Standard: case EScriptStatContainerType::Container: { GetInstancePerfDataByTracePath(TracePath, BlueprintPooledStats); bRefreshChildStats = true; break; } case EScriptStatContainerType::PureNode: { GetInstancePerfDataByTracePath(TracePath, BlueprintPooledStats); bRefreshChildStats = false; bRefreshLinkStats = false; break; } case EScriptStatContainerType::SequentialBranch: { GetInstancePerfDataByTracePath(TracePath, BlueprintPooledStats); break; } case EScriptStatContainerType::NewExecutionPath: { // Refresh child stats and copy as branch stats - this is a dummy entry TSet<FName> AllInstances; TArray<FLinearExecPath> ChildExecPaths; for (auto ChildIter : ChildNodes) { ChildIter->GetValidInstanceNames(AllInstances); ChildIter->RefreshStats(TracePath); ChildIter->GetLinearExecutionPath(ChildExecPaths, TracePath, false); } for (auto InstanceIter : AllInstances) { if (InstanceIter != NAME_None) { TSharedPtr<FScriptPerfData> InstancePerfData = GetPerfDataByInstanceAndTracePath(InstanceIter, TracePath); InstancePerfData->Reset(); BlueprintPooledStats.Add(InstancePerfData); TArray<TSharedPtr<FScriptPerfData>> ChildDataSet; for (auto ChildIter : ChildExecPaths) { TSharedPtr<FScriptPerfData> ChildPerfData = ChildIter.LinkedNode->GetPerfDataByInstanceAndTracePath(InstanceIter, ChildIter.TracePath); if (ChildPerfData.IsValid()) { ChildDataSet.Add(ChildPerfData); } } InstancePerfData->AccumulateDataSet(ChildDataSet, true); } } // Update Blueprint stats as branches TSharedPtr<FScriptPerfData> BlueprintData = GetOrAddBlueprintPerfDataByTracePath(TracePath); BlueprintData->CreateBlueprintStats(BlueprintPooledStats); BlueprintPooledStats.Reset(0); bRefreshLinkStats = false; break; } } // Refresh Child Links if (bRefreshChildStats) { for (auto ChildIter : ChildNodes) { ChildIter->RefreshStats(TracePath); } } // Refresh All links if (bRefreshLinkStats) { for (auto LinkIter : LinkedNodes) { FTracePath LinkTracePath(TracePath); if (LinkIter.Value->HasFlags(EScriptExecutionNodeFlags::EventPin)) { LinkTracePath.ResetPath(); } if (!LinkIter.Value->HasFlags(EScriptExecutionNodeFlags::InvalidTrace)) { LinkTracePath.AddExitPin(LinkIter.Key); } LinkIter.Value->RefreshStats(LinkTracePath); } } // Update the owning blueprint stats if (BlueprintPooledStats.Num() > 0) { TSharedPtr<FScriptPerfData> BlueprintData = GetOrAddBlueprintPerfDataByTracePath(TracePath); BlueprintData->CreateBlueprintStats(BlueprintPooledStats); } // Update the node stats UpdatePerfDataForNode(); }