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

various fixes to lltrace
start() on started recording no longer resets
fixed various instances of unit forgetfullness in lltrace
recording split now has gapless timing
scene monitor now guarantees min sample time
renamed a bunch of stats
added names to debug thread view on windows
master
Richard Linden 2013-07-15 11:05:57 -07:00
parent c95042db3e
commit 11e14cd3b0
21 changed files with 296 additions and 155 deletions

View File

@ -39,6 +39,39 @@
#include <sched.h>
#endif
#ifdef LL_WINDOWS
const DWORD MS_VC_EXCEPTION=0x406D1388;
#pragma pack(push,8)
typedef struct tagTHREADNAME_INFO
{
DWORD dwType; // Must be 0x1000.
const char* szName; // Pointer to name (in user addr space).
DWORD dwThreadID; // Thread ID (-1=caller thread).
DWORD dwFlags; // Reserved for future use, must be zero.
} THREADNAME_INFO;
#pragma pack(pop)
void SetThreadName( DWORD dwThreadID, const char* threadName)
{
THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = threadName;
info.dwThreadID = dwThreadID;
info.dwFlags = 0;
__try
{
RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(DWORD), (DWORD*)&info );
}
__except(EXCEPTION_CONTINUE_EXECUTION)
{
}
}
#endif
//----------------------------------------------------------------------------
// Usage:
// void run_func(LLThread* thread)
@ -93,6 +126,11 @@ void *APR_THREAD_FUNC LLThread::staticRun(apr_thread_t *apr_threadp, void *datap
{
LLThread *threadp = (LLThread *)datap;
#ifdef LL_WINDOWS
SetThreadName(-1, threadp->mName.c_str());
#endif
LLTrace::ThreadRecorder thread_recorder(*LLTrace::get_master_thread_recorder());
#if !LL_DARWIN
@ -224,6 +262,7 @@ void LLThread::start()
llwarns << "failed to start thread " << mName << llendl;
ll_apr_warn_status(status);
}
}
//============================================================================

View File

