SH-4299 WIP: Interesting: High fps shown temporarily off scale in statistics console

improved calculation of display range for stat bars
meow-7.2.2
Richard Linden 2013-07-12 00:52:31 -07:00
parent d122318bef
commit c95042db3e
3 changed files with 188 additions and 201 deletions

View File

@ -38,9 +38,10 @@
#include "lltracerecording.h"
#include "llcriticaldamp.h"
#include "lltooltip.h"
#include "lllocalcliprect.h"
#include <iostream>
F32 calc_reasonable_tick_value(F32 min, F32 max)
F32 calc_tick_value(F32 min, F32 max)
{
F32 range = max - min;
const S32 DIVISORS[] = {6, 8, 10, 4, 5};
@ -56,7 +57,7 @@ F32 calc_reasonable_tick_value(F32 min, F32 max)
{
F32 test_tick_value = min + (possible_tick_value * pow(10.0, digit_count));
if (is_approx_equal((F32)(S32)test_tick_value, (F32)test_tick_value))
if (is_approx_equal((F32)(S32)test_tick_value, test_tick_value))
{
if (digit_count < best_decimal_digit_count)
{
@ -68,12 +69,16 @@ F32 calc_reasonable_tick_value(F32 min, F32 max)
}
}
return is_approx_equal(range, 0.f) ? 1.f : range / best_divisor;
return is_approx_equal(range, 0.f) ? 0.f : range / best_divisor;
}
void calc_display_range(F32& min, F32& max)
void calc_auto_scale_range(F32& min, F32& max, F32& tick)
{
const F32 RANGES[] = {1.f, 1.5f, 2.f, 3.f, 5.f, 10.f};
min = llmin(0.f, min, max);
max = llmax(0.f, min, max);
const F32 RANGES[] = {0.f, 1.f, 1.5f, 2.f, 3.f, 5.f, 10.f};
const F32 TICKS[] = {0.f, 0.25f, 0.5f, 1.f, 1.f, 1.f, 2.f };
const S32 num_digits_max = is_approx_equal(fabs(max), 0.f)
? S32_MIN + 1
@ -83,46 +88,55 @@ void calc_display_range(F32& min, F32& max)
: llceil(logf(fabs(min)) * OO_LN10);
const S32 num_digits = llmax(num_digits_max, num_digits_min);
const F32 starting_max = pow(10.0, num_digits - 1) * ((max < 0.f) ? -1 : 1);
const F32 starting_min = pow(10.0, num_digits - 1) * ((min < 0.f) ? -1 : 1);
const F32 power_of_10 = pow(10.0, num_digits - 1);
const F32 starting_max = power_of_10 * ((max < 0.f) ? -1 : 1);
const F32 starting_min = power_of_10 * ((min < 0.f) ? -1 : 1);
F32 new_max = starting_max;
F32 new_min = starting_min;
F32 cur_max = starting_max;
F32 cur_min = starting_min;
F32 out_max = max;
F32 out_min = min;
F32 cur_tick_min = 0.f;
F32 cur_tick_max = 0.f;
for (S32 range_idx = 0; range_idx < LL_ARRAY_SIZE(RANGES); range_idx++)
{
new_max = starting_max * RANGES[range_idx];
new_min = starting_min * RANGES[range_idx];
cur_max = starting_max * RANGES[range_idx];
cur_min = starting_min * RANGES[range_idx];
if (min > 0.f && new_min < min)
if (min > 0.f && cur_min <= min)
{
out_min = new_min;
out_min = cur_min;
cur_tick_min = TICKS[range_idx];
}
if (max < 0.f && new_max > max)
if (max < 0.f && cur_max >= max)
{
out_max = new_max;
out_max = cur_max;
cur_tick_max = TICKS[range_idx];
}
}
new_max = starting_max;
new_min = starting_min;
cur_max = starting_max;
cur_min = starting_min;
for (S32 range_idx = LL_ARRAY_SIZE(RANGES) - 1; range_idx >= 0; range_idx--)
{
new_max = starting_max * RANGES[range_idx];
new_min = starting_min * RANGES[range_idx];
cur_max = starting_max * RANGES[range_idx];
cur_min = starting_min * RANGES[range_idx];
if (min < 0.f && new_min < min)
if (min < 0.f && cur_min <= min)
{
out_min = new_min;
out_min = cur_min;
cur_tick_min = TICKS[range_idx];
}
if (max > 0.f && new_max > max)
if (max > 0.f && cur_max >= max)
{
out_max = new_max;
out_max = cur_max;
cur_tick_max = TICKS[range_idx];
}
}
tick = power_of_10 * llmax(cur_tick_min, cur_tick_max);
min = out_min;
max = out_max;
}
@ -133,21 +147,26 @@ LLStatBar::LLStatBar(const Params& p)
: LLView(p),
mLabel(p.label),
mUnitLabel(p.unit_label),
mMinBar(p.bar_min),
mMaxBar(p.bar_max),
mMinBar(llmin(p.bar_min, p.bar_max)),
mMaxBar(llmax(p.bar_max, p.bar_min)),
mCurMaxBar(p.bar_max),
mTickValue(p.tick_spacing.isProvided() ? p.tick_spacing : calc_reasonable_tick_value(p.bar_min, p.bar_max)),
mDecimalDigits(p.decimal_digits),
mNumFrames(p.num_frames),
mMaxHeight(p.max_height),
mPerSec(p.show_per_sec),
mDisplayBar(p.show_bar),
mDisplayHistory(p.show_history),
mDisplayMean(p.show_mean),
mOrientation(p.orientation),
mScaleMax(!p.bar_max.isProvided()),
mScaleMin(!p.bar_min.isProvided())
mAutoScaleMax(!p.bar_max.isProvided()),
mAutoScaleMin(!p.bar_min.isProvided()),
mTickValue(p.tick_spacing)
{
// tick value will be automatically calculated later
if (!p.tick_spacing.isProvided() && p.bar_min.isProvided() && p.bar_max.isProvided())
{
mTickValue = calc_tick_value(mMinBar, mMaxBar);
}
setStat(p.stat);
}
@ -204,9 +223,9 @@ void LLStatBar::draw()
F32 current = 0,
min = 0,
max = 0,
mean = 0,
value = 0;
mean = 0;
LLLocalClipRect _(getLocalRect());
LLTrace::PeriodicRecording& frame_recording = LLTrace::get_frame_recording();
std::string unit_label;
@ -221,7 +240,6 @@ void LLStatBar::draw()
min = frame_recording.getPeriodMinPerSec(*mCountFloatp, mNumFrames);
max = frame_recording.getPeriodMaxPerSec(*mCountFloatp, mNumFrames);
mean = frame_recording.getPeriodMeanPerSec(*mCountFloatp, mNumFrames);
value = mDisplayMean ? mean : current;
}
else
{
@ -229,7 +247,6 @@ void LLStatBar::draw()
min = frame_recording.getPeriodMin(*mCountFloatp, mNumFrames);
max = frame_recording.getPeriodMax(*mCountFloatp, mNumFrames);
mean = frame_recording.getPeriodMean(*mCountFloatp, mNumFrames);
value = mDisplayMean ? mean : current;
}
}
else if (mEventFloatp)
@ -241,18 +258,16 @@ void LLStatBar::draw()
min = frame_recording.getPeriodMin(*mEventFloatp, mNumFrames);
max = frame_recording.getPeriodMax(*mEventFloatp, mNumFrames);
mean = frame_recording.getPeriodMean(*mEventFloatp, mNumFrames);
value = mDisplayMean ? mean : current;
}
else if (mSampleFloatp)
{
LLTrace::Recording& last_frame_recording = frame_recording.getLastRecording();
unit_label = mUnitLabel.empty() ? mSampleFloatp->getUnitLabel() : mUnitLabel;
current = last_frame_recording.getLastValue(*mSampleFloatp);
current = last_frame_recording.getMean(*mSampleFloatp);
min = frame_recording.getPeriodMin(*mSampleFloatp, mNumFrames);
max = frame_recording.getPeriodMax(*mSampleFloatp, mNumFrames);
mean = frame_recording.getPeriodMean(*mSampleFloatp, mNumFrames);
value = mDisplayMean ? mean : current;
}
S32 bar_top, bar_left, bar_right, bar_bottom;
@ -273,16 +288,24 @@ void LLStatBar::draw()
const S32 tick_length = 4;
const S32 tick_width = 1;
if ((mScaleMax && max >= mCurMaxBar)|| (mScaleMin && min <= mCurMinBar))
if ((mAutoScaleMax && max >= mCurMaxBar)|| (mAutoScaleMin && min <= mCurMinBar))
{
F32 range_min = min;
F32 range_max = max;
calc_display_range(range_min, range_max);
if (mScaleMax) { mMaxBar = llmax(mMaxBar, range_max); }
if (mScaleMin) { mMinBar = llmin(mMinBar, range_min); }
mTickValue = calc_reasonable_tick_value(mMinBar, mMaxBar);
F32 range_min = mAutoScaleMin ? llmin(mMinBar, min) : mMinBar;
F32 range_max = mAutoScaleMax ? llmax(mMaxBar, max) : mMaxBar;
F32 tick_value = 0.f;
calc_auto_scale_range(range_min, range_max, tick_value);
if (mAutoScaleMin) { mMinBar = range_min; }
if (mAutoScaleMax) { mMaxBar = range_max; }
if (mAutoScaleMin && mAutoScaleMax)
{
mTickValue = tick_value;
}
else
{
mTickValue = calc_tick_value(mMinBar, mMaxBar);
}
}
mCurMaxBar = LLSmoothInterpolation::lerp(mCurMaxBar, mMaxBar, 0.05f);
mCurMinBar = LLSmoothInterpolation::lerp(mCurMinBar, mMinBar, 0.05f);
@ -302,13 +325,13 @@ void LLStatBar::draw()
LLFontGL::LEFT, LLFontGL::TOP);
S32 decimal_digits = mDecimalDigits;
if (is_approx_equal((F32)(S32)value, value))
if (is_approx_equal((F32)(S32)mean, mean))
{
decimal_digits = 0;
}
std::string value_str = llformat("%10.*f %s", decimal_digits, value, unit_label.c_str());
std::string value_str = llformat("%10.*f %s", decimal_digits, mean, unit_label.c_str());
// Draw the value.
// Draw the current value.
if (mOrientation == HORIZONTAL)
{
LLFontGL::getFontMonospace()->renderUTF8(value_str, 0, bar_right, getRect().getHeight(),
@ -330,53 +353,65 @@ void LLStatBar::draw()
S32 last_tick = 0;
S32 last_label = 0;
const S32 MIN_TICK_SPACING = mOrientation == HORIZONTAL ? 20 : 30;
const S32 MIN_LABEL_SPACING = mOrientation == HORIZONTAL ? 40 : 60;
const S32 MIN_LABEL_SPACING = mOrientation == HORIZONTAL ? 30 : 60;
// start counting from actual min, not current, animating min, so that ticks don't float between numbers
for (F32 tick_value = mMinBar; tick_value <= mCurMaxBar; tick_value += mTickValue)
// ensure ticks always hit 0
if (mTickValue > 0.f)
{
const S32 begin = llfloor((tick_value - mCurMinBar)*value_scale);
const S32 end = begin + tick_width;
if (begin - last_tick < MIN_TICK_SPACING)
F32 start = mCurMinBar < 0.f
? llceil(-mCurMinBar / mTickValue) * -mTickValue
: 0.f;
for (F32 tick_value = start; ;tick_value += mTickValue)
{
continue;
}
last_tick = begin;
S32 decimal_digits = mDecimalDigits;
if (is_approx_equal((F32)(S32)tick_value, tick_value))
{
decimal_digits = 0;
}
std::string tick_string = llformat("%10.*f", decimal_digits, tick_value);
if (mOrientation == HORIZONTAL)
{
if (begin - last_label > MIN_LABEL_SPACING)
const S32 begin = llfloor((tick_value - mCurMinBar)*value_scale);
const S32 end = begin + tick_width;
if (begin - last_tick < MIN_TICK_SPACING)
{
gl_rect_2d(bar_left, end, bar_right - tick_length, begin, LLColor4(1.f, 1.f, 1.f, 0.25f));
LLFontGL::getFontMonospace()->renderUTF8(tick_string, 0, bar_right, begin,
LLColor4(1.f, 1.f, 1.f, 0.5f),
LLFontGL::LEFT, LLFontGL::VCENTER);
last_label = begin;
continue;
}
last_tick = begin;
S32 decimal_digits = mDecimalDigits;
if (is_approx_equal((F32)(S32)tick_value, tick_value))
{
decimal_digits = 0;
}
std::string tick_string = llformat("%10.*f", decimal_digits, tick_value);
if (mOrientation == HORIZONTAL)
{
if (begin - last_label > MIN_LABEL_SPACING)
{
gl_rect_2d(bar_left, end, bar_right - tick_length, begin, LLColor4(1.f, 1.f, 1.f, 0.25f));
LLFontGL::getFontMonospace()->renderUTF8(tick_string, 0, bar_right, begin,
LLColor4(1.f, 1.f, 1.f, 0.5f),
LLFontGL::LEFT, LLFontGL::VCENTER);
last_label = begin;
}
else
{
gl_rect_2d(bar_left, end, bar_right - tick_length/2, begin, LLColor4(1.f, 1.f, 1.f, 0.1f));
}
}
else
{
gl_rect_2d(bar_left, end, bar_right - tick_length/2, begin, LLColor4(1.f, 1.f, 1.f, 0.1f));
if (begin - last_label > MIN_LABEL_SPACING)
{
gl_rect_2d(begin, bar_top, end, bar_bottom - tick_length, LLColor4(1.f, 1.f, 1.f, 0.25f));
LLFontGL::getFontMonospace()->renderUTF8(tick_string, 0, begin - 1, bar_bottom - tick_length,
LLColor4(1.f, 1.f, 1.f, 0.5f),
LLFontGL::RIGHT, LLFontGL::TOP);
last_label = begin;
}
else
{
gl_rect_2d(begin, bar_top, end, bar_bottom - tick_length/2, LLColor4(1.f, 1.f, 1.f, 0.1f));
}
}
}
else
{
if (begin - last_label > MIN_LABEL_SPACING)
// always draw one tick value past end, so we can see part of the text, if possible
if (tick_value > mCurMaxBar)
{
gl_rect_2d(begin, bar_top, end, bar_bottom - tick_length, LLColor4(1.f, 1.f, 1.f, 0.25f));
LLFontGL::getFontMonospace()->renderUTF8(tick_string, 0, begin - 1, bar_bottom - tick_length,
LLColor4(1.f, 1.f, 1.f, 0.5f),
LLFontGL::RIGHT, LLFontGL::TOP);
last_label = begin;
}
else
{
gl_rect_2d(begin, bar_top, end, bar_bottom - tick_length/2, LLColor4(1.f, 1.f, 1.f, 0.1f));
break;
}
}
}
@ -416,8 +451,7 @@ void LLStatBar::draw()
if (mDisplayHistory && (mCountFloatp || mEventFloatp || mSampleFloatp))
{
const S32 num_values = frame_recording.getNumRecordedPeriods() - 1;
F32 begin = 0;
F32 end = 0;
F32 value = 0;
S32 i;
gGL.color4f( 1.f, 0.f, 0.f, 1.f );
gGL.begin( LLRender::QUADS );
@ -427,49 +461,41 @@ void LLStatBar::draw()
{
F32 offset = ((F32)i / (F32)mNumFrames) * span;
LLTrace::Recording& recording = frame_recording.getPrevRecording(i);
if (mPerSec && mCountFloatp)
if (mCountFloatp)
{
begin = ((recording.getPerSec(*mCountFloatp) - mCurMinBar) * value_scale);
end = ((recording.getPerSec(*mCountFloatp) - mCurMinBar) * value_scale) + 1;
value = mPerSec
? recording.getPerSec(*mCountFloatp)
: recording.getSum(*mCountFloatp);
num_samples = recording.getSampleCount(*mCountFloatp);
}
else
else if (mEventFloatp)
{
if (mCountFloatp)
{
begin = ((recording.getSum(*mCountFloatp) - mCurMinBar) * value_scale);
end = ((recording.getSum(*mCountFloatp) - mCurMinBar) * value_scale) + 1;
num_samples = recording.getSampleCount(*mCountFloatp);
}
else if (mEventFloatp)
{
begin = ((recording.getMean(*mEventFloatp) - mCurMinBar) * value_scale);
end = ((recording.getMean(*mEventFloatp) - mCurMinBar) * value_scale) + 1;
num_samples = recording.getSampleCount(*mEventFloatp);
}
else if (mSampleFloatp)
{
begin = ((recording.getMean(*mSampleFloatp) - mCurMinBar) * value_scale);
end = ((recording.getMean(*mSampleFloatp) - mCurMinBar) * value_scale) + 1;
num_samples = recording.getSampleCount(*mSampleFloatp);
}
}
value = recording.getMean(*mEventFloatp);
num_samples = recording.getSampleCount(*mEventFloatp);
}
else if (mSampleFloatp)
{
value = recording.getMean(*mSampleFloatp);
num_samples = recording.getSampleCount(*mSampleFloatp);
}
if (!num_samples) continue;
F32 begin = (value - mCurMinBar) * value_scale;
if (mOrientation == HORIZONTAL)
{
gGL.vertex2f((F32)bar_right - offset, end);
gGL.vertex2f((F32)bar_right - offset, begin + 1);
gGL.vertex2f((F32)bar_right - offset, begin);
gGL.vertex2f((F32)bar_right - offset - 1.f, begin);
gGL.vertex2f((F32)bar_right - offset - 1.f, end);
gGL.vertex2f((F32)bar_right - offset - 1, begin);
gGL.vertex2f((F32)bar_right - offset - 1, begin + 1);
}
else
{
gGL.vertex2f(begin, (F32)bar_bottom+offset+1.f);
gGL.vertex2f(begin, (F32)bar_bottom+offset);
gGL.vertex2f(end, (F32)bar_bottom+offset);
gGL.vertex2f(end, (F32)bar_bottom+offset+1.f);
gGL.vertex2f(begin, (F32)bar_bottom + offset + 1);
gGL.vertex2f(begin, (F32)bar_bottom + offset);
gGL.vertex2f(begin + 1, (F32)bar_bottom + offset);
gGL.vertex2f(begin + 1, (F32)bar_bottom + offset + 1 );
}
}
gGL.end();
@ -517,9 +543,9 @@ void LLStatBar::setStat(const std::string& stat_name)
void LLStatBar::setRange(F32 bar_min, F32 bar_max)
{
mMinBar = bar_min;
mMaxBar = bar_max;
mTickValue = calc_reasonable_tick_value(mMinBar, mMaxBar);
mMinBar = llmin(bar_min, bar_max);
mMaxBar = llmax(bar_min, bar_max);
mTickValue = calc_tick_value(mMinBar, mMaxBar);
}
LLRect LLStatBar::getRequiredRect()

View File

@ -49,7 +49,6 @@ public:
Optional<bool> show_per_sec,
show_bar,
show_history,
show_mean,
scale_range;
Optional<S32> num_frames,
@ -60,14 +59,13 @@ public:
Params()
: label("label"),
unit_label("unit_label"),
bar_min("bar_min", 0.0f),
bar_max("bar_max", 0.0f),
tick_spacing("tick_spacing", 10.0f),
bar_min("bar_min", 0.f),
bar_max("bar_max", 0.f),
tick_spacing("tick_spacing", 0.f),
decimal_digits("decimal_digits", 3),
show_per_sec("show_per_sec", true),
show_bar("show_bar", false),
show_history("show_history", false),
show_mean("show_mean", true),
scale_range("scale_range", true),
num_frames("num_frames", 200),
max_height("max_height", 100),
@ -103,9 +101,8 @@ private:
bool mPerSec, // Use the per sec stats.
mDisplayBar, // Display the bar graph.
mDisplayHistory,
mDisplayMean, // If true, display mean, if false, display current value
mScaleMax,
mScaleMin;
mAutoScaleMax,
mAutoScaleMin;
EOrientation mOrientation;
LLTrace::TraceType<LLTrace::CountAccumulator>* mCountFloatp;

View File

@ -35,10 +35,9 @@
unit_label="frames"
stat="FPS"
decimal_digits="1"
bar_max="60"
show_bar="true"
show_history="true"/>
<stat_bar name="bandwidth"
<!-- <stat_bar name="bandwidth"
label="Bandwidth"
stat="Bandwidth"
show_bar="true"/>
@ -48,8 +47,7 @@
decimal_digits="3"/>
<stat_bar name="ping"
label="Ping Sim"
stat="simpingstat"
show_mean="false"/>
stat="simpingstat"/>
</stat_view>
<stat_view name="advanced"
@ -179,20 +177,17 @@
label="Time Dilation"
stat="simtimedilation"
decimal_digits="3"
bar_max="1"
show_mean="false"/>
bar_max="1" />
<stat_bar name="simfps"
label="Sim FPS"
stat="simfps"
decimal_digits="1"
bar_max="45"
show_mean="false"/>
bar_max="45" />
<stat_bar name="simphysicsfps"
label="Physics FPS"
stat="simphysicsfps"
decimal_digits="1"
bar_max="45"
show_mean="false"/>
bar_max="45" />
<stat_view name="physicsdetail"
label="Physics Details"
follows="left|top|right"
@ -200,58 +195,47 @@
show_label="true">
<stat_bar name="physicspinnedtasks"
label="Pinned Objects"
stat="physicspinnedtasks"
show_mean="false"/>
stat="physicspinnedtasks"/>
<stat_bar name="physicslodtasks"
label="Low LOD Objects"
stat="physicslodtasks"
show_mean="false"/>
stat="physicslodtasks"/>
<stat_bar name="physicsmemoryallocated"
label="Memory Allocated"
stat="physicsmemoryallocated"
decimal_digits="1"
show_mean="false"/>
decimal_digits="1"/>
</stat_view>
<stat_bar name="simagentups"
label="Agent Updates/Sec"
stat="simagentups"
decimal_digits="1"
show_mean="false"/>
decimal_digits="1"/>
<stat_bar name="simmainagents"
label="Main Agents"
stat="simmainagents"
bar_max="80"
show_mean="false"/>
bar_max="80"/>
<stat_bar name="simchildagents"
label="Child Agents"
stat="simchildagents"
show_mean="false"/>
stat="simchildagents"/>
<stat_bar name="simobjects"
label="Objects"
stat="simobjects"
bar_max="30000"
show_mean="false"/>
bar_max="30000" />
<stat_bar name="simactiveobjects"
label="Active Objects"
stat="simactiveobjects"
bar_max="5000"
show_mean="false"/>
bar_max="5000"/>
<stat_bar name="simactivescripts"
label="Active Scripts"
stat="simactivescripts"
bar_max="15000"
show_mean="false"/>
bar_max="15000"/>
<stat_bar name="simpctscriptsrun"
label="Scripts Run"
stat="simpctscriptsrun"
bar_max="100"
decimal_digits="3"
show_mean="true"/>
decimal_digits="3"/>
<stat_bar name="simscripteps"
label="Script Events"
stat="simscripteps"
unit_label="eps"
show_mean="false"/>
unit_label="eps"/>
<stat_view name="simpathfinding"
label="Pathfinding"
follows="left|top|right"
@ -260,8 +244,7 @@
<stat_bar name="simsimaistepmsec"
label="AI Step Time"
stat="simsimaistepmsec"
decimal_digits="3"
show_mean="false"/>
decimal_digits="3"/>
<stat_bar name="simsimskippedsilhouettesteps"
label="Skipped Silhouette Steps"
stat="simsimskippedsilhouettesteps"
@ -270,32 +253,26 @@
<stat_bar name="simsimpctsteppedcharacters"
stat="simsimpctsteppedcharacters"
bar_max="100"
decimal_digits="1"
show_mean="true"/>
decimal_digits="1"/>
</stat_view>
<stat_bar name="siminpps"
label="Packets In"
stat="siminpps"
unit_label="pkt/sec"
show_mean="false"/>
unit_label="pkt/sec"/>
<stat_bar name="simoutpps"
label="Packets Out"
stat="simoutpps"
unit_label="pkt/sec"
show_mean="false"/>
unit_label="pkt/sec"/>
<stat_bar name="simpendingdownloads"
label="Pending Downloads"
stat="simpendingdownloads"
show_mean="false"/>
stat="simpendingdownloads"/>
<stat_bar name="simpendinguploads"
label="Pending Uploads"
stat="simpendinguploads"
show_mean="false"/>
stat="simpendinguploads"/>
<stat_bar name="simtotalunackedbytes"
label="Total Unacked Bytes"
stat="simtotalunackedbytes"
decimal_digits="1"
show_mean="false"/>
decimal_digits="1"/>
<stat_view name="simperf"
label="Time"
follows="left|top|right"
@ -304,43 +281,35 @@
<stat_bar name="simframemsec"
label="Total Frame Time"
stat="simframemsec"
decimal_digits="3"
show_mean="false"/>
decimal_digits="3"/>
<stat_bar name="simnetmsec"
label="Net Time"
stat="simnetmsec"
decimal_digits="3"
show_mean="false"/>
decimal_digits="3"/>
<stat_bar name="simsimphysicsmsec"
label="Physics Time"
stat="simsimphysicsmsec"
decimal_digits="3"
show_mean="false"/>
decimal_digits="3"/>
<stat_bar name="simsimothermsec"
label="Simulation Time"
stat="simsimothermsec"
decimal_digits="3"
show_mean="false"/>
decimal_digits="3"/>
<stat_bar name="simagentmsec"
label="Agent Time"
stat="simagentmsec"
decimal_digits="3"
show_mean="false"/>
decimal_digits="3"/>
<stat_bar name="simimagesmsec"
label="Images Time"
stat="simimagesmsec"
decimal_digits="3"
show_mean="false"/>
decimal_digits="3"/>
<stat_bar name="simscriptmsec"
label="Script Time"
stat="simscriptmsec"
decimal_digits="3"
show_mean="false"/>
decimal_digits="3"/>
<stat_bar name="simsparemsec"
label="Spare Time"
stat="simsparemsec"
decimal_digits="3"
show_mean="false"/>
decimal_digits="3"/>
<stat_view name="timedetails"
label="Time Details"
follows="left|top|right"
@ -349,30 +318,25 @@
<stat_bar name="simsimphysicsstepmsec"
label="Physics Step"
stat="simsimphysicsstepmsec"
decimal_digits="3"
show_mean="false"/>
decimal_digits="3"/>
<stat_bar name="simsimphysicsshapeupdatemsec"
label="Update Phys Shapes"
stat="simsimphysicsshapeupdatemsec"
decimal_digits="3"
show_mean="false"/>
decimal_digits="3"/>
<stat_bar name="simsimphysicsothermsec"
label="Physics Other"
stat="simsimphysicsothermsec"
decimal_digits="3"
show_mean="false"/>
decimal_digits="3"/>
<stat_bar name="simsleepmsec"
label="Sleep Time"
stat="simsleepmsec"
decimal_digits="3"
show_mean="false"/>
decimal_digits="3"/>
<stat_bar name="simpumpiomsec"
label="Pump IO"
stat="simpumpiomsec"
decimal_digits="3"
show_mean="false"/>
decimal_digits="3"/>
</stat_view>
</stat_view>
</stat_view>-->
</stat_view>
</container_view>
</scroll_container>