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
master
Richard Linden 2013-04-10 21:51:56 -07:00
parent 164273afbb
commit 07ca6fce7c
12 changed files with 65 additions and 100 deletions

View File

@ -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());

View File

@ -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());
}

View File

@ -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;
};

View File

@ -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)

View File

@ -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)
{

View File

@ -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();

View File

@ -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;

View File

@ -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();

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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++)