@ -37,7 +37,6 @@
namespace LLTrace
{
template<typename ACCUMULATOR>
class AccumulatorBuffer : public LLRefCount
{

View File

@ -38,10 +38,13 @@ namespace LLTrace
// Recording
///////////////////////////////////////////////////////////////////////
Recording::Recording()
: mElapsedSeconds(0)
Recording::Recording(EPlayState state)
: mElapsedSeconds(0),
mInHandOff(false)
{
mBuffers = new AccumulatorBufferGroup();
setPlayState(state);
}
Recording::Recording( const Recording& other )
@ -101,7 +104,8 @@ void Recording::handleStart()
{
mSamplingTimer.reset();
mBuffers.setStayUnique(true);
LLTrace::get_thread_recorder()->activate(mBuffers.write());
LLTrace::get_thread_recorder()->activate(mBuffers.write(), mInHandOff);
mInHandOff = false;
}
void Recording::handleStop()
@ -113,6 +117,7 @@ void Recording::handleStop()
void Recording::handleSplitTo(Recording& other)
{
other.mInHandOff = true;
mBuffers.write()->handOffTo(*other.mBuffers.write());
}
@ -485,6 +490,8 @@ void PeriodicRecording::handleStop()
void PeriodicRecording::handleReset()
{
getCurRecording().stop();
if (mAutoResize)
{
mRecordingPeriods.clear();
@ -500,6 +507,7 @@ void PeriodicRecording::handleReset()
}
}
mCurPeriod = 0;
mNumPeriods = 0;
getCurRecording().setPlayState(getPlayState());
}
@ -719,7 +727,6 @@ void LLStopWatchControlsMixinCommon::start()
handleStart();
break;
case STARTED:
handleReset();
break;
default:
llassert(false);

View File

@ -124,11 +124,32 @@ namespace LLTrace
template<typename T>
class EventStatHandle;
template<typename T>
struct RelatedTypes
{
typedef F64 fractional_t;
typedef T sum_t;
};
template<typename T, typename UNIT_T>
struct RelatedTypes<LLUnit<T, UNIT_T> >
{
typedef LLUnit<typename RelatedTypes<T>::fractional_t, UNIT_T> fractional_t;
typedef LLUnit<typename RelatedTypes<T>::sum_t, UNIT_T> sum_t;
};
template<>
struct RelatedTypes<bool>
{
typedef F64 fractional_t;
typedef U32 sum_t;
};
class Recording
: public LLStopWatchControlsMixin<Recording>
{
public:
Recording();
Recording(EPlayState state = LLStopWatchControlsMixinCommon::STOPPED);
Recording(const Recording& other);
~Recording();
@ -172,16 +193,16 @@ namespace LLTrace
// CountStatHandle accessors
F64 getSum(const TraceType<CountAccumulator>& stat);
template <typename T>
T getSum(const CountStatHandle<T>& stat)
typename RelatedTypes<T>::sum_t getSum(const CountStatHandle<T>& stat)
{
return (T)getSum(static_cast<const TraceType<CountAccumulator>&> (stat));
return (typename RelatedTypes<T>::sum_t)getSum(static_cast<const TraceType<CountAccumulator>&> (stat));
}
F64 getPerSec(const TraceType<CountAccumulator>& stat);
template <typename T>
T getPerSec(const CountStatHandle<T>& stat)
typename RelatedTypes<T>::fractional_t getPerSec(const CountStatHandle<T>& stat)
{
return (T)getPerSec(static_cast<const TraceType<CountAccumulator>&> (stat));
return (typename RelatedTypes<T>::fractional_t)getPerSec(static_cast<const TraceType<CountAccumulator>&> (stat));
}
U32 getSampleCount(const TraceType<CountAccumulator>& stat);
@ -197,9 +218,9 @@ namespace LLTrace
F64 getMean(const TraceType<SampleAccumulator>& stat);
template <typename T>
T getMean(SampleStatHandle<T>& stat)
typename RelatedTypes<T>::fractional_t getMean(SampleStatHandle<T>& stat)
{
return (T)getMean(static_cast<const TraceType<SampleAccumulator>&> (stat));
return (typename RelatedTypes<T>::fractional_t)getMean(static_cast<const TraceType<SampleAccumulator>&> (stat));
}
F64 getMax(const TraceType<SampleAccumulator>& stat);
@ -211,9 +232,9 @@ namespace LLTrace
F64 getStandardDeviation(const TraceType<SampleAccumulator>& stat);
template <typename T>
T getStandardDeviation(const SampleStatHandle<T>& stat)
typename RelatedTypes<T>::fractional_t getStandardDeviation(const SampleStatHandle<T>& stat)
{
return (T)getStandardDeviation(static_cast<const TraceType<SampleAccumulator>&> (stat));
return (typename RelatedTypes<T>::fractional_t)getStandardDeviation(static_cast<const TraceType<SampleAccumulator>&> (stat));
}
F64 getLastValue(const TraceType<SampleAccumulator>& stat);
@ -228,9 +249,9 @@ namespace LLTrace
// EventStatHandle accessors
F64 getSum(const TraceType<EventAccumulator>& stat);
template <typename T>
T getSum(const EventStatHandle<T>& stat)
typename RelatedTypes<T>::sum_t getSum(const EventStatHandle<T>& stat)
{
return (T)getSum(static_cast<const TraceType<EventAccumulator>&> (stat));
return (typename RelatedTypes<T>::sum_t)getSum(static_cast<const TraceType<EventAccumulator>&> (stat));
}
F64 getMin(const TraceType<EventAccumulator>& stat);
@ -249,16 +270,16 @@ namespace LLTrace
F64 getMean(const TraceType<EventAccumulator>& stat);
template <typename T>
T getMean(EventStatHandle<T>& stat)
typename RelatedTypes<T>::fractional_t getMean(EventStatHandle<T>& stat)
{
return (T)getMean(static_cast<const TraceType<EventAccumulator>&> (stat));
return (typename RelatedTypes<T>::fractional_t)getMean(static_cast<const TraceType<EventAccumulator>&> (stat));
}
F64 getStandardDeviation(const TraceType<EventAccumulator>& stat);
template <typename T>
T getStandardDeviation(const EventStatHandle<T>& stat)
typename RelatedTypes<T>::fractional_t getStandardDeviation(const EventStatHandle<T>& stat)
{
return (T)getStandardDeviation(static_cast<const TraceType<EventAccumulator>&> (stat));
return (typename RelatedTypes<T>::fractional_t)getStandardDeviation(static_cast<const TraceType<EventAccumulator>&> (stat));
}
F64 getLastValue(const TraceType<EventAccumulator>& stat);
@ -284,9 +305,11 @@ namespace LLTrace
// returns data for current thread
class ThreadRecorder* getThreadRecorder();
LLTimer mSamplingTimer;
LLUnit<F64, LLUnits::Seconds> mElapsedSeconds;
LLTimer mSamplingTimer;
LLUnit<F64, LLUnits::Seconds> mElapsedSeconds;
LLCopyOnWritePointer<AccumulatorBufferGroup> mBuffers;
bool mInHandOff;
};
class LL_COMMON_API PeriodicRecording
@ -310,11 +333,15 @@ namespace LLTrace
const Recording& getPrevRecording(U32 offset) const;
Recording snapshotCurRecording() const;
//
// PERIODIC MIN
//
// catch all for stats that have a defined sum
template <typename T>
typename T::value_t getPeriodMin(const TraceType<T>& stat, size_t num_periods = U32_MAX)
{
size_t total_periods = mRecordingPeriods.size();
size_t total_periods = mNumPeriods;
num_periods = llmin(num_periods, isStarted() ? total_periods - 1 : total_periods);
typename T::value_t min_val = std::numeric_limits<typename T::value_t>::max();
@ -326,6 +353,12 @@ namespace LLTrace
return min_val;
}
template<typename T>
T getPeriodMin(const CountStatHandle<T>& stat, size_t num_periods = U32_MAX)
{
return T(getPeriodMin(static_cast<const TraceType<CountAccumulator>&>(stat), num_periods));
}
F64 getPeriodMin(const TraceType<SampleAccumulator>& stat, size_t num_periods = U32_MAX);
template<typename T>
T getPeriodMin(const SampleStatHandle<T>& stat, size_t num_periods = U32_MAX)
@ -341,9 +374,9 @@ namespace LLTrace
}
template <typename T>
F64 getPeriodMinPerSec(const TraceType<T>& stat, size_t num_periods = U32_MAX)
typename RelatedTypes<typename T::value_t>::fractional_t getPeriodMinPerSec(const TraceType<T>& stat, size_t num_periods = U32_MAX)
{
size_t total_periods = mRecordingPeriods.size();
size_t total_periods = mNumPeriods;
num_periods = llmin(num_periods, isStarted() ? total_periods - 1 : total_periods);
F64 min_val = std::numeric_limits<F64>::max();
@ -352,14 +385,24 @@ namespace LLTrace
S32 index = (mCurPeriod + total_periods - i) % total_periods;
min_val = llmin(min_val, mRecordingPeriods[index].getPerSec(stat));
}
return min_val;
return (typename RelatedTypes<typename T::value_t>::fractional_t) min_val;
}
template<typename T>
typename RelatedTypes<T>::fractional_t getPeriodMinPerSec(const CountStatHandle<T>& stat, size_t num_periods = U32_MAX)
{
return typename RelatedTypes<T>::fractional_t(getPeriodMinPerSec(static_cast<const TraceType<CountAccumulator>&>(stat), num_periods));
}
//
// PERIODIC MAX
//
// catch all for stats that have a defined sum
template <typename T>
typename T::value_t getPeriodMax(const TraceType<T>& stat, size_t num_periods = U32_MAX)
{
size_t total_periods = mRecordingPeriods.size();
size_t total_periods = mNumPeriods;
num_periods = llmin(num_periods, isStarted() ? total_periods - 1 : total_periods);
typename T::value_t max_val = std::numeric_limits<typename T::value_t>::min();
@ -371,6 +414,12 @@ namespace LLTrace
return max_val;
}
template<typename T>
T getPeriodMax(const CountStatHandle<T>& stat, size_t num_periods = U32_MAX)
{
return T(getPeriodMax(static_cast<const TraceType<CountAccumulator>&>(stat), num_periods));
}
F64 getPeriodMax(const TraceType<SampleAccumulator>& stat, size_t num_periods = U32_MAX);
template<typename T>
T getPeriodMax(const SampleStatHandle<T>& stat, size_t num_periods = U32_MAX)
@ -386,9 +435,9 @@ namespace LLTrace
}
template <typename T>
F64 getPeriodMaxPerSec(const TraceType<T>& stat, size_t num_periods = U32_MAX)
typename RelatedTypes<typename T::value_t>::fractional_t getPeriodMaxPerSec(const TraceType<T>& stat, size_t num_periods = U32_MAX)
{
size_t total_periods = mRecordingPeriods.size();
size_t total_periods = mNumPeriods;
num_periods = llmin(num_periods, isStarted() ? total_periods - 1 : total_periods);
F64 max_val = std::numeric_limits<F64>::min();
@ -397,14 +446,24 @@ namespace LLTrace
S32 index = (mCurPeriod + total_periods - i) % total_periods;
max_val = llmax(max_val, mRecordingPeriods[index].getPerSec(stat));
}
return max_val;
return (typename RelatedTypes<typename T::value_t>::fractional_t)max_val;
}
template<typename T>
typename RelatedTypes<T>::fractional_t getPeriodMaxPerSec(const CountStatHandle<T>& stat, size_t num_periods = U32_MAX)
{
return typename RelatedTypes<T>::fractional_t(getPeriodMaxPerSec(static_cast<const TraceType<CountAccumulator>&>(stat), num_periods));
}
//
// PERIODIC MEAN
//
// catch all for stats that have a defined sum
template <typename T>
typename T::mean_t getPeriodMean(const TraceType<T >& stat, size_t num_periods = U32_MAX)
{
size_t total_periods = mRecordingPeriods.size();
size_t total_periods = mNumPeriods;
num_periods = llmin(num_periods, isStarted() ? total_periods - 1 : total_periods);
typename T::mean_t mean = 0;
@ -422,24 +481,29 @@ namespace LLTrace
return mean;
}
template<typename T>
typename RelatedTypes<T>::fractional_t getPeriodMean(const CountStatHandle<T>& stat, size_t num_periods = U32_MAX)
{
return typename RelatedTypes<T>::fractional_t(getPeriodMean(static_cast<const TraceType<CountAccumulator>&>(stat), num_periods));
}
F64 getPeriodMean(const TraceType<SampleAccumulator>& stat, size_t num_periods = U32_MAX);
template<typename T>
T getPeriodMean(const SampleStatHandle<T>& stat, size_t num_periods = U32_MAX)
typename RelatedTypes<T>::fractional_t getPeriodMean(const SampleStatHandle<T>& stat, size_t num_periods = U32_MAX)
{
return T(getPeriodMean(static_cast<const TraceType<SampleAccumulator>&>(stat), num_periods));
return typename RelatedTypes<T>::fractional_t(getPeriodMean(static_cast<const TraceType<SampleAccumulator>&>(stat), num_periods));
}
F64 getPeriodMean(const TraceType<EventAccumulator>& stat, size_t num_periods = U32_MAX);
template<typename T>
T getPeriodMean(const EventStatHandle<T>& stat, size_t num_periods = U32_MAX)
typename RelatedTypes<T>::fractional_t getPeriodMean(const EventStatHandle<T>& stat, size_t num_periods = U32_MAX)
{
return T(getPeriodMean(static_cast<const TraceType<EventAccumulator>&>(stat), num_periods));
return typename RelatedTypes<T>::fractional_t(getPeriodMean(static_cast<const TraceType<EventAccumulator>&>(stat), num_periods));
}
template <typename T>
typename T::mean_t getPeriodMeanPerSec(const TraceType<T>& stat, size_t num_periods = U32_MAX)
typename RelatedTypes<typename T::mean_t>::fractional_t getPeriodMeanPerSec(const TraceType<T>& stat, size_t num_periods = U32_MAX)
{
size_t total_periods = mRecordingPeriods.size();
size_t total_periods = mNumPeriods;
num_periods = llmin(num_periods, isStarted() ? total_periods - 1 : total_periods);
typename T::mean_t mean = 0;
@ -454,7 +518,13 @@ namespace LLTrace
}
}
mean = mean / num_periods;
return mean;
return (typename RelatedTypes<typename T::mean_t>::fractional_t)mean;
}
template<typename T>
typename RelatedTypes<T>::fractional_t getPeriodMeanPerSec(const CountStatHandle<T>& stat, size_t num_periods = U32_MAX)
{
return typename RelatedTypes<T>::fractional_t(getPeriodMeanPerSec(static_cast<const TraceType<CountAccumulator>&>(stat), num_periods));
}
private:
@ -504,11 +574,10 @@ namespace LLTrace
ExtendablePeriodicRecording();
void extend();
PeriodicRecording& getAcceptedRecording() { return mAcceptedRecording; }
const PeriodicRecording& getAcceptedRecording() const {return mAcceptedRecording;}
PeriodicRecording& getResults() { return mAcceptedRecording; }
const PeriodicRecording& getResults() const {return mAcceptedRecording;}
PeriodicRecording& getPotentialRecording() { return mPotentialRecording; }
const PeriodicRecording& getPotentialRecording() const {return mPotentialRecording;}
void nextPeriod() { mPotentialRecording.nextPeriod(); }
private:
// implementation for LLStopWatchControlsMixin

