123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- /*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
- #include <AzCore/Asset/AssetManagerBus.h>
- #include <AzCore/RTTI/BehaviorContext.h>
- #include <ScriptCanvas/Asset/RuntimeAsset.h>
- #include <ScriptCanvas/Execution/ExecutionBus.h>
- #include <ScriptCanvas/Execution/ExecutionPerformanceTimer.h>
- #include <ScriptCanvas/PerformanceStatistician.h>
- #include <ScriptCanvas/PerformanceTracker.h>
- #include <ScriptCanvas/SystemComponent.h>
- namespace ScriptCanvas
- {
- namespace Execution
- {
- void PerformanceStatistics::CalculateSecondary()
- {
- scriptCostPercent = aznumeric_cast<double>(report.tracking.timing.totalTime) / aznumeric_cast<double>(duration);
- }
- AZStd::string ToConsoleString(const PerformanceStatistics& stats)
- {
- AZStd::string consoleString("\n");
- const double initializingMs = aznumeric_caster(stats.report.tracking.timing.initializationTime / 1000.0);
- const double executionMs = aznumeric_caster(stats.report.tracking.timing.executionTime / 1000.0);
- const double latentMs = aznumeric_caster(stats.report.tracking.timing.latentTime / 1000.0);
- const double totalMs = aznumeric_caster(stats.report.tracking.timing.totalTime / 1000.0);
- consoleString += "[ INITIALIZE] ";
- consoleString += AZStd::string::format("%7.3f ms \n", initializingMs);
- consoleString += "[ EXECUTION] ";
- consoleString += AZStd::string::format("%7.3f ms \n", executionMs);
- consoleString += "[ LATENT] ";
- consoleString += AZStd::string::format("%7.3f ms \n", latentMs);
- consoleString += "[ TOTAL] ";
- consoleString += AZStd::string::format("%7.3f ms \n", totalMs);
- consoleString += "[SCRIPT COST] ";
- consoleString += AZStd::string::format("%7.4f%% of duration \n", stats.scriptCostPercent);
- return consoleString;
- }
- PerformanceStatistician::PerformanceStatistician()
- {
- PerformanceStatisticsEBus::Handler::BusConnect();
- }
- void PerformanceStatistician::ClearSnaphotStatistics()
- {
- m_executedScripts.clear();
- auto perfTracker = SystemComponent::ModPerformanceTracker();
- perfTracker->ClearGlobalReport();
- perfTracker->ClearSnapshotReport();
- }
- void PerformanceStatistician::ClearTrackingState()
- {
- m_trackingState = TrackingState::None;
- if (AZ::SystemTickBus::Handler::BusIsConnected())
- {
- AZ::SystemTickBus::Handler::BusDisconnect();
- }
- }
- void PerformanceStatistician::ConnectToSystemTickBus()
- {
- if (!AZ::SystemTickBus::Handler::BusIsConnected())
- {
- AZ::SystemTickBus::Handler::BusConnect();
- }
- }
- AZStd::vector<AZStd::string> PerformanceStatistician::GetExecutedScriptsSinceLastSnapshot() const
- {
- AZStd::vector<AZStd::string> scripts;
- scripts.reserve(m_executedScripts.size());
- for (auto& iter : m_executedScripts)
- {
- scripts.push_back(iter.second);
- }
- return scripts;
- }
- const PerformanceStatistics& PerformanceStatistician::GetStatistics() const
- {
- return m_accumulatedStats;
- }
- void PerformanceStatistician::OnStartTrackingRequested()
- {
- m_accumulatedStats.tickCount = 0;
- m_accumulatedStartTime = AZStd::chrono::steady_clock::now();
- }
- void PerformanceStatistician::OnSystemTick()
- {
- switch (m_trackingState)
- {
- case TrackingState::AccumulatedInProgress:
- UpdateTickCounts();
- break;
- case TrackingState::AccumulatedStartRequested:
- OnStartTrackingRequested();
- m_trackingState = TrackingState::AccumulatedInProgress;
- break;
- case TrackingState::AccumulatedStopRequested:
- UpdateAccumulatedTime();
- UpdateStatisticsFromTracker();
- UpdateAccumulatedStatistics();
- ClearTrackingState();
- break;
- case TrackingState::PerFrameInProgress:
- UpdateTickCounts();
- UpdateStatisticsFromTracker();
- break;
- case TrackingState::PerFrameStartRequested:
- OnStartTrackingRequested();
- m_trackingState = TrackingState::PerFrameInProgress;
- break;
- case TrackingState::PerFrameStopRequested:
- UpdateAccumulatedTime();
- UpdateStatisticsFromTracker();
- ClearTrackingState();
- break;
- default:
- break;
- }
- }
- void PerformanceStatistician::Reflect(AZ::ReflectContext* reflectContext)
- {
- if (auto behaviorContext = azrtti_cast<AZ::BehaviorContext*>(reflectContext))
- {
- behaviorContext->EBus<PerformanceStatisticsEBus>("PerformanceStatisticsEBus")
- ->Event("ClearSnaphotStatistics", &PerformanceStatisticsEBus::Events::ClearSnaphotStatistics)
- ->Event("TrackAccumulatedStart", &PerformanceStatisticsEBus::Events::TrackAccumulatedStart)
- ->Event("TrackAccumulatedStop", &PerformanceStatisticsEBus::Events::TrackAccumulatedStop)
- ->Event("TrackPerFrameStart", &PerformanceStatisticsEBus::Events::TrackPerFrameStart)
- ->Event("TrackPerFrameStop", &PerformanceStatisticsEBus::Events::TrackPerFrameStop)
- ;
- }
- }
- void PerformanceStatistician::TrackAccumulatedStart(AZ::s32 tickCount)
- {
- if (m_trackingState != TrackingState::AccumulatedStartRequested || m_accumulatedTickCountRemaining != tickCount)
- {
- m_trackingState = TrackingState::AccumulatedStartRequested;
- m_accumulatedTickCountRemaining = tickCount;
- ConnectToSystemTickBus();
- }
- }
- void PerformanceStatistician::TrackAccumulatedStop()
- {
- if (m_trackingState == TrackingState::AccumulatedInProgress)
- {
- m_trackingState = TrackingState::AccumulatedStopRequested;
- }
- }
- void PerformanceStatistician::TrackPerFrameStart()
- {
- if (m_trackingState != TrackingState::PerFrameInProgress)
- {
- m_trackingState = TrackingState::PerFrameStartRequested;
- ConnectToSystemTickBus();
- }
- }
- void PerformanceStatistician::TrackPerFrameStop()
- {
- if (m_trackingState == TrackingState::PerFrameInProgress || m_trackingState == TrackingState::AccumulatedStartRequested)
- {
- m_trackingState = TrackingState::PerFrameStopRequested;
- AZ::SystemTickBus::Handler::BusConnect();
- }
- }
- void PerformanceStatistician::UpdateAccumulatedStatistics()
- {
- m_accumulatedStats.report = SystemComponent::ModPerformanceTracker()->GetGlobalReportFull();
- m_accumulatedStats.CalculateSecondary();
- AZ_TracePrintf("ScriptCanvas", "Global Performance Report:\n%s", ToConsoleString(m_accumulatedStats).c_str());
- }
- void PerformanceStatistician::UpdateAccumulatedTime()
- {
- m_accumulatedStats.duration = AZStd::chrono::duration_cast<AZStd::chrono::microseconds>(AZStd::chrono::steady_clock::now() - m_accumulatedStartTime).count();
- }
- void PerformanceStatistician::UpdateStatisticsFromTracker()
- {
- auto perfTracker = SystemComponent::ModPerformanceTracker();
- perfTracker->CalculateReports();
- const PerformanceReport& snapShotReport = perfTracker->GetSnapshotReportFull();
- for (auto& snapshotIter : snapShotReport.byAsset)
- {
- auto iter = m_executedScripts.find(snapshotIter.first);
- if (iter == m_executedScripts.end())
- {
- AZ::Data::AssetInfo info;
- AZ::Data::AssetCatalogRequestBus::BroadcastResult(info, &AZ::Data::AssetCatalogRequests::GetAssetInfoById, snapshotIter.first);
- if (info.m_assetType == azrtti_typeid<ScriptCanvas::RuntimeAsset>())
- {
- AZStd::string fileName;
- if (AZ::StringFunc::Path::GetFileName(info.m_relativePath.c_str(), fileName))
- {
- m_executedScripts.insert({ snapshotIter.first, fileName });
- }
- }
- }
- }
- }
- void PerformanceStatistician::UpdateTickCounts()
- {
- ++m_accumulatedStats.tickCount;
- --m_accumulatedTickCountRemaining;
- if (m_trackingState == TrackingState::AccumulatedInProgress && m_accumulatedTickCountRemaining == 0)
- {
- m_trackingState = TrackingState::AccumulatedStopRequested;
- }
- }
- }
- }
|