From 15574431354e55059c4514fa51a7c78b90ed8b6e Mon Sep 17 00:00:00 2001 From: "Jonathan \"Geenz\" Goodman" Date: Fri, 27 Jun 2025 15:41:58 -0400 Subject: First pass at adding expanded frametiming stats to the viewer. --- indra/newview/llviewerstats.cpp | 129 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 127 insertions(+), 2 deletions(-) (limited to 'indra/newview/llviewerstats.cpp') diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 73aabf49d1..e5a347ecdd 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -220,7 +220,16 @@ SimMeasurement SIM_PHYSICS_MEM("physicsmemoryallocated", "", LL LLTrace::SampleStatHandle FRAMETIME_JITTER("frametimejitter", "Average delta between successive frame times"), FRAMETIME("frametime", "Measured frame time"), - SIM_PING("simpingstat"); + SIM_PING("simpingstat"), + FRAMETIME_JITTER_99TH("frametimejitter99", "99th percentile of frametime jitter over the last 5 seconds."), + FRAMETIME_JITTER_95TH("frametimejitter95", "99th percentile of frametime jitter over the last 5 seconds."), + FRAMETIME_99TH("frametime99", "99th percentile of frametime over the last 5 seconds."), + FRAMETIME_95TH("frametime95", "99th percentile of frametime over the last 5 seconds."), + FRAMETIME_JITTER_CUMULATIVE("frametimejitcumulative", "Cumulative frametime jitter over the session."), + FRAMETIME_JITTER_STDDEV("frametimejitterstddev", "Standard deviation of frametime jitter in a 5 second period."), + FRAMETIME_STDDEV("frametimestddev", "Standard deviation of frametime in a 5 second period."); + +LLTrace::SampleStatHandle FRAMETIME_JITTER_EVENTS("frametimeevents", "Number of frametime events in the session. Applies when jitter exceeds 10% of the previous frame."); LLTrace::EventStatHandle > AGENT_POSITION_SNAP("agentpositionsnap", "agent position corrections"); @@ -272,8 +281,124 @@ void LLViewerStats::updateFrameStats(const F64Seconds time_diff) // old stats that were never really used F64Seconds jit = (F64Seconds)std::fabs((mLastTimeDiff - time_diff)); sample(LLStatViewer::FRAMETIME_JITTER, jit); - } + mTotalFrametimeJitter += jit; + sample(LLStatViewer::FRAMETIME_JITTER_CUMULATIVE, mTotalFrametimeJitter); + + static LLCachedControl frameTimeEventThreshold(gSavedSettings, "StatsFrametimeEventThreshold", 0.1f); + + if (time_diff - mLastTimeDiff > mLastTimeDiff * frameTimeEventThreshold()) + { + sample(LLStatViewer::FRAMETIME_JITTER_EVENTS, mFrameJitterEvents++); + } + + mFrameTimes.push_back(time_diff); + mFrameTimesJitter.push_back(jit); + + mLastFrameTimeSample += time_diff; + + static LLCachedControl frameTimeSampleSeconds(gSavedSettings, "StatsFrametimeSampleSeconds", 5); + + if (mLastFrameTimeSample >= frameTimeSampleSeconds()) + { + // @TODO: This needs to be de-duped and moved into specific functions. + // If we have more than 5 seconds of frame time samples, calculate the stddev, 99th percentile, and 95th percentile. + std::sort(mFrameTimes.begin(), mFrameTimes.end()); + std::sort(mFrameTimesJitter.begin(), mFrameTimesJitter.end()); + F64Seconds ninety_ninth_percentile; + F64Seconds ninety_fifth_percentile; + + // Calculate standard deviation of mFrameTimes + F64Seconds frame_time_stddev(0); + if (mFrameTimes.size() > 1) + { + F64Seconds mean(0); + for (const auto& v : mFrameTimes) + { + mean += v; + } + mean /= (F64)mFrameTimes.size(); + + F64Seconds variance(0); + for (const auto& v : mFrameTimes) + { + F64Seconds diff = v - mean; + F64 diff_squared; + diff.value(diff_squared); + diff_squared = std::pow(diff_squared, 2); + variance += F64Seconds(diff_squared); + } + variance /= (F64)(mFrameTimes.size() - 1); // Use sample variance (n-1) + F64 val; + variance.value(val); + frame_time_stddev = F64Seconds(std::sqrt(val)); + } + sample(LLStatViewer::FRAMETIME_STDDEV, frame_time_stddev); + + if (mFrameTimes.size() > 0) + { + size_t n = mFrameTimes.size(); + size_t ninety_ninth_index = (size_t)(n * 0.99); + size_t ninety_fifth_index = (size_t)(n * 0.95); + if (ninety_ninth_index < n) + { + ninety_ninth_percentile = mFrameTimes[ninety_ninth_index]; + } + if (ninety_fifth_index < n) + { + ninety_fifth_percentile = mFrameTimes[ninety_fifth_index]; + } + } + + sample(LLStatViewer::FRAMETIME_99TH, ninety_ninth_percentile); + sample(LLStatViewer::FRAMETIME_95TH, ninety_fifth_percentile); + if (mFrameTimesJitter.size() > 1) + { + F64Seconds mean(0); + for (const auto& v : mFrameTimesJitter) + { + mean += v; + } + mean /= (F64)mFrameTimesJitter.size(); + + F64Seconds variance(0); + for (const auto& v : mFrameTimesJitter) + { + F64Seconds diff = v - mean; + F64 diff_squared; + diff.value(diff_squared); + diff_squared = std::pow(diff_squared, 2); + variance += F64Seconds(diff_squared); + } + variance /= (F64)(mFrameTimesJitter.size() - 1); // Use sample variance (n-1) + F64 val; + variance.value(val); + frame_time_stddev = F64Seconds(std::sqrt(val)); + } + sample(LLStatViewer::FRAMETIME_JITTER_STDDEV, frame_time_stddev); + + if (mFrameTimesJitter.size() > 0) + { + size_t n = mFrameTimesJitter.size(); + size_t ninety_ninth_index = (size_t)(n * 0.99); + size_t ninety_fifth_index = (size_t)(n * 0.95); + if (ninety_ninth_index < n) + { + ninety_ninth_percentile = mFrameTimesJitter[ninety_ninth_index]; + } + if (ninety_fifth_index < n) + { + ninety_fifth_percentile = mFrameTimesJitter[ninety_fifth_index]; + } + } + sample(LLStatViewer::FRAMETIME_JITTER_99TH, ninety_ninth_percentile); + sample(LLStatViewer::FRAMETIME_JITTER_95TH, ninety_fifth_percentile); + + mFrameTimes.clear(); + mFrameTimesJitter.clear(); + mLastFrameTimeSample = F64Seconds(0); + } + } mLastTimeDiff = time_diff; } -- cgit v1.3 From e2227b9a1aceabe87cf90e134789cf31798021bf Mon Sep 17 00:00:00 2001 From: "Jonathan \"Geenz\" Goodman" Date: Fri, 27 Jun 2025 15:55:22 -0400 Subject: Make sure to reset the metrics after the first calculation. --- indra/newview/llviewerstats.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'indra/newview/llviewerstats.cpp') diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index e5a347ecdd..822e3ad61a 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -348,10 +348,12 @@ void LLViewerStats::updateFrameStats(const F64Seconds time_diff) ninety_fifth_percentile = mFrameTimes[ninety_fifth_index]; } } - sample(LLStatViewer::FRAMETIME_99TH, ninety_ninth_percentile); sample(LLStatViewer::FRAMETIME_95TH, ninety_fifth_percentile); + ninety_ninth_percentile = F64Seconds(0); + ninety_fifth_percentile = F64Seconds(0); + frame_time_stddev = F64Seconds(0); if (mFrameTimesJitter.size() > 1) { F64Seconds mean(0); -- cgit v1.3 From 6ce487f1a43c0e75feedecb65a4d13a8ead76ba6 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Geenz\" Goodman" Date: Fri, 27 Jun 2025 17:14:13 -0400 Subject: Add helper functions. --- indra/newview/llviewerstats.cpp | 122 +++++++++++++--------------------------- 1 file changed, 39 insertions(+), 83 deletions(-) (limited to 'indra/newview/llviewerstats.cpp') diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 822e3ad61a..2f2aab5b76 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -273,6 +273,38 @@ void LLViewerStats::resetStats() getRecording().reset(); } +// Helper for calculating Nth percentile with linear interpolation +template +T calcPercentile(const std::vector& sorted, double percent) +{ + if (sorted.empty()) + return T(0); + double idx = percent * (sorted.size() - 1); + size_t idx_below = static_cast(std::floor(idx)); + size_t idx_above = static_cast(std::ceil(idx)); + if (idx_below == idx_above) + return sorted[idx_below]; + double weight_above = idx - idx_below; + return sorted[idx_below] * (1.0 - weight_above) + sorted[idx_above] * weight_above; +} + +template +T calcStddev(const std::vector& values) +{ + if (values.size() < 2) + return T(0); + double sum = 0, sq_sum = 0; + for (const auto& v : values) + { + double d = v.value(); + sum += d; + sq_sum += d * d; + } + double mean = sum / values.size(); + double variance = (sq_sum / values.size()) - (mean * mean); + return T(std::sqrt(variance)); +} + void LLViewerStats::updateFrameStats(const F64Seconds time_diff) { if (gFrameCount && mLastTimeDiff > (F64Seconds)0.0) @@ -300,99 +332,23 @@ void LLViewerStats::updateFrameStats(const F64Seconds time_diff) if (mLastFrameTimeSample >= frameTimeSampleSeconds()) { - // @TODO: This needs to be de-duped and moved into specific functions. - // If we have more than 5 seconds of frame time samples, calculate the stddev, 99th percentile, and 95th percentile. std::sort(mFrameTimes.begin(), mFrameTimes.end()); std::sort(mFrameTimesJitter.begin(), mFrameTimesJitter.end()); - F64Seconds ninety_ninth_percentile; - F64Seconds ninety_fifth_percentile; - // Calculate standard deviation of mFrameTimes - F64Seconds frame_time_stddev(0); - if (mFrameTimes.size() > 1) - { - F64Seconds mean(0); - for (const auto& v : mFrameTimes) - { - mean += v; - } - mean /= (F64)mFrameTimes.size(); - - F64Seconds variance(0); - for (const auto& v : mFrameTimes) - { - F64Seconds diff = v - mean; - F64 diff_squared; - diff.value(diff_squared); - diff_squared = std::pow(diff_squared, 2); - variance += F64Seconds(diff_squared); - } - variance /= (F64)(mFrameTimes.size() - 1); // Use sample variance (n-1) - F64 val; - variance.value(val); - frame_time_stddev = F64Seconds(std::sqrt(val)); - } + // Use new helpers for calculations + F64Seconds frame_time_stddev = calcStddev(mFrameTimes); sample(LLStatViewer::FRAMETIME_STDDEV, frame_time_stddev); - if (mFrameTimes.size() > 0) - { - size_t n = mFrameTimes.size(); - size_t ninety_ninth_index = (size_t)(n * 0.99); - size_t ninety_fifth_index = (size_t)(n * 0.95); - if (ninety_ninth_index < n) - { - ninety_ninth_percentile = mFrameTimes[ninety_ninth_index]; - } - if (ninety_fifth_index < n) - { - ninety_fifth_percentile = mFrameTimes[ninety_fifth_index]; - } - } + F64Seconds ninety_ninth_percentile = calcPercentile(mFrameTimes, 0.99); + F64Seconds ninety_fifth_percentile = calcPercentile(mFrameTimes, 0.95); sample(LLStatViewer::FRAMETIME_99TH, ninety_ninth_percentile); sample(LLStatViewer::FRAMETIME_95TH, ninety_fifth_percentile); - ninety_ninth_percentile = F64Seconds(0); - ninety_fifth_percentile = F64Seconds(0); - frame_time_stddev = F64Seconds(0); - if (mFrameTimesJitter.size() > 1) - { - F64Seconds mean(0); - for (const auto& v : mFrameTimesJitter) - { - mean += v; - } - mean /= (F64)mFrameTimesJitter.size(); - - F64Seconds variance(0); - for (const auto& v : mFrameTimesJitter) - { - F64Seconds diff = v - mean; - F64 diff_squared; - diff.value(diff_squared); - diff_squared = std::pow(diff_squared, 2); - variance += F64Seconds(diff_squared); - } - variance /= (F64)(mFrameTimesJitter.size() - 1); // Use sample variance (n-1) - F64 val; - variance.value(val); - frame_time_stddev = F64Seconds(std::sqrt(val)); - } + frame_time_stddev = calcStddev(mFrameTimesJitter); sample(LLStatViewer::FRAMETIME_JITTER_STDDEV, frame_time_stddev); - if (mFrameTimesJitter.size() > 0) - { - size_t n = mFrameTimesJitter.size(); - size_t ninety_ninth_index = (size_t)(n * 0.99); - size_t ninety_fifth_index = (size_t)(n * 0.95); - if (ninety_ninth_index < n) - { - ninety_ninth_percentile = mFrameTimesJitter[ninety_ninth_index]; - } - if (ninety_fifth_index < n) - { - ninety_fifth_percentile = mFrameTimesJitter[ninety_fifth_index]; - } - } + ninety_ninth_percentile = calcPercentile(mFrameTimesJitter, 0.99); + ninety_fifth_percentile = calcPercentile(mFrameTimesJitter, 0.95); sample(LLStatViewer::FRAMETIME_JITTER_99TH, ninety_ninth_percentile); sample(LLStatViewer::FRAMETIME_JITTER_95TH, ninety_fifth_percentile); -- cgit v1.3 From 3f54312a073ece95542c5ddb5a73f68515738448 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Geenz\" Goodman" Date: Thu, 17 Jul 2025 15:03:43 -0400 Subject: Add support for frametime events per minute. --- indra/newview/llviewerstats.cpp | 21 +++++- indra/newview/llviewerstats.h | 4 ++ .../newview/skins/default/xui/en/floater_stats.xml | 77 +++++++++++++--------- 3 files changed, 69 insertions(+), 33 deletions(-) (limited to 'indra/newview/llviewerstats.cpp') diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 2f2aab5b76..a4f308bbf9 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -229,7 +229,11 @@ LLTrace::SampleStatHandle FRAMETIME_JITTER("frametimejitter", FRAMETIME_JITTER_STDDEV("frametimejitterstddev", "Standard deviation of frametime jitter in a 5 second period."), FRAMETIME_STDDEV("frametimestddev", "Standard deviation of frametime in a 5 second period."); -LLTrace::SampleStatHandle FRAMETIME_JITTER_EVENTS("frametimeevents", "Number of frametime events in the session. Applies when jitter exceeds 10% of the previous frame."); +LLTrace::SampleStatHandle FRAMETIME_JITTER_EVENTS("frametimeevents", "Number of frametime events in the session. Applies when jitter exceeds 10% of the previous frame."), + FRAMETIME_JITTER_EVENTS_PER_MINUTE("frametimeeventspm", "Average number of frametime events per minute."), + 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::EventStatHandle > AGENT_POSITION_SNAP("agentpositionsnap", "agent position corrections"); @@ -309,24 +313,28 @@ void LLViewerStats::updateFrameStats(const F64Seconds time_diff) { if (gFrameCount && mLastTimeDiff > (F64Seconds)0.0) { + mTotalTime += time_diff; sample(LLStatViewer::FRAMETIME, time_diff); // old stats that were never really used F64Seconds jit = (F64Seconds)std::fabs((mLastTimeDiff - time_diff)); sample(LLStatViewer::FRAMETIME_JITTER, jit); mTotalFrametimeJitter += jit; sample(LLStatViewer::FRAMETIME_JITTER_CUMULATIVE, mTotalFrametimeJitter); + sample(LLStatViewer::NOTRMALIZED_FRAMETIME_JITTER_SESSION, mTotalFrametimeJitter / mTotalTime); static LLCachedControl frameTimeEventThreshold(gSavedSettings, "StatsFrametimeEventThreshold", 0.1f); if (time_diff - mLastTimeDiff > mLastTimeDiff * frameTimeEventThreshold()) { sample(LLStatViewer::FRAMETIME_JITTER_EVENTS, mFrameJitterEvents++); + mFrameJitterEventsLastMinute++; } mFrameTimes.push_back(time_diff); mFrameTimesJitter.push_back(jit); mLastFrameTimeSample += time_diff; + mTimeSinceLastEventSample += time_diff; static LLCachedControl frameTimeSampleSeconds(gSavedSettings, "StatsFrametimeSampleSeconds", 5); @@ -356,6 +364,17 @@ void LLViewerStats::updateFrameStats(const F64Seconds time_diff) mFrameTimesJitter.clear(); mLastFrameTimeSample = F64Seconds(0); } + + if (mTimeSinceLastEventSample >= 60) + { + mEventMinutes++; + // Calculate average events per minute + U64 frame_time_events_per_minute = (U64)mFrameJitterEvents / mEventMinutes; + sample(LLStatViewer::FRAMETIME_JITTER_EVENTS_PER_MINUTE, frame_time_events_per_minute); + sample(LLStatViewer::FRAMETIME_JITTER_EVENTS_LAST_MINUTE, mFrameJitterEventsLastMinute); + mFrameJitterEventsLastMinute = 0; + mTimeSinceLastEventSample = F64Seconds(0); + } } mLastTimeDiff = time_diff; } diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h index 1d84ab9fbc..4ec7c6dfac 100644 --- a/indra/newview/llviewerstats.h +++ b/indra/newview/llviewerstats.h @@ -278,8 +278,12 @@ private: F64Seconds mTotalFrametimeJitter; U32 mFrameJitterEvents; + U32 mFrameJitterEventsLastMinute; + U32 mEventMinutes; + F64Seconds mTotalTime; F64Seconds mLastFrameTimeSample; // used for frame time stats + F64Seconds mTimeSinceLastEventSample; std::vector mFrameTimes; // used for frame time stats std::vector mFrameTimesJitter; // used for frame time jitter stats }; diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml index ce5ab54d26..f2309eb817 100644 --- a/indra/newview/skins/default/xui/en/floater_stats.xml +++ b/indra/newview/skins/default/xui/en/floater_stats.xml @@ -54,38 +54,19 @@ label="jitter" decimal_digits="1" stat="frametimejitter"/> - - - - - - - - + + + + + + + + + + + + Date: Wed, 13 Aug 2025 13:48:55 -0400 Subject: Add support for Normalized Frametime Variation (NVFT) (#4395) * Add support for Normalized Frametime Variation (NVFT) * Add normalized period jitter --- indra/newview/llviewerstats.cpp | 30 ++++++++++++++++++++++ indra/newview/llviewerstats.h | 9 +++++++ .../newview/skins/default/xui/en/floater_stats.xml | 8 ++++++ 3 files changed, 47 insertions(+) (limited to 'indra/newview/llviewerstats.cpp') 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 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::SampleStatHandle NORMALIZED_FRAMTIME_JITTER_PERIOD("normalizedframetimejitterperiod", "Normalized frametime jitter over the last 5 seconds."); LLTrace::EventStatHandle > 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 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 mFrameTimes; // used for frame time stats std::vector 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"/> + +