View File

@ -120,13 +120,17 @@ TimeBlockTreeNode* ThreadRecorder::getTimeBlockTreeNode( S32 index )
}
void ThreadRecorder::activate( AccumulatorBufferGroup* recording )
void ThreadRecorder::activate( AccumulatorBufferGroup* recording, bool from_handoff )
{
ActiveRecording* active_recording = new ActiveRecording(recording);
if (!mActiveRecordings.empty())
{
AccumulatorBufferGroup& prev_active_recording = mActiveRecordings.back()->mPartialRecording;
prev_active_recording.sync();
if (!from_handoff)
{
TimeBlock::updateTimes();
}
prev_active_recording.handOffTo(active_recording->mPartialRecording);
}
mActiveRecordings.push_back(active_recording);
@ -240,6 +244,7 @@ void ThreadRecorder::pushToParent()
{ LLMutexLock lock(&mSharedRecordingMutex);
LLTrace::get_thread_recorder()->bringUpToDate(&mThreadRecordingBuffers);
mSharedRecordingBuffers.append(mThreadRecordingBuffers);
mThreadRecordingBuffers.reset();
}
}

View File

@ -47,7 +47,7 @@ namespace LLTrace
~ThreadRecorder();
void activate(AccumulatorBufferGroup* recording);
void activate(AccumulatorBufferGroup* recording, bool from_handoff = false);
void deactivate(AccumulatorBufferGroup* recording);
active_recording_list_t::reverse_iterator bringUpToDate(AccumulatorBufferGroup* recording);

View File

