summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorJonathan "Geenz" Goodman <geenz@lindenlab.com>2025-08-13 13:48:55 -0400
committerGitHub <noreply@github.com>2025-08-13 13:48:55 -0400
commit024da37b8bbdf2daf7d7fa40b12229ee74b43df4 (patch)
tree19b550c8036b4f03ff1e89a3616df3e0acf5010f /indra
parent82e6e42b9ee62af0e39049e3d789457fe1a41281 (diff)
Add support for Normalized Frametime Variation (NVFT) (#4395)
* Add support for Normalized Frametime Variation (NVFT) * Add normalized period jitter
Diffstat (limited to 'indra')
-rw-r--r--indra/newview/llviewerstats.cpp30
-rw-r--r--indra/newview/llviewerstats.h9
-rw-r--r--indra/newview/skins/default/xui/en/floater_stats.xml8
3 files changed, 47 insertions, 0 deletions
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index a4f308bbf9..d39d466205 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -234,6 +234,8 @@ LLTrace::SampleStatHandle<U32> FRAMETIME_JITTER_EVENTS("frametimeevents", "Numbe
FRAMETIME_JITTER_EVENTS_LAST_MINUTE("frametimeeventslastmin", "Number of frametime events in the last minute.");
LLTrace::SampleStatHandle<F64> NOTRMALIZED_FRAMETIME_JITTER_SESSION("normalizedframetimejitter", "Normalized frametime jitter over the session.");
+LLTrace::SampleStatHandle<F64> NFTV("nftv", "Normalized frametime variation.");
+LLTrace::SampleStatHandle<F64> NORMALIZED_FRAMTIME_JITTER_PERIOD("normalizedframetimejitterperiod", "Normalized frametime jitter over the last 5 seconds.");
LLTrace::EventStatHandle<LLUnit<F64, LLUnits::Meters> > AGENT_POSITION_SNAP("agentpositionsnap", "agent position corrections");
@@ -322,6 +324,8 @@ void LLViewerStats::updateFrameStats(const F64Seconds time_diff)
sample(LLStatViewer::FRAMETIME_JITTER_CUMULATIVE, mTotalFrametimeJitter);
sample(LLStatViewer::NOTRMALIZED_FRAMETIME_JITTER_SESSION, mTotalFrametimeJitter / mTotalTime);
+ mLastNoramlizedSessionJitter = mTotalFrametimeJitter / mTotalTime;
+
static LLCachedControl<F32> frameTimeEventThreshold(gSavedSettings, "StatsFrametimeEventThreshold", 0.1f);
if (time_diff - mLastTimeDiff > mLastTimeDiff * frameTimeEventThreshold())
@@ -360,6 +364,27 @@ 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);
+ mLastNormalizedFrametimeVariance = frame_time_stddev / averageFrameTime;
+
+ // Add up all of the jitter values.
+ F64 totalJitter = 0;
+ for (const auto& frame_jitter : mFrameTimesJitter)
+ {
+ totalJitter += frame_jitter.value();
+ }
+
+ mLastNormalizedPeriodJitter = totalJitter / mLastFrameTimeSample;
+
+ sample(LLStatViewer::NORMALIZED_FRAMTIME_JITTER_PERIOD, mLastNormalizedPeriodJitter);
+
mFrameTimes.clear();
mFrameTimesJitter.clear();
mLastFrameTimeSample = F64Seconds(0);
@@ -648,6 +673,11 @@ 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["normalized_period_jitter"] = LLViewerStats::instance().getLastNormalizedPeriodJitter();
+
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 63fb7d4a17..011269d7ee 100644
--- a/indra/newview/llviewerstats.h
+++ b/indra/newview/llviewerstats.h
@@ -271,6 +271,10 @@ public:
LLTrace::Recording& getRecording() { return mRecording; }
const LLTrace::Recording& getRecording() const { return mRecording; }
+ F64 getLastNormalizedSessionJitter() const { return mLastNoramlizedSessionJitter; }
+ F64 getLastNormalizedFrametimeVariance() const { return mLastNormalizedFrametimeVariance; }
+ F64 getLastNormalizedPeriodJitter() const { return mLastNormalizedPeriodJitter; }
+
private:
LLTrace::Recording mRecording;
@@ -286,6 +290,11 @@ private:
F64Seconds mTimeSinceLastEventSample;
std::vector<F64Seconds> mFrameTimes; // used for frame time stats
std::vector<F64Seconds> mFrameTimesJitter; // used for frame time jitter stats
+
+ F64 mLastNoramlizedSessionJitter; // used for frame time jitter stats
+ F64 mLastNormalizedFrametimeVariance; // Used when submitting jitter stats
+ F64 mLastNormalizedPeriodJitter;
+
};
static const F32 SEND_STATS_PERIOD = 300.0f;
diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml
index f2309eb817..1600c422c3 100644
--- a/indra/newview/skins/default/xui/en/floater_stats.xml
+++ b/indra/newview/skins/default/xui/en/floater_stats.xml
@@ -58,6 +58,14 @@
label="normalized sess. jitter"
decimal_digits="4"
stat="normalizedframetimejitter"/>
+ <stat_bar name="normalized_period_jitter"
+ label="normalized period jitter"
+ decimal_digits="4"
+ stat="normalizedframetimejitterperiod"/>
+ <stat_bar name="normalized_frametime_variation"
+ label="normalized frametime variation"
+ decimal_digits="4"
+ stat="nftv"/>
<stat_bar name="frame_events_per_minute"
label="frame events/minute"
decimal_digits="2"