summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorRichard Linden <none@none>2013-04-10 21:51:56 -0700
committerRichard Linden <none@none>2013-04-10 21:51:56 -0700
commit07ca6fce7c9cffe1b8f215f25bb826fedf57a5b7 (patch)
treecf59632a10c72da7a377b461a414c90069f0f746 /indra
parent164273afbb8131c5961266b7cb2c1e1d7973ea0b (diff)
SH-3931 WIP Interesting: Add graphs to visualize scene load metrics
removed PeriodicRecording::getTotalRecording as it was showing up at the top on the profiler renamed getPrevRecordingPeriod, etc. to getPrevRecording
Diffstat (limited to 'indra')
-rw-r--r--indra/llcommon/llfasttimer.cpp13
-rw-r--r--indra/llcommon/lltracerecording.cpp55
-rw-r--r--indra/llcommon/lltracerecording.h21
-rw-r--r--indra/llui/llstatbar.cpp37
-rw-r--r--indra/llui/llstatgraph.cpp4
-rw-r--r--indra/newview/llagentcamera.cpp2
-rw-r--r--indra/newview/llfasttimerview.cpp16
-rw-r--r--indra/newview/llfloaterabout.cpp2
-rw-r--r--indra/newview/llhudnametag.cpp2
-rw-r--r--indra/newview/llviewerstats.cpp7
-rw-r--r--indra/newview/llviewertexturelist.cpp4
-rw-r--r--indra/newview/pipeline.cpp2
12 files changed, 65 insertions, 100 deletions
diff --git a/indra/llcommon/llfasttimer.cpp b/indra/llcommon/llfasttimer.cpp
index fbffe133f1..a7adcc6729 100644
--- a/indra/llcommon/llfasttimer.cpp
+++ b/indra/llcommon/llfasttimer.cpp
@@ -176,11 +176,14 @@ TimeBlockTreeNode& TimeBlock::getTreeNode() const
TimeBlockTreeNode* nodep = LLTrace::get_thread_recorder()->getTimeBlockTreeNode(getIndex());
llassert(nodep);
return *nodep;
- }
+}
+
+static LLFastTimer::DeclareTimer FTM_PROCESS_TIMES("Process FastTimer Times");
//static
void TimeBlock::processTimes()
{
+ LLFastTimer _(FTM_PROCESS_TIMES);
get_clock_count(); // good place to calculate clock frequency
U64 cur_time = getCPUClockCount64();
@@ -329,12 +332,12 @@ void TimeBlock::logStats()
{
TimeBlock& timer = *it;
LLTrace::PeriodicRecording& frame_recording = LLTrace::get_frame_recording();
- sd[timer.getName()]["Time"] = (LLSD::Real) (frame_recording.getLastRecordingPeriod().getSum(timer).value());
- sd[timer.getName()]["Calls"] = (LLSD::Integer) (frame_recording.getLastRecordingPeriod().getSum(timer.callCount()));
+ sd[timer.getName()]["Time"] = (LLSD::Real) (frame_recording.getLastRecording().getSum(timer).value());
+ sd[timer.getName()]["Calls"] = (LLSD::Integer) (frame_recording.getLastRecording().getSum(timer.callCount()));
// computing total time here because getting the root timer's getCountHistory
// doesn't work correctly on the first frame
- total_time += frame_recording.getLastRecordingPeriod().getSum(timer);
+ total_time += frame_recording.getLastRecording().getSum(timer);
}
}
@@ -353,7 +356,7 @@ void TimeBlock::logStats()
void TimeBlock::dumpCurTimes()
{
LLTrace::PeriodicRecording& frame_recording = LLTrace::get_frame_recording();
- LLTrace::Recording& last_frame_recording = frame_recording.getLastRecordingPeriod();
+ LLTrace::Recording& last_frame_recording = frame_recording.getLastRecording();
// walk over timers in depth order and output timings
for(timer_tree_dfs_iterator_t it = begin_timer_tree(TimeBlock::getRootTimeBlock());
diff --git a/indra/llcommon/lltracerecording.cpp b/indra/llcommon/lltracerecording.cpp
index f78b7942a7..21156b4d61 100644
--- a/indra/llcommon/lltracerecording.cpp
+++ b/indra/llcommon/lltracerecording.cpp
@@ -360,8 +360,7 @@ U32 Recording::getSampleCount( const TraceType<MeasurementAccumulator<S64> >& st
PeriodicRecording::PeriodicRecording( U32 num_periods, EPlayState state)
: mAutoResize(num_periods == 0),
- mCurPeriod(0),
- mTotalValid(false)
+ mCurPeriod(0)
{
if (num_periods)
{
@@ -373,7 +372,7 @@ PeriodicRecording::PeriodicRecording( U32 num_periods, EPlayState state)
void PeriodicRecording::nextPeriod()
{
EPlayState play_state = getPlayState();
- Recording& old_recording = getCurRecordingPeriod();
+ Recording& old_recording = getCurRecording();
if (mAutoResize)
{
mRecordingPeriods.push_back(Recording());
@@ -382,87 +381,59 @@ void PeriodicRecording::nextPeriod()
mCurPeriod = (num_periods > 0)
? (mCurPeriod + 1) % num_periods
: mCurPeriod + 1;
- old_recording.splitTo(getCurRecordingPeriod());
+ old_recording.splitTo(getCurRecording());
switch(play_state)
{
case STOPPED:
- getCurRecordingPeriod().stop();
+ getCurRecording().stop();
break;
case PAUSED:
- getCurRecordingPeriod().pause();
+ getCurRecording().pause();
break;
case STARTED:
break;
}
- // new period, need to recalculate total
- mTotalValid = false;
-}
-
-Recording& PeriodicRecording::getTotalRecording()
-{
- if (!mTotalValid)
- {
- mTotalRecording.reset();
- U32 num_periods = mRecordingPeriods.size();
-
- if (num_periods)
- {
- for (S32 i = mCurPeriod + 1; i < mCurPeriod + num_periods; i++)
- {
- mTotalRecording.appendRecording(mRecordingPeriods[i % num_periods]);
- }
- }
- else
- {
- for (S32 i = 0; i < mCurPeriod; i++)
- {
- mTotalRecording.appendRecording(mRecordingPeriods[i]);
- }
- }
- }
- mTotalValid = true;
- return mTotalRecording;
}
void PeriodicRecording::start()
{
- getCurRecordingPeriod().start();
+ getCurRecording().start();
}
void PeriodicRecording::stop()
{
- getCurRecordingPeriod().stop();
+ getCurRecording().stop();
}
void PeriodicRecording::pause()
{
- getCurRecordingPeriod().pause();
+ getCurRecording().pause();
}
void PeriodicRecording::resume()
{
- getCurRecordingPeriod().resume();
+ getCurRecording().resume();
}
void PeriodicRecording::restart()
{
- getCurRecordingPeriod().restart();
+ getCurRecording().restart();
}
void PeriodicRecording::reset()
{
- getCurRecordingPeriod().reset();
+ getCurRecording().reset();
}
void PeriodicRecording::splitTo(PeriodicRecording& other)
{
- getCurRecordingPeriod().splitTo(other.getCurRecordingPeriod());
+ getCurRecording().splitTo(other.getCurRecording());
}
void PeriodicRecording::splitFrom(PeriodicRecording& other)
{
- getCurRecordingPeriod().splitFrom(other.getCurRecordingPeriod());
+ getCurRecording().splitFrom(other.getCurRecording());
}
diff --git a/indra/llcommon/lltracerecording.h b/indra/llcommon/lltracerecording.h
index b96d0666e5..0a3e9e5a0b 100644
--- a/indra/llcommon/lltracerecording.h
+++ b/indra/llcommon/lltracerecording.h
@@ -254,50 +254,48 @@ namespace LLTrace
void nextPeriod();
U32 getNumPeriods() { return mRecordingPeriods.size(); }
- Recording& getLastRecordingPeriod()
+ Recording& getLastRecording()
{
U32 num_periods = mRecordingPeriods.size();
return mRecordingPeriods[(mCurPeriod + num_periods - 1) % num_periods];
}
- const Recording& getLastRecordingPeriod() const
+ const Recording& getLastRecording() const
{
- return getPrevRecordingPeriod(1);
+ return getPrevRecording(1);
}
- Recording& getCurRecordingPeriod()
+ Recording& getCurRecording()
{
return mRecordingPeriods[mCurPeriod];
}
- const Recording& getCurRecordingPeriod() const
+ const Recording& getCurRecording() const
{
return mRecordingPeriods[mCurPeriod];
}
- Recording& getPrevRecordingPeriod(U32 offset)
+ Recording& getPrevRecording(U32 offset)
{
U32 num_periods = mRecordingPeriods.size();
offset = llclamp(offset, 0u, num_periods - 1);
return mRecordingPeriods[(mCurPeriod + num_periods - offset) % num_periods];
}
- const Recording& getPrevRecordingPeriod(U32 offset) const
+ const Recording& getPrevRecording(U32 offset) const
{
U32 num_periods = mRecordingPeriods.size();
offset = llclamp(offset, 0u, num_periods - 1);
return mRecordingPeriods[(mCurPeriod + num_periods - offset) % num_periods];
}
- Recording snapshotCurRecordingPeriod() const
+ Recording snapshotCurRecording() const
{
- Recording recording_copy(getCurRecordingPeriod());
+ Recording recording_copy(getCurRecording());
recording_copy.stop();
return recording_copy;
}
- Recording& getTotalRecording();
-
template <typename T>
typename T::value_t getPeriodMin(const TraceType<T>& stat) const
{
@@ -391,7 +389,6 @@ namespace LLTrace
private:
std::vector<Recording> mRecordingPeriods;
Recording mTotalRecording;
- bool mTotalValid;
const bool mAutoResize;
S32 mCurPeriod;
};
diff --git a/indra/llui/llstatbar.cpp b/indra/llui/llstatbar.cpp
index d9f3d14ef0..46eea368e5 100644
--- a/indra/llui/llstatbar.cpp
+++ b/indra/llui/llstatbar.cpp
@@ -103,12 +103,11 @@ void LLStatBar::draw()
max = 0.f,
mean = 0.f;
- S32 num_samples = 0;
LLTrace::PeriodicRecording& frame_recording = LLTrace::get_frame_recording();
if (mCountFloatp)
{
- LLTrace::Recording& last_frame_recording = frame_recording.getLastRecordingPeriod();
+ LLTrace::Recording& last_frame_recording = frame_recording.getLastRecording();
if (mPerSec)
{
@@ -116,7 +115,6 @@ void LLStatBar::draw()
min = frame_recording.getPeriodMinPerSec(*mCountFloatp);
max = frame_recording.getPeriodMaxPerSec(*mCountFloatp);
mean = frame_recording.getPeriodMeanPerSec(*mCountFloatp);
- num_samples = frame_recording.getTotalRecording().getSampleCount(*mCountFloatp);
}
else
{
@@ -124,12 +122,11 @@ void LLStatBar::draw()
min = frame_recording.getPeriodMin(*mCountFloatp);
max = frame_recording.getPeriodMax(*mCountFloatp);
mean = frame_recording.getPeriodMean(*mCountFloatp);
- num_samples = frame_recording.getTotalRecording().getSampleCount(*mCountFloatp);
}
}
else if (mCountIntp)
{
- LLTrace::Recording& last_frame_recording = frame_recording.getLastRecordingPeriod();
+ LLTrace::Recording& last_frame_recording = frame_recording.getLastRecording();
if (mPerSec)
{
@@ -137,7 +134,6 @@ void LLStatBar::draw()
min = frame_recording.getPeriodMinPerSec(*mCountIntp);
max = frame_recording.getPeriodMaxPerSec(*mCountIntp);
mean = frame_recording.getPeriodMeanPerSec(*mCountIntp);
- num_samples = frame_recording.getTotalRecording().getSampleCount(*mCountIntp);
}
else
{
@@ -145,26 +141,25 @@ void LLStatBar::draw()
min = frame_recording.getPeriodMin(*mCountIntp);
max = frame_recording.getPeriodMax(*mCountIntp);
mean = frame_recording.getPeriodMean(*mCountIntp);
- num_samples = frame_recording.getTotalRecording().getSampleCount(*mCountIntp);
}
}
else if (mMeasurementFloatp)
{
- LLTrace::Recording& recording = frame_recording.getTotalRecording();
- current = recording.getLastValue(*mMeasurementFloatp);
- min = recording.getMin(*mMeasurementFloatp);
- max = recording.getMax(*mMeasurementFloatp);
- mean = recording.getMean(*mMeasurementFloatp);
- num_samples = frame_recording.getTotalRecording().getSampleCount(*mMeasurementFloatp);
+ LLTrace::Recording& last_frame_recording = frame_recording.getLastRecording();
+
+ current = last_frame_recording.getLastValue(*mMeasurementFloatp);
+ min = frame_recording.getPeriodMin(*mMeasurementFloatp);
+ max = frame_recording.getPeriodMax(*mMeasurementFloatp);
+ mean = frame_recording.getPeriodMean(*mMeasurementFloatp);
}
else if (mMeasurementIntp)
{
- LLTrace::Recording& recording = frame_recording.getTotalRecording();
- current = recording.getLastValue(*mMeasurementIntp);
- min = recording.getMin(*mMeasurementIntp);
- max = recording.getMax(*mMeasurementIntp);
- mean = recording.getMean(*mMeasurementIntp);
- num_samples = frame_recording.getTotalRecording().getSampleCount(*mMeasurementIntp);
+ LLTrace::Recording& last_frame_recording = frame_recording.getLastRecording();
+
+ current = last_frame_recording.getLastValue(*mMeasurementIntp);
+ min = frame_recording.getPeriodMin(*mMeasurementIntp);
+ max = frame_recording.getPeriodMax(*mMeasurementIntp);
+ mean = frame_recording.getPeriodMean(*mMeasurementIntp);
}
current *= mUnitScale;
@@ -203,7 +198,7 @@ void LLStatBar::draw()
const S32 tick_length = 4;
const S32 tick_width = 1;
- if (mScaleRange && num_samples)
+ if (mScaleRange && min < max)
{
F32 cur_max = mTickSpacing;
while(max > cur_max && mMaxBar > cur_max)
@@ -352,7 +347,7 @@ void LLStatBar::draw()
for (i = 1; i <= max_frame; i++)
{
F32 offset = ((F32)i / (F32)mNumFrames) * span;
- LLTrace::Recording& recording = frame_recording.getPrevRecordingPeriod(i);
+ LLTrace::Recording& recording = frame_recording.getPrevRecording(i);
if (mPerSec)
{
if (mCountFloatp)
diff --git a/indra/llui/llstatgraph.cpp b/indra/llui/llstatgraph.cpp
index bdb378c9c5..af01e66095 100644
--- a/indra/llui/llstatgraph.cpp
+++ b/indra/llui/llstatgraph.cpp
@@ -66,7 +66,7 @@ void LLStatGraph::draw()
range = mMax - mMin;
if (mNewStatFloatp)
{
- LLTrace::Recording& recording = LLTrace::get_frame_recording().getLastRecordingPeriod();
+ LLTrace::Recording& recording = LLTrace::get_frame_recording().getLastRecording();
if (mPerSec)
{
@@ -79,7 +79,7 @@ void LLStatGraph::draw()
}
else if (mNewStatIntp)
{
- LLTrace::Recording& recording = LLTrace::get_frame_recording().getLastRecordingPeriod();
+ LLTrace::Recording& recording = LLTrace::get_frame_recording().getLastRecording();
if (mPerSec)
{
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index 420220d21a..7c9fbccd7f 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -1082,7 +1082,7 @@ void LLAgentCamera::updateLookAt(const S32 mouse_x, const S32 mouse_y)
LLQuaternion av_inv_rot = ~gAgentAvatarp->mRoot.getWorldRotation();
LLVector3 root_at = LLVector3::x_axis * gAgentAvatarp->mRoot.getWorldRotation();
- if (LLTrace::get_frame_recording().getLastRecordingPeriod().getLastValue(*gViewerWindow->getMouseVelocityStat()) < 0.01f
+ if (LLTrace::get_frame_recording().getLastRecording().getLastValue(*gViewerWindow->getMouseVelocityStat()) < 0.01f
&& (root_at * last_at_axis > 0.95f))
{
LLVector3 vel = gAgentAvatarp->getVelocity();
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index 80d845c70e..45ffe56ac1 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -333,7 +333,7 @@ static std::string get_tooltip(TimeBlock& timer, S32 history_index, PeriodicReco
}
else
{
- tooltip = llformat("%s (%d ms, %d calls)", timer.getName().c_str(), (S32)LLUnit<LLUnits::Milliseconds, F64>(frame_recording.getPrevRecordingPeriod(history_index).getSum(timer)).value(), (S32)frame_recording.getPrevRecordingPeriod(history_index).getSum(timer.callCount()));
+ tooltip = llformat("%s (%d ms, %d calls)", timer.getName().c_str(), (S32)LLUnit<LLUnits::Milliseconds, F64>(frame_recording.getPrevRecording(history_index).getSum(timer)).value(), (S32)frame_recording.getPrevRecording(history_index).getSum(timer.callCount()));
}
return tooltip;
}
@@ -417,7 +417,7 @@ void LLFastTimerView::draw()
printLineStats();
LLView::draw();
- mAllTimeMax = llmax(mAllTimeMax, mRecording->getLastRecordingPeriod().getSum(FTM_FRAME));
+ mAllTimeMax = llmax(mAllTimeMax, mRecording->getLastRecording().getSum(FTM_FRAME));
mHoverID = NULL;
mHoverBarIndex = -1;
}
@@ -984,7 +984,7 @@ void LLFastTimerView::printLineStats()
LLUnit<LLUnits::Seconds, F32> ticks;
if (mPrintStats > 0)
{
- ticks = mRecording->getPrevRecordingPeriod(mPrintStats).getSum(*idp);
+ ticks = mRecording->getPrevRecording(mPrintStats).getSum(*idp);
}
else
{
@@ -1096,8 +1096,8 @@ void LLFastTimerView::drawLineGraph()
j > 0;
j--)
{
- LLUnit<LLUnits::Seconds, F32> time = llmax(mRecording->getPrevRecordingPeriod(j).getSum(*idp), LLUnit<LLUnits::Seconds, F64>(0.000001));
- U32 calls = mRecording->getPrevRecordingPeriod(j).getSum(idp->callCount());
+ LLUnit<LLUnits::Seconds, F32> time = llmax(mRecording->getPrevRecording(j).getSum(*idp), LLUnit<LLUnits::Seconds, F64>(0.000001));
+ U32 calls = mRecording->getPrevRecording(j).getSum(idp->callCount());
if (alpha == 1.f)
{
@@ -1197,8 +1197,8 @@ void LLFastTimerView::drawLegend( S32 y )
if (mHoverBarIndex > 0 && mHoverID)
{
S32 hidx = mScrollIndex + mHoverBarIndex;
- ms = mRecording->getPrevRecordingPeriod(hidx).getSum(*idp);
- calls = mRecording->getPrevRecordingPeriod(hidx).getSum(idp->callCount());
+ ms = mRecording->getPrevRecording(hidx).getSum(*idp);
+ calls = mRecording->getPrevRecording(hidx).getSum(idp->callCount());
}
else
{
@@ -1455,7 +1455,7 @@ S32 LLFastTimerView::updateTimerBarWidths(LLTrace::TimeBlock* time_block, std::v
LLFastTimer _(FTM_UPDATE_TIMER_BAR_WIDTHS);
F32 self_time_frame_fraction = history_index == -1
? (mRecording->getPeriodMean(time_block->selfTime()) / mTotalTimeDisplay)
- : (mRecording->getPrevRecordingPeriod(history_index).getSum(time_block->selfTime()) / mTotalTimeDisplay);
+ : (mRecording->getPrevRecording(history_index).getSum(time_block->selfTime()) / mTotalTimeDisplay);
S32 self_time_width = llround(self_time_frame_fraction * (F32)mBarRect.getWidth());
S32 full_width = self_time_width;
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index 58701ca3c9..93502daac7 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -296,7 +296,7 @@ LLSD LLFloaterAbout::getInfo()
if (gPacketsIn > 0)
{
- LLTrace::Recording cur_frame = LLTrace::get_frame_recording().snapshotCurRecordingPeriod();
+ LLTrace::Recording cur_frame = LLTrace::get_frame_recording().snapshotCurRecording();
info["PACKETS_LOST"] = cur_frame.getSum(LLStatViewer::PACKETS_LOST);
info["PACKETS_IN"] = F32(gPacketsIn);
info["PACKETS_PCT"] = 100.f*info["PACKETS_LOST"].asReal() / info["PACKETS_IN"].asReal();
diff --git a/indra/newview/llhudnametag.cpp b/indra/newview/llhudnametag.cpp
index 3ac11f906b..cdfe776589 100644
--- a/indra/newview/llhudnametag.cpp
+++ b/indra/newview/llhudnametag.cpp
@@ -901,7 +901,7 @@ void LLHUDNameTag::updateAll()
}
LLTrace::CountStatHandle<>* camera_vel_stat = LLViewerCamera::getVelocityStat();
- F32 camera_vel = LLTrace::get_frame_recording().getLastRecordingPeriod().getPerSec(*camera_vel_stat);
+ F32 camera_vel = LLTrace::get_frame_recording().getLastRecording().getPerSec(*camera_vel_stat);
if (camera_vel > MAX_STABLE_CAMERA_VELOCITY)
{
return;
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index fa4eb73180..13a005dcbf 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -348,11 +348,12 @@ void update_statistics()
sample(LLStatViewer::SIM_PING, LLTrace::Seconds(10));
}
- add(LLStatViewer::FPS, 1);
- if (LLTrace::get_frame_recording().getTotalRecording().getSampleCount(LLStatViewer::FPS))
+ if (LLViewerStats::instance().getRecording().getSum(LLStatViewer::FPS))
{
- sample(LLStatViewer::FPS_SAMPLE, LLTrace::get_frame_recording().getTotalRecording().getPerSec(LLStatViewer::FPS));
+ sample(LLStatViewer::FPS_SAMPLE, LLTrace::get_frame_recording().getPeriodMeanPerSec(LLStatViewer::FPS));
}
+ add(LLStatViewer::FPS, 1);
+
F32 layer_bits = (F32)(gVLManager.getLandBits() + gVLManager.getWindBits() + gVLManager.getCloudBits());
add(LLStatViewer::LAYERS_KBIT, LLTrace::Bits(layer_bits));
add(LLStatViewer::OBJECT_KBIT, gObjectData);
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 0066c09720..1bb4041bbd 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -617,9 +617,7 @@ void LLViewerTextureList::updateImages(F32 max_time)
}
cleared = FALSE;
- LLTrace::Recording& recording = LLTrace::get_frame_recording().getTotalRecording();
-
- LLAppViewer::getTextureFetch()->setTextureBandwidth(recording.getPerSec(LLStatViewer::TEXTURE_KBIT).value());
+ LLAppViewer::getTextureFetch()->setTextureBandwidth(LLTrace::get_frame_recording().getPeriodMeanPerSec(LLStatViewer::TEXTURE_KBIT).value());
{
using namespace LLStatViewer;
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 26ceaf512a..1b5148e560 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -9816,7 +9816,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera)
{
LLTrace::CountStatHandle<>* velocity_stat = LLViewerCamera::getVelocityStat();
F32 fade_amt = gFrameIntervalSeconds.value()
- * llmax(LLTrace::get_frame_recording().getLastRecordingPeriod().getSum(*velocity_stat) / LLTrace::get_frame_recording().getLastRecordingPeriod().getDuration().value(), 1.0);
+ * llmax(LLTrace::get_frame_recording().getLastRecording().getSum(*velocity_stat) / LLTrace::get_frame_recording().getLastRecording().getDuration().value(), 1.0);
//update shadow targets
for (U32 i = 0; i < 2; i++)