@ -1294,6 +1294,7 @@ bool LLAppViewer::mainLoop()
{
LLFastTimer _(FTM_FRAME);
LLTrace::TimeBlock::processTimes();
llassert(LLStatViewer::FPS.getPrimaryAccumulator()->getSampleCount() <= 1);
LLTrace::get_frame_recording().nextPeriod();
LLTrace::TimeBlock::logStats();

View File

@ -256,7 +256,7 @@ void LLSceneMonitor::unfreezeScene()
void LLSceneMonitor::capture()
{
static U32 last_capture_time = 0;
static U32 last_capture_frame = 0;
static LLCachedControl<bool> monitor_enabled(gSavedSettings, "SceneLoadingMonitorEnabled");
static LLCachedControl<F32> scene_load_sample_time(gSavedSettings, "SceneLoadingMonitorSampleTime");
static LLFrameTimer timer;
@ -268,11 +268,11 @@ void LLSceneMonitor::capture()
if(mEnabled)
{
unfreezeScene();
reset();
force_capture = true;
}
else
{
reset();
freezeScene();
}
@ -280,8 +280,8 @@ void LLSceneMonitor::capture()
}
if (mEnabled
&& (mMonitorRecording.getSum(*LLViewerCamera::getVelocityStat()) > 0.1f
|| mMonitorRecording.getSum(*LLViewerCamera::getAngularVelocityStat()) > 0.05f))
&& (mMonitorRecording.getSum(*LLViewerCamera::getVelocityStat()) > 0.1f
|| mMonitorRecording.getSum(*LLViewerCamera::getAngularVelocityStat()) > 0.05f))
{
reset();
freezeScene();
@ -290,9 +290,10 @@ void LLSceneMonitor::capture()
if((timer.getElapsedTimeF32() > scene_load_sample_time()
|| force_capture)
&& mDiffState == WAITING_FOR_NEXT_DIFF
&& mEnabled
&& LLGLSLShader::sNoFixedFunction
&& last_capture_time != gFrameCount)
&& last_capture_frame != gFrameCount)
{
force_capture = false;
@ -301,7 +302,7 @@ void LLSceneMonitor::capture()
timer.reset();
last_capture_time = gFrameCount;
last_capture_frame = gFrameCount;
LLRenderTarget& cur_target = getCaptureTarget();
@ -465,7 +466,11 @@ void LLSceneMonitor::fetchQueryResult()
{
LLFastTimer _(FTM_SCENE_LOAD_IMAGE_DIFF);
if(mDiffState == WAIT_ON_RESULT)
// also throttle timing here, to avoid going below sample time due to phasing with frame capture
static LLCachedControl<F32> scene_load_sample_time(gSavedSettings, "SceneLoadingMonitorSampleTime");
static LLFrameTimer timer;
if(mDiffState == WAIT_ON_RESULT && timer.getElapsedTimeF32() > scene_load_sample_time)
{
mDiffState = WAITING_FOR_NEXT_DIFF;
@ -479,7 +484,7 @@ void LLSceneMonitor::fetchQueryResult()
mDiffResult = count * 0.5f / (mDiff->getWidth() * mDiff->getHeight() * mDiffPixelRatio * mDiffPixelRatio); //0.5 -> (front face + back face)
LL_DEBUGS("SceneMonitor") << "Frame difference: " << std::setprecision(4) << mDiffResult << LL_ENDL;
record(sFramePixelDiff, mDiffResult);
record(sFramePixelDiff, sqrtf(mDiffResult));
static LLCachedControl<F32> diff_threshold(gSavedSettings,"SceneLoadingPixelDiffThreshold");
if(mDiffResult > diff_threshold())
@ -488,7 +493,7 @@ void LLSceneMonitor::fetchQueryResult()
}
else
{
mSceneLoadRecording.getPotentialRecording().nextPeriod();
mSceneLoadRecording.nextPeriod();
}
}
}
@ -506,7 +511,7 @@ void LLSceneMonitor::dumpToFile(std::string file_name)
os << std::setprecision(10);
PeriodicRecording& scene_load_recording = mSceneLoadRecording.getAcceptedRecording();
PeriodicRecording& scene_load_recording = mSceneLoadRecording.getResults();
const U32 frame_count = scene_load_recording.getNumRecordedPeriods();
LLUnit<F64, LLUnits::Seconds> frame_time;
@ -519,6 +524,15 @@ void LLSceneMonitor::dumpToFile(std::string file_name)
}
os << '\n';
os << "Sample period(s)";
for (S32 frame = 1; frame <= frame_count; frame++)
{
frame_time = scene_load_recording.getPrevRecording(frame_count - frame).getDuration();
os << ", " << frame_time.value();
}
os << '\n';
typedef TraceType<CountAccumulator> trace_count;
for (trace_count::instance_iter it = trace_count::beginInstances(), end_it = trace_count::endInstances();
it != end_it;
@ -697,7 +711,7 @@ void LLSceneMonitorView::draw()
LLFontGL::getFontMonospace()->renderUTF8(num_str, 0, 5, getRect().getHeight() - line_height * lines, color, LLFontGL::LEFT, LLFontGL::TOP);
lines++;
num_str = llformat("Scene Loading time: %.3f seconds", (F32)LLSceneMonitor::getInstance()->getRecording()->getAcceptedRecording().getDuration().value());
num_str = llformat("Scene Loading time: %.3f seconds", (F32)LLSceneMonitor::getInstance()->getRecording()->getResults().getDuration().value());
LLFontGL::getFontMonospace()->renderUTF8(num_str, 0, 5, getRect().getHeight() - line_height * lines, color, LLFontGL::LEFT, LLFontGL::TOP);
lines++;

View File

@ -62,7 +62,7 @@ public:
const LLTrace::ExtendablePeriodicRecording* getRecording() const {return &mSceneLoadRecording;}
void dumpToFile(std::string file_name);
bool hasResults() const { return mSceneLoadRecording.getAcceptedRecording().getDuration() != 0;}
bool hasResults() const { return mSceneLoadRecording.getResults().getDuration() != 0;}
private:
void freezeScene();

View File

@ -198,7 +198,7 @@ BOOL LLStatusBar::postBuild()
sgp.rect(r);
sgp.follows.flags(FOLLOWS_BOTTOM | FOLLOWS_RIGHT);
sgp.mouse_opaque(false);
sgp.stat.count_stat_float(&LLStatViewer::KBIT);
sgp.stat.count_stat_float(&LLStatViewer::ACTIVE_MESSAGE_DATA_RECEIVED);
sgp.units("Kbps");
sgp.precision(0);
mSGBandwidth = LLUICtrlFactory::create<LLStatGraph>(sgp);

View File

@ -1483,7 +1483,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
mGetReason.clear();
LL_DEBUGS("Texture") << "HTTP GET: " << mID << " Offset: " << mRequestedOffset
<< " Bytes: " << mRequestedSize
<< " Bandwidth(kbps): " << mFetcher->getTextureBandwidth() << "/" << mFetcher->mMaxBandwidth
<< " Bandwidth(kbps): " << mFetcher->getTextureBandwidth().value() << "/" << mFetcher->mMaxBandwidth
<< LL_ENDL;
// Will call callbackHttpGet when curl request completes
@ -2891,7 +2891,7 @@ S32 LLTextureFetch::update(F32 max_time_ms)
mNetworkQueueMutex.lock(); // +Mfnq
mMaxBandwidth = band_width;
add(LLStatViewer::TEXTURE_KBIT, mHTTPTextureBits);
add(LLStatViewer::TEXTURE_NETWORK_DATA_RECEIVED, mHTTPTextureBits);
mHTTPTextureBits = 0;
mNetworkQueueMutex.unlock(); // -Mfnq

View File

@ -107,10 +107,10 @@ public:
bool receiveImagePacket(const LLHost& host, const LLUUID& id, U16 packet_num, U16 data_size, U8* data);
// Threads: T* (but not safe)
void setTextureBandwidth(F32 bandwidth) { mTextureBandwidth = bandwidth; }
void setTextureBandwidth(LLUnit<F32, LLUnits::Kibibits> bandwidth) { mTextureBandwidth = bandwidth; }
// Threads: T* (but not safe)
F32 getTextureBandwidth() { return mTextureBandwidth; }
LLUnit<F32, LLUnits::Kibibits> getTextureBandwidth() { return mTextureBandwidth; }
// Threads: T*
BOOL isFromLocalCache(const LLUUID& id);
@ -325,8 +325,8 @@ private:
queue_t mHTTPTextureQueue; // Mfnq
typedef std::map<LLHost,std::set<LLUUID> > cancel_queue_t;
cancel_queue_t mCancelQueue; // Mfnq
F32 mTextureBandwidth; // <none>
F32 mMaxBandwidth; // Mfnq
LLUnit<F32, LLUnits::Kibibits> mTextureBandwidth; // <none>
LLUnit<F32, LLUnits::Kibibits> mMaxBandwidth; // Mfnq
LLTextureInfo mTextureInfo;
// XXX possible delete

View File

@ -586,8 +586,8 @@ void LLGLTexMemBar::draw()
left = 550;
F32 bandwidth = LLAppViewer::getTextureFetch()->getTextureBandwidth();
F32 max_bandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS");
LLUnit<F32, LLUnits::Kibibits> bandwidth = LLAppViewer::getTextureFetch()->getTextureBandwidth();
LLUnit<F32, LLUnits::Kibibits> max_bandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS");
color = bandwidth > max_bandwidth ? LLColor4::red : bandwidth > max_bandwidth*.75f ? LLColor4::yellow : text_color;
color[VALPHA] = text_color[VALPHA];
text = llformat("BW:%.0f/%.0f",bandwidth, max_bandwidth);

View File

@ -153,29 +153,29 @@ namespace LLViewerAssetStatsFF
};
if (at < 0 || at >= LLViewerAssetType::AT_COUNT)
{
{
return EVACOtherGet;
}
}
EViewerAssetCategories ret(asset_to_bin_map[at]);
if (EVACTextureTempHTTPGet == ret)
{
// Indexed with [is_temp][with_http]
static const EViewerAssetCategories texture_bin_map[2][2] =
{
{
{
{
EVACTextureNonTempUDPGet,
EVACTextureNonTempHTTPGet,
EVACTextureNonTempHTTPGet,
},
{
EVACTextureTempUDPGet,
EVACTextureTempHTTPGet,
}
EVACTextureTempHTTPGet,
}
};
ret = texture_bin_map[is_temp][with_http];
}
return ret;
}
}
static LLTrace::CountStatHandle<> sEnqueueAssetRequestsTempTextureHTTP ("enqueuedassetrequeststemptexturehttp",
"Number of temporary texture asset http requests enqueued"),
@ -384,50 +384,50 @@ void LLViewerAssetStats::getStats(AssetStats& stats, bool compact_output)
.resp_min(rec.getMin(*sResponse[EVACTextureTempHTTPGet]).value())
.resp_max(rec.getMax(*sResponse[EVACTextureTempHTTPGet]).value())
.resp_mean(rec.getMean(*sResponse[EVACTextureTempHTTPGet]).value());
}
}
if (!compact_output
|| rec.getSum(*sEnqueued[EVACTextureTempUDPGet])
|| rec.getSum(*sDequeued[EVACTextureTempUDPGet])
|| rec.getSum(*sResponse[EVACTextureTempUDPGet]).value())
{
{
r.get_texture_temp_udp .enqueued((S32)rec.getSum(*sEnqueued[EVACTextureTempUDPGet]))
.dequeued((S32)rec.getSum(*sDequeued[EVACTextureTempUDPGet]))
.resp_count((S32)rec.getSum(*sResponse[EVACTextureTempUDPGet]).value())
.resp_min(rec.getMin(*sResponse[EVACTextureTempUDPGet]).value())
.resp_max(rec.getMax(*sResponse[EVACTextureTempUDPGet]).value())
.resp_mean(rec.getMean(*sResponse[EVACTextureTempUDPGet]).value());
}
}
if (!compact_output
|| rec.getSum(*sEnqueued[EVACTextureNonTempHTTPGet])
|| rec.getSum(*sDequeued[EVACTextureNonTempHTTPGet])
|| rec.getSum(*sResponse[EVACTextureNonTempHTTPGet]).value())
{
{
r.get_texture_non_temp_http .enqueued((S32)rec.getSum(*sEnqueued[EVACTextureNonTempHTTPGet]))
.dequeued((S32)rec.getSum(*sDequeued[EVACTextureNonTempHTTPGet]))
.resp_count((S32)rec.getSum(*sResponse[EVACTextureNonTempHTTPGet]).value())
.resp_min(rec.getMin(*sResponse[EVACTextureNonTempHTTPGet]).value())
.resp_max(rec.getMax(*sResponse[EVACTextureNonTempHTTPGet]).value())
.resp_mean(rec.getMean(*sResponse[EVACTextureNonTempHTTPGet]).value());
}
}
if (!compact_output
|| rec.getSum(*sEnqueued[EVACTextureNonTempUDPGet])
|| rec.getSum(*sDequeued[EVACTextureNonTempUDPGet])
|| rec.getSum(*sResponse[EVACTextureNonTempUDPGet]).value())
{
{
r.get_texture_non_temp_udp .enqueued((S32)rec.getSum(*sEnqueued[EVACTextureNonTempUDPGet]))
.dequeued((S32)rec.getSum(*sDequeued[EVACTextureNonTempUDPGet]))
.resp_count((S32)rec.getSum(*sResponse[EVACTextureNonTempUDPGet]).value())
.resp_min(rec.getMin(*sResponse[EVACTextureNonTempUDPGet]).value())
.resp_max(rec.getMax(*sResponse[EVACTextureNonTempUDPGet]).value())
.resp_mean(rec.getMean(*sResponse[EVACTextureNonTempUDPGet]).value());
}
}
if (!compact_output
|| rec.getSum(*sEnqueued[EVACWearableUDPGet])
|| rec.getSum(*sDequeued[EVACWearableUDPGet])
|| rec.getSum(*sResponse[EVACWearableUDPGet]).value())
{
{
r.get_wearable_udp .enqueued((S32)rec.getSum(*sEnqueued[EVACWearableUDPGet]))
.dequeued((S32)rec.getSum(*sDequeued[EVACWearableUDPGet]))
.resp_count((S32)rec.getSum(*sResponse[EVACWearableUDPGet]).value())
@ -478,16 +478,16 @@ void LLViewerAssetStats::getStats(AssetStats& stats, bool compact_output)
S32 fps = (S32)rec.getLastValue(LLStatViewer::FPS_SAMPLE);
if (!compact_output || fps != 0)
{
r.fps.count(fps);
r.fps.min(rec.getMin(LLStatViewer::FPS_SAMPLE));
r.fps.max(rec.getMax(LLStatViewer::FPS_SAMPLE));
r.fps.mean(rec.getMean(LLStatViewer::FPS_SAMPLE));
r.fps .count(fps)
.min(rec.getMin(LLStatViewer::FPS_SAMPLE))
.max(rec.getMax(LLStatViewer::FPS_SAMPLE))
.mean(rec.getMean(LLStatViewer::FPS_SAMPLE));
}
U32 grid_x(0), grid_y(0);
grid_from_region_handle(it->first, &grid_x, &grid_y);
r.grid_x(grid_x);
r.grid_y(grid_y);
r.duration(LLUnit<F64, LLUnits::Microseconds>(rec.getDuration()).value());
r .grid_x(grid_x)
.grid_y(grid_y)
.duration(LLUnit<F64, LLUnits::Microseconds>(rec.getDuration()).value());
}
stats.duration(mCurRecording ? LLUnit<F64, LLUnits::Microseconds>(mCurRecording->getDuration()).value() : 0.0);
@ -526,6 +526,7 @@ void record_enqueue(LLViewerAssetType::EType at, bool with_http, bool is_temp)
{
const EViewerAssetCategories eac(asset_type_to_category(at, with_http, is_temp));
llinfos << "enqueue " << int(eac) << llendl;
add(*sEnqueued[int(eac)], 1);
}

View File

@ -89,19 +89,22 @@ LLTrace::CountStatHandle<> FPS("FPS", "Frames rendered"),
TEX_REBAKES("texrebakes", "Number of times avatar textures have been forced to rebake"),
NUM_NEW_OBJECTS("numnewobjectsstat", "Number of objects in scene that were not previously in cache");
LLTrace::CountStatHandle<LLUnit<F64, LLUnits::Kilotriangles> > TRIANGLES_DRAWN("trianglesdrawnstat");
LLTrace::CountStatHandle<LLUnit<F64, LLUnits::Kilotriangles> >
TRIANGLES_DRAWN("trianglesdrawnstat");
LLTrace::CountStatHandle<LLUnit<F64, LLUnits::Kibibits> > KBIT("Bandwidth", "Network data received"),
LAYERS_KBIT("layerskbitstat", "Network data received for layer data (terrain)"),
OBJECT_KBIT("objectkbitstat", "Network data received for objects"),
ASSET_KBIT("assetkbitstat", "Network data received for assets (animations, sounds)"),
TEXTURE_KBIT("texturekbitstat", "Network data received for textures"),
ACTUAL_IN_KBIT("actualinkbitstat", "Incoming network data"),
ACTUAL_OUT_KBIT("actualoutkbitstat", "Outgoing network data");
LLTrace::CountStatHandle<LLUnit<F64, LLUnits::Kibibytes> >
ACTIVE_MESSAGE_DATA_RECEIVED("activemessagedatareceived", "Message system data received on all active regions"),
LAYERS_NETWORK_DATA_RECEIVED("layersdatareceived", "Network data received for layer data (terrain)"),
OBJECT_NETWORK_DATA_RECEIVED("objectdatareceived", "Network data received for objects"),
ASSET_UDP_DATA_RECEIVED("assetudpdatareceived", "Network data received for assets (animations, sounds) over UDP message system"),
TEXTURE_NETWORK_DATA_RECEIVED("texturedatareceived", "Network data received for textures"),
MESSAGE_SYSTEM_DATA_IN("messagedatain", "Incoming message system network data"),
MESSAGE_SYSTEM_DATA_OUT("messagedataout", "Outgoing message system network data");
LLTrace::CountStatHandle<LLUnit<F64, LLUnits::Seconds> > SIM_20_FPS_TIME("sim20fpstime", "Seconds with sim FPS below 20"),
SIM_PHYSICS_20_FPS_TIME("simphysics20fpstime", "Seconds with physics FPS below 20"),
LOSS_5_PERCENT_TIME("loss5percenttime", "Seconds with packet loss > 5%");
LLTrace::CountStatHandle<LLUnit<F64, LLUnits::Seconds> >
SIM_20_FPS_TIME("sim20fpstime", "Seconds with sim FPS below 20"),
SIM_PHYSICS_20_FPS_TIME("simphysics20fpstime", "Seconds with physics FPS below 20"),
LOSS_5_PERCENT_TIME("loss5percenttime", "Seconds with packet loss > 5%");
SimMeasurement<> SIM_TIME_DILATION("simtimedilation", "Simulator time scale", LL_SIM_STAT_TIME_DILATION),
SIM_FPS("simfps", "Simulator framerate", LL_SIM_STAT_FPS),
@ -122,8 +125,9 @@ SimMeasurement<> SIM_TIME_DILATION("simtimedilation", "Simulator time scale",
SIM_PHYSICS_PINNED_TASKS("physicspinnedtasks", "", LL_SIM_STAT_PHYSICS_PINNED_TASKS),
SIM_PHYSICS_LOD_TASKS("physicslodtasks", "", LL_SIM_STAT_PHYSICS_LOD_TASKS);
SimMeasurement<LLUnit<F64, LLUnits::Percent> > SIM_PERCENTAGE_SCRIPTS_RUN("simpctscriptsrun", "", LL_SIM_STAT_PCTSCRIPTSRUN),
SIM_SKIPPED_CHARACTERS_PERCENTAGE("simsimpctsteppedcharacters", "", LL_SIM_STAT_PCTSTEPPEDCHARACTERS);
SimMeasurement<LLUnit<F64, LLUnits::Percent> >
SIM_PERCENTAGE_SCRIPTS_RUN("simpctscriptsrun", "", LL_SIM_STAT_PCTSCRIPTSRUN),
SIM_SKIPPED_CHARACTERS_PERCENTAGE("simsimpctsteppedcharacters", "", LL_SIM_STAT_PCTSTEPPEDCHARACTERS);
LLTrace::SampleStatHandle<> FPS_SAMPLE("fpssample"),
NUM_IMAGES("numimagesstat"),
@ -139,9 +143,11 @@ LLTrace::SampleStatHandle<> FPS_SAMPLE("fpssample"),
WINDOW_WIDTH("windowwidth", "Window width"),
WINDOW_HEIGHT("windowheight", "Window height");
LLTrace::SampleStatHandle<LLUnit<F32, LLUnits::Percent> > PACKETS_LOST_PERCENT("packetslostpercentstat");
LLTrace::SampleStatHandle<LLUnit<F32, LLUnits::Percent> >
PACKETS_LOST_PERCENT("packetslostpercentstat");
static LLTrace::SampleStatHandle<S64> CHAT_BUBBLES("chatbubbles", "Chat Bubbles Enabled");
static LLTrace::SampleStatHandle<bool>
CHAT_BUBBLES("chatbubbles", "Chat Bubbles Enabled");
LLTrace::SampleStatHandle<LLUnit<F64, LLUnits::Megabytes> > GL_TEX_MEM("gltexmemstat"),
GL_BOUND_MEM("glboundmemstat"),
@ -197,12 +203,10 @@ LLViewerStats::LLViewerStats()
: mLastTimeDiff(0.0)
{
mRecording.start();
LLTrace::get_frame_recording().start();
}
LLViewerStats::~LLViewerStats()
{
}
{}
void LLViewerStats::resetStats()
{
@ -363,10 +367,10 @@ void update_statistics()
add(LLStatViewer::FPS, 1);
F32 layer_bits = (F32)(gVLManager.getLandBits() + gVLManager.getWindBits() + gVLManager.getCloudBits());
add(LLStatViewer::LAYERS_KBIT, LLUnit<F64, LLUnits::Bits>(layer_bits));
add(LLStatViewer::OBJECT_KBIT, gObjectData);
add(LLStatViewer::LAYERS_NETWORK_DATA_RECEIVED, LLUnit<F64, LLUnits::Bits>(layer_bits));
add(LLStatViewer::OBJECT_NETWORK_DATA_RECEIVED, gObjectData);
sample(LLStatViewer::PENDING_VFS_OPERATIONS, LLVFile::getVFSThread()->getPending());
add(LLStatViewer::ASSET_KBIT, LLUnit<F64, LLUnits::Bits>(gTransferManager.getTransferBitsIn(LLTCT_ASSET)));
add(LLStatViewer::ASSET_UDP_DATA_RECEIVED, LLUnit<F64, LLUnits::Bits>(gTransferManager.getTransferBitsIn(LLTCT_ASSET)));
gTransferManager.resetTransferBitsIn(LLTCT_ASSET);
if (LLAppViewer::getTextureFetch()->getNumRequests() == 0)
@ -393,7 +397,7 @@ void update_statistics()
static LLFrameTimer texture_stats_timer;
if (texture_stats_timer.getElapsedTimeF32() >= texture_stats_freq)
{
gTotalTextureData = LLViewerStats::instance().getRecording().getSum(LLStatViewer::TEXTURE_KBIT);
gTotalTextureData = LLViewerStats::instance().getRecording().getSum(LLStatViewer::TEXTURE_NETWORK_DATA_RECEIVED);
texture_stats_timer.reset();
}
}

View File

@ -94,13 +94,13 @@ extern LLTrace::CountStatHandle<> FPS,
extern LLTrace::CountStatHandle<LLUnit<F64, LLUnits::Kilotriangles> > TRIANGLES_DRAWN;
extern LLTrace::CountStatHandle<LLUnit<F64, LLUnits::Kibibits> > KBIT,
LAYERS_KBIT,
OBJECT_KBIT,
ASSET_KBIT,
TEXTURE_KBIT,
ACTUAL_IN_KBIT,
ACTUAL_OUT_KBIT;
extern LLTrace::CountStatHandle<LLUnit<F64, LLUnits::Kibibytes> > ACTIVE_MESSAGE_DATA_RECEIVED,
LAYERS_NETWORK_DATA_RECEIVED,
OBJECT_NETWORK_DATA_RECEIVED,
ASSET_UDP_DATA_RECEIVED,
TEXTURE_NETWORK_DATA_RECEIVED,
MESSAGE_SYSTEM_DATA_IN,
MESSAGE_SYSTEM_DATA_OUT;
extern LLTrace::CountStatHandle<LLUnit<F64, LLUnits::Seconds> > SIM_20_FPS_TIME,
SIM_PHYSICS_20_FPS_TIME,

View File

@ -663,7 +663,7 @@ void LLViewerTextureList::updateImages(F32 max_time)
}
cleared = FALSE;
LLAppViewer::getTextureFetch()->setTextureBandwidth(LLTrace::get_frame_recording().getPeriodMeanPerSec(LLStatViewer::TEXTURE_KBIT));
LLAppViewer::getTextureFetch()->setTextureBandwidth(LLTrace::get_frame_recording().getPeriodMeanPerSec(LLStatViewer::TEXTURE_NETWORK_DATA_RECEIVED));
{
using namespace LLStatViewer;
@ -1374,7 +1374,7 @@ void LLViewerTextureList::receiveImageHeader(LLMessageSystem *msg, void **user_d
{
received_size = msg->getReceiveSize() ;
}
add(LLStatViewer::TEXTURE_KBIT, LLUnit<F64, LLUnits::Bytes>(received_size));
add(LLStatViewer::TEXTURE_NETWORK_DATA_RECEIVED, LLUnit<F64, LLUnits::Bytes>(received_size));
add(LLStatViewer::TEXTURE_PACKETS, 1);
U8 codec;
@ -1448,7 +1448,7 @@ void LLViewerTextureList::receiveImagePacket(LLMessageSystem *msg, void **user_d
received_size = msg->getReceiveSize() ;
}
add(LLStatViewer::TEXTURE_KBIT, LLUnit<F64, LLUnits::Bytes>(received_size));
add(LLStatViewer::TEXTURE_NETWORK_DATA_RECEIVED, LLUnit<F64, LLUnits::Bytes>(received_size));
add(LLStatViewer::TEXTURE_PACKETS, 1);
//llprintline("Start decode, image header...");

View File

@ -215,6 +215,7 @@
// Globals
//
void render_ui(F32 zoom_factor = 1.f, int subfield = 0);
void swap();
extern BOOL gDebugClicks;
extern BOOL gDisplaySwapBuffers;
@ -4405,6 +4406,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
// Required for showing the GUI in snapshots and performing bloom composite overlay
// Call even if show_ui is FALSE
render_ui(scale_factor, subfield);
swap();
}
for (U32 out_y = 0; out_y < read_height ; out_y++)

View File

@ -732,9 +732,9 @@ void LLWorld::updateNetStats()
LLUnit<F64, LLUnits::Bits> actual_in_bits = gMessageSystem->mPacketRing.getAndResetActualInBits();
LLUnit<F64, LLUnits::Bits> actual_out_bits = gMessageSystem->mPacketRing.getAndResetActualOutBits();
add(LLStatViewer::ACTUAL_IN_KBIT, actual_in_bits);
add(LLStatViewer::ACTUAL_OUT_KBIT, actual_out_bits);
add(LLStatViewer::KBIT, bits);
add(LLStatViewer::MESSAGE_SYSTEM_DATA_IN, actual_in_bits);
add(LLStatViewer::MESSAGE_SYSTEM_DATA_OUT, actual_out_bits);
add(LLStatViewer::ACTIVE_MESSAGE_DATA_RECEIVED, bits);
add(LLStatViewer::PACKETS_IN, packets_in);
add(LLStatViewer::PACKETS_OUT, packets_out);
add(LLStatViewer::PACKETS_LOST, packets_lost);
@ -743,8 +743,8 @@ void LLWorld::updateNetStats()
sample(LLStatViewer::PACKETS_LOST_PERCENT, LLUnits::Ratio::fromValue((F32)packets_lost/(F32)packets_in));
}
mLastPacketsIn = gMessageSystem->mPacketsIn;
mLastPacketsOut = gMessageSystem->mPacketsOut;
mLastPacketsIn = gMessageSystem->mPacketsIn;
mLastPacketsOut = gMessageSystem->mPacketsOut;
mLastPacketsLost = gMessageSystem->mDroppedPackets;
}

