From 8529d644c2b788e9625198c5816865dba85fb4a3 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Geenz\" Goodman" Date: Fri, 18 Jul 2025 18:41:36 -0400 Subject: [PATCH 1/4] Add support for Normalized Frametime Variation (NVFT) Sampled every 5 seconds. --- indra/newview/llviewerstats.cpp | 10 ++++++++++ indra/newview/skins/default/xui/en/floater_stats.xml | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index a4f308bbf9c..b87977fadf5 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -234,6 +234,7 @@ LLTrace::SampleStatHandle FRAMETIME_JITTER_EVENTS("frametimeevents", "Numbe FRAMETIME_JITTER_EVENTS_LAST_MINUTE("frametimeeventslastmin", "Number of frametime events in the last minute."); LLTrace::SampleStatHandle NOTRMALIZED_FRAMETIME_JITTER_SESSION("normalizedframetimejitter", "Normalized frametime jitter over the session."); +LLTrace::SampleStatHandle NFTV("nftv", "Normalized frametime variation."); LLTrace::EventStatHandle > AGENT_POSITION_SNAP("agentpositionsnap", "agent position corrections"); @@ -360,6 +361,15 @@ void LLViewerStats::updateFrameStats(const F64Seconds time_diff) sample(LLStatViewer::FRAMETIME_JITTER_99TH, ninety_ninth_percentile); sample(LLStatViewer::FRAMETIME_JITTER_95TH, ninety_fifth_percentile); + F64 averageFrameTime = 0; + for (const auto& frame_time : mFrameTimes) + { + averageFrameTime += frame_time.value(); + } + averageFrameTime /= mFrameTimes.size(); + + sample(LLStatViewer::NFTV, frame_time_stddev / averageFrameTime); + mFrameTimes.clear(); mFrameTimesJitter.clear(); mLastFrameTimeSample = F64Seconds(0); diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml index f2309eb8177..bf949c7fb05 100644 --- a/indra/newview/skins/default/xui/en/floater_stats.xml +++ b/indra/newview/skins/default/xui/en/floater_stats.xml @@ -58,6 +58,10 @@ label="normalized sess. jitter" decimal_digits="4" stat="normalizedframetimejitter"/> + Date: Thu, 24 Jul 2025 15:56:33 -0400 Subject: [PATCH 2/4] Add wiring. --- indra/newview/llviewerstats.cpp | 7 +++++++ indra/newview/llviewerstats.h | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index b87977fadf5..c004d1cd3a2 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -322,6 +322,8 @@ void LLViewerStats::updateFrameStats(const F64Seconds time_diff) mTotalFrametimeJitter += jit; sample(LLStatViewer::FRAMETIME_JITTER_CUMULATIVE, mTotalFrametimeJitter); sample(LLStatViewer::NOTRMALIZED_FRAMETIME_JITTER_SESSION, mTotalFrametimeJitter / mTotalTime); + + mLastNoramlizedSessionJitter = mTotalFrametimeJitter / mTotalTime; static LLCachedControl frameTimeEventThreshold(gSavedSettings, "StatsFrametimeEventThreshold", 0.1f); @@ -369,6 +371,7 @@ void LLViewerStats::updateFrameStats(const F64Seconds time_diff) averageFrameTime /= mFrameTimes.size(); sample(LLStatViewer::NFTV, frame_time_stddev / averageFrameTime); + mLastNormalizedFrametimeVariance = frame_time_stddev / averageFrameTime; mFrameTimes.clear(); mFrameTimesJitter.clear(); @@ -658,6 +661,10 @@ void send_viewer_stats(bool include_preferences) // send fps only for time app spends in foreground agent["fps"] = (F32)gForegroundFrameCount / gForegroundTime.getElapsedTimeF32(); + + agent["normalized_session_jitter"] = LLViewerStats::instance().getLastNormalizedSessionJitter(); + agent["normalized_frametime_variance"] = LLViewerStats::instance().getLastNormalizedFrametimeVariance(); + agent["version"] = LLVersionInfo::instance().getChannelAndVersion(); std::string language = LLUI::getLanguage(); agent["language"] = language; diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h index 4ec7c6dfacd..efb4ca86dcd 100644 --- a/indra/newview/llviewerstats.h +++ b/indra/newview/llviewerstats.h @@ -271,6 +271,9 @@ class LLViewerStats : public LLSingleton LLTrace::Recording& getRecording() { return mRecording; } const LLTrace::Recording& getRecording() const { return mRecording; } + F32 getLastNormalizedSessionJitter() const { return mLastNoramlizedSessionJitter; } + F32 getLastNormalizedFrametimeVariance() const { return mLastNormalizedFrametimeVariance; } + private: LLTrace::Recording mRecording; @@ -286,6 +289,10 @@ class LLViewerStats : public LLSingleton F64Seconds mTimeSinceLastEventSample; std::vector mFrameTimes; // used for frame time stats std::vector mFrameTimesJitter; // used for frame time jitter stats + + F32 mLastNoramlizedSessionJitter; // used for frame time jitter stats + F32 mLastNormalizedFrametimeVariance; // Used when submitting jitter stats + }; static const F32 SEND_STATS_PERIOD = 300.0f; From ef967720cfca72677c42b3edc384517f82ded734 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Geenz\" Goodman" Date: Thu, 24 Jul 2025 15:58:18 -0400 Subject: [PATCH 3/4] Trailing space. --- indra/newview/llviewerstats.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index c004d1cd3a2..130b2d21366 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -322,7 +322,7 @@ void LLViewerStats::updateFrameStats(const F64Seconds time_diff) mTotalFrametimeJitter += jit; sample(LLStatViewer::FRAMETIME_JITTER_CUMULATIVE, mTotalFrametimeJitter); sample(LLStatViewer::NOTRMALIZED_FRAMETIME_JITTER_SESSION, mTotalFrametimeJitter / mTotalTime); - + mLastNoramlizedSessionJitter = mTotalFrametimeJitter / mTotalTime; static LLCachedControl frameTimeEventThreshold(gSavedSettings, "StatsFrametimeEventThreshold", 0.1f); From 10f87a3872af313dde0b1da0cd549cc32e5fb642 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Geenz\" Goodman" Date: Thu, 24 Jul 2025 19:03:20 -0400 Subject: [PATCH 4/4] Fix for warning --- indra/newview/llviewerstats.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h index efb4ca86dcd..bd7178224f5 100644 --- a/indra/newview/llviewerstats.h +++ b/indra/newview/llviewerstats.h @@ -271,8 +271,8 @@ class LLViewerStats : public LLSingleton LLTrace::Recording& getRecording() { return mRecording; } const LLTrace::Recording& getRecording() const { return mRecording; } - F32 getLastNormalizedSessionJitter() const { return mLastNoramlizedSessionJitter; } - F32 getLastNormalizedFrametimeVariance() const { return mLastNormalizedFrametimeVariance; } + F64 getLastNormalizedSessionJitter() const { return mLastNoramlizedSessionJitter; } + F64 getLastNormalizedFrametimeVariance() const { return mLastNormalizedFrametimeVariance; } private: LLTrace::Recording mRecording; @@ -290,8 +290,8 @@ class LLViewerStats : public LLSingleton std::vector mFrameTimes; // used for frame time stats std::vector mFrameTimesJitter; // used for frame time jitter stats - F32 mLastNoramlizedSessionJitter; // used for frame time jitter stats - F32 mLastNormalizedFrametimeVariance; // Used when submitting jitter stats + F64 mLastNoramlizedSessionJitter; // used for frame time jitter stats + F64 mLastNormalizedFrametimeVariance; // Used when submitting jitter stats };