View File

@ -45,10 +45,10 @@
unit_scale="100"
precision="0"/>
<stat_bar name="bandwidth"
label="Bandwidth"
label="UDP Data Received"
orientation="horizontal"
unit_label="kbps"
stat="kbitstat"
stat="activemessagedatareceived"
bar_max="5000"
tick_spacing="500"
precision="0"/>
@ -159,55 +159,55 @@
tick_spacing="128.f"
precision="1"
show_bar="false"/>
<stat_bar name="objectkbitstat"
<stat_bar name="objectdatareceived"
label="Objects"
orientation="horizontal"
stat="objectkbitstat"
stat="objectdatareceived"
unit_label="kbps"
bar_max="1024.f"
tick_spacing="128.f"
precision="1"
show_bar="false"/>
<stat_bar name="texturekbitstat"
<stat_bar name="texturedatareceived"
label="Texture"
orientation="horizontal"
stat="texturekbitstat"
stat="texturedatareceived"
unit_label="kbps"
bar_max="1024.f"
tick_spacing="128.f"
precision="1"
show_bar="false"/>
<stat_bar name="assetkbitstat"
<stat_bar name="assetudpdatareceived"
label="Asset"
orientation="horizontal"
stat="assetkbitstat"
stat="assetudpdatareceived"
unit_label="kbps"
bar_max="1024.f"
tick_spacing="128.f"
precision="1"
show_bar="false"/>
<stat_bar name="layerskbitstat"
<stat_bar name="layersdatareceived"
label="Layers"
orientation="horizontal"
stat="layerskbitstat"
stat="layersdatareceived"
unit_label="kbps"
bar_max="1024.f"
tick_spacing="128.f"
precision="1"
show_bar="false"/>
<stat_bar name="actualinkbitstat"
<stat_bar name="messagedatain"
label="Actual In"
orientation="horizontal"
stat="actualinkbitstat"
stat="messagedatain"
unit_label="kbps"
bar_max="1024.f"
tick_spacing="128.f"
precision="1"
show_bar="false"/>
<stat_bar name="actualoutkbitstat"
<stat_bar name="messagedataout"
label="Actual Out"
orientation="horizontal"
stat="actualoutkbitstat"
stat="messagedataout"
unit_label="kbps"
bar_max="1024.f"
tick_spacing="128.f"

View File

@ -37,9 +37,9 @@
decimal_digits="1"
show_bar="true"
show_history="true"/>
<!-- <stat_bar name="bandwidth"
label="Bandwidth"
stat="Bandwidth"
<stat_bar name="bandwidth"
label="UDP Data Received"
stat="activemessagedatareceived"
show_bar="true"/>
<stat_bar name="packet_loss"
label="Packet Loss"
@ -135,29 +135,29 @@
label="Packets Out"
stat="packetsoutstat"
decimal_digits="1"/>
<stat_bar name="objectkbitstat"
<stat_bar name="objectdatareceived"
label="Objects"
stat="objectkbitstat"
stat="objectdatareceived"
decimal_digits="1"/>
<stat_bar name="texturekbitstat"
<stat_bar name="texturedatareceived"
label="Texture"
stat="texturekbitstat"
stat="texturedatareceived"
decimal_digits="1"/>
<stat_bar name="assetkbitstat"
<stat_bar name="assetudpdatareceived"
label="Asset"
stat="assetkbitstat"
stat="assetudpdatareceived"
decimal_digits="1"/>
<stat_bar name="layerskbitstat"
<stat_bar name="layersdatareceived"
label="Layers"
stat="layerskbitstat"
stat="layersdatareceived"
decimal_digits="1"/>
<stat_bar name="actualinkbitstat"
<stat_bar name="messagedatain"
label="Actual In"
stat="actualinkbitstat"
stat="messagedatain"
decimal_digits="1"/>
<stat_bar name="actualoutkbitstat"
<stat_bar name="messagedataout"
label="Actual Out"
stat="actualoutkbitstat"
stat="messagedataout"
decimal_digits="1"
show_history="false"/>
<stat_bar name="vfspendingoperations"
@ -336,7 +336,7 @@
stat="simpumpiomsec"
decimal_digits="3"/>
</stat_view>
</stat_view>-->
</stat_view>
</stat_view>
</container_view>
</scroll_container>