diff options
author | James Cook <james@lindenlab.com> | 2007-09-19 04:52:01 +0000 |
---|---|---|
committer | James Cook <james@lindenlab.com> | 2007-09-19 04:52:01 +0000 |
commit | baa51d59e1ea6653879079cd1393d7791d27e268 (patch) | |
tree | 348554fafe5a6d2b14aedb120ae3c30348c78118 | |
parent | e3d0761b5eb2ead6ccaa1bcd871b754c5e5ff65c (diff) |
svn merge -r 69906:69926 svn+ssh://svn.lindenlab.com/svn/linden/branches/lag-meter. Adds "Lag Meter" option to "Help" menu to give users more useful diagnostics when they see "laggy" behavior.
-rw-r--r-- | indra/newview/llfloaterlagmeter.cpp | 287 | ||||
-rw-r--r-- | indra/newview/llfloaterlagmeter.h | 55 | ||||
-rw-r--r-- | indra/newview/llviewermenu.cpp | 6 | ||||
-rw-r--r-- | indra/newview/llviewerwindow.cpp | 2 |
4 files changed, 350 insertions, 0 deletions
diff --git a/indra/newview/llfloaterlagmeter.cpp b/indra/newview/llfloaterlagmeter.cpp new file mode 100644 index 0000000000..cf50cf6190 --- /dev/null +++ b/indra/newview/llfloaterlagmeter.cpp @@ -0,0 +1,287 @@ +/** + * @file llfloaterlagmeter.cpp + * @brief The "Lag-o-Meter" floater used to tell users what is causing lag. + * + * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloaterlagmeter.h" + +#include "llvieweruictrlfactory.h" +#include "llviewerstats.h" +#include "llviewerimage.h" +#include "llviewercontrol.h" +#include "viewer.h" +#include "lltexturefetch.h" + +#include "llbutton.h" +#include "llfocusmgr.h" +#include "lltextbox.h" + +const LLString LAG_CRITICAL_IMAGE_NAME = "lag_status_critical.tga"; +const LLString LAG_WARNING_IMAGE_NAME = "lag_status_warning.tga"; +const LLString LAG_GOOD_IMAGE_NAME = "lag_status_good.tga"; + +LLFloaterLagMeter * LLFloaterLagMeter::sInstance = NULL; + +LLFloaterLagMeter::LLFloaterLagMeter() + : LLFloater("floater_lagmeter") +{ + gUICtrlFactory->buildFloater(this, "floater_lagmeter.xml"); + + mClientButton = LLUICtrlFactory::getButtonByName(this, "client_lagmeter"); + mClientText = LLUICtrlFactory::getTextBoxByName(this, "client_text"); + mClientCause = LLUICtrlFactory::getTextBoxByName(this, "client_lag_cause"); + + mNetworkButton = LLUICtrlFactory::getButtonByName(this, "network_lagmeter"); + mNetworkText = LLUICtrlFactory::getTextBoxByName(this, "network_text"); + mNetworkCause = LLUICtrlFactory::getTextBoxByName(this, "network_lag_cause"); + + mServerButton = LLUICtrlFactory::getButtonByName(this, "server_lagmeter"); + mServerText = LLUICtrlFactory::getTextBoxByName(this, "server_text"); + mServerCause = LLUICtrlFactory::getTextBoxByName(this, "server_lag_cause"); + + childSetFocus("client_help", TRUE); + + LLString config_string = childGetText("client_frame_rate_critical_fps"); + mClientFrameTimeCritical = 1.0f / (float)atof( config_string.c_str() ); + config_string = childGetText("client_frame_rate_warning_fps"); + mClientFrameTimeWarning = 1.0f / (float)atof( config_string.c_str() ); + + config_string = childGetText("network_packet_loss_critical_pct"); + mNetworkPacketLossCritical = (float)atof( config_string.c_str() ); + config_string = childGetText("network_packet_loss_warning_pct"); + mNetworkPacketLossWarning = (float)atof( config_string.c_str() ); + + config_string = childGetText("server_frame_rate_critical_fps"); + mServerFrameTimeCritical = 1000.0f / (float)atof( config_string.c_str() ); + config_string = childGetText("server_frame_rate_warning_fps"); + mServerFrameTimeWarning = 1000.0f / (float)atof( config_string.c_str() ); + config_string = childGetText("server_single_process_max_time_ms"); + mServerSingleProcessMaxTime = (float)atof( config_string.c_str() ); + + mMinimized = false; + config_string = childGetText("max_width_px"); + mMaxWidth = atoi( config_string.c_str() ); + config_string = childGetText("min_width_px"); + mMinWidth = atoi( config_string.c_str() ); + + childSetTextArg("client_frame_time_critical_msg", "[CLIENT_FRAME_RATE_CRITICAL]", childGetText("client_frame_rate_critical_fps")); + childSetTextArg("client_frame_time_warning_msg", "[CLIENT_FRAME_RATE_CRITICAL]", childGetText("client_frame_rate_critical_fps")); + childSetTextArg("client_frame_time_warning_msg", "[CLIENT_FRAME_RATE_WARNING]", childGetText("client_frame_rate_warning_fps")); + + childSetTextArg("network_packet_loss_critical_msg", "[NETWORK_PACKET_LOSS_CRITICAL]", childGetText("network_packet_loss_critical_pct")); + childSetTextArg("network_packet_loss_warning_msg", "[NETWORK_PACKET_LOSS_CRITICAL]", childGetText("network_packet_loss_critical_pct")); + childSetTextArg("network_packet_loss_warning_msg", "[NETWORK_PACKET_LOSS_WARNING]", childGetText("network_packet_loss_warning_pct")); + + childSetTextArg("server_frame_time_critical_msg", "[SERVER_FRAME_RATE_CRITICAL]", childGetText("server_frame_rate_critical_fps")); + childSetTextArg("server_frame_time_warning_msg", "[SERVER_FRAME_RATE_CRITICAL]", childGetText("server_frame_rate_critical_fps")); + childSetTextArg("server_frame_time_warning_msg", "[SERVER_FRAME_RATE_WARNING]", childGetText("server_frame_rate_warning_fps")); + + childSetAction("minimize", onClickShrink, this); +} + +LLFloaterLagMeter::~LLFloaterLagMeter() +{ + sInstance = NULL; +} + +void LLFloaterLagMeter::draw() +{ + determineClient(); + determineNetwork(); + determineServer(); + + LLFloater::draw(); +} + +//static +void LLFloaterLagMeter::show(void *data) +{ + if(!sInstance) sInstance = new LLFloaterLagMeter(); + sInstance->open(); +} + +void LLFloaterLagMeter::determineClient() +{ + F32 client_frame_time = gViewerStats->mFPSStat.getMeanDuration(); + bool find_cause = false; + + if (!gFocusMgr.getAppHasFocus()) + { + mClientButton->setImageUnselected(LAG_GOOD_IMAGE_NAME); + mClientText->setText( childGetText("client_frame_time_window_bg_msg") ); + mClientCause->setText( LLString::null ); + } + else if(client_frame_time >= mClientFrameTimeCritical) + { + mClientButton->setImageUnselected(LAG_CRITICAL_IMAGE_NAME); + mClientText->setText( childGetText("client_frame_time_critical_msg") ); + find_cause = true; + } + else if(client_frame_time >= mClientFrameTimeWarning) + { + mClientButton->setImageUnselected(LAG_WARNING_IMAGE_NAME); + mClientText->setText( childGetText("client_frame_time_warning_msg") ); + find_cause = true; + } + else + { + mClientButton->setImageUnselected(LAG_GOOD_IMAGE_NAME); + mClientText->setText( childGetText("client_frame_time_normal_msg") ); + mClientCause->setText( LLString::null ); + } + + if(find_cause) + { + if(gSavedSettings.getF32("RenderFarClip") > 128) + { + mClientCause->setText( childGetText("client_draw_distance_cause_msg") ); + } + else if(gTextureFetch->getNumRequests() > 2) + { + mClientCause->setText( childGetText("client_texture_loading_cause_msg") ); + } + else if(LLViewerImage::sBoundTextureMemory > LLViewerImage::sMaxBoundTextureMem) + { + mClientCause->setText( childGetText("client_texture_memory_cause_msg") ); + } + else + { + mClientCause->setText( childGetText("client_complex_objects_cause_msg") ); + } + } +} + +void LLFloaterLagMeter::determineNetwork() +{ + F32 packet_loss = gViewerStats->mPacketsLostPercentStat.getMean(); + bool find_cause = false; + + if(packet_loss >= mNetworkPacketLossCritical) + { + mNetworkButton->setImageUnselected(LAG_CRITICAL_IMAGE_NAME); + mNetworkText->setText( childGetText("network_packet_loss_critical_msg") ); + find_cause = true; + } + else if(packet_loss >= mNetworkPacketLossWarning) + { + mNetworkButton->setImageUnselected(LAG_WARNING_IMAGE_NAME); + mNetworkText->setText( childGetText("network_packet_loss_warning_msg") ); + find_cause = true; + } + else + { + mNetworkButton->setImageUnselected(LAG_GOOD_IMAGE_NAME); + mNetworkText->setText( childGetText("network_packet_loss_normal_msg") ); + mNetworkCause->setText( LLString::null ); + } + + if(find_cause) + { + mNetworkCause->setText( childGetText("network_cause_msg") ); + } +} + +void LLFloaterLagMeter::determineServer() +{ + F32 sim_frame_time = gViewerStats->mSimFrameMsec.getCurrent(); + bool find_cause = false; + + if(sim_frame_time >= mServerFrameTimeCritical) + { + mServerButton->setImageUnselected(LAG_CRITICAL_IMAGE_NAME); + mServerText->setText( childGetText("server_frame_time_critical_msg") ); + find_cause = true; + } + else if(sim_frame_time >= mServerFrameTimeWarning) + { + mServerButton->setImageUnselected(LAG_WARNING_IMAGE_NAME); + mServerText->setText( childGetText("server_frame_time_warning_msg") ); + find_cause = true; + } + else + { + mServerButton->setImageUnselected(LAG_GOOD_IMAGE_NAME); + mServerText->setText( childGetText("server_frame_time_normal_msg") ); + mServerCause->setText( LLString::null ); + } + + if(find_cause) + { + if(gViewerStats->mSimSimPhysicsMsec.getCurrent() > mServerSingleProcessMaxTime) + { + mServerCause->setText( childGetText("server_physics_cause_msg") ); + } + else if(gViewerStats->mSimScriptMsec.getCurrent() > mServerSingleProcessMaxTime) + { + mServerCause->setText( childGetText("server_scripts_cause_msg") ); + } + else if(gViewerStats->mSimNetMsec.getCurrent() > mServerSingleProcessMaxTime) + { + mServerCause->setText( childGetText("server_net_cause_msg") ); + } + else if(gViewerStats->mSimAgentMsec.getCurrent() > mServerSingleProcessMaxTime) + { + mServerCause->setText( childGetText("server_agent_cause_msg") ); + } + else if(gViewerStats->mSimImagesMsec.getCurrent() > mServerSingleProcessMaxTime) + { + mServerCause->setText( childGetText("server_images_cause_msg") ); + } + else + { + mServerCause->setText( childGetText("server_generic_cause_msg") ); + } + } +} + +//static +void LLFloaterLagMeter::onClickShrink(void * data) +{ + LLFloaterLagMeter * self = (LLFloaterLagMeter*)data; + + if(self->mMinimized) + { + self->setTitle( self->childGetText("max_title_msg") ); + self->reshape(self->mMaxWidth, self->getRect().getHeight()); + + self->childSetText("client", self->childGetText("client_text_msg") + ":"); + self->childSetText("network", self->childGetText("network_text_msg") + ":"); + self->childSetText("server", self->childGetText("server_text_msg") + ":"); + + LLButton * button = (LLButton*)self->getChildByName("minimize"); + // usually "<<" + button->setLabel( self->childGetText("smaller_label") ); + } + else + { + self->setTitle( self->childGetText("min_title_msg") ); + self->reshape(self->mMinWidth, self->getRect().getHeight()); + + self->childSetText("client", self->childGetText("client_text_msg") ); + self->childSetText("network", self->childGetText("network_text_msg") ); + self->childSetText("server", self->childGetText("server_text_msg") ); + + LLButton * button = (LLButton*)self->getChildByName("minimize"); + // usually ">>" + button->setLabel( self->childGetText("bigger_label") ); + } + + self->mClientText->setVisible(self->mMinimized); + self->mClientCause->setVisible(self->mMinimized); + self->childSetVisible("client_help", self->mMinimized); + + self->mNetworkText->setVisible(self->mMinimized); + self->mNetworkCause->setVisible(self->mMinimized); + self->childSetVisible("network_help", self->mMinimized); + + self->mServerText->setVisible(self->mMinimized); + self->mServerCause->setVisible(self->mMinimized); + self->childSetVisible("server_help", self->mMinimized); + + self->mMinimized = !self->mMinimized; +} diff --git a/indra/newview/llfloaterlagmeter.h b/indra/newview/llfloaterlagmeter.h new file mode 100644 index 0000000000..72766fec85 --- /dev/null +++ b/indra/newview/llfloaterlagmeter.h @@ -0,0 +1,55 @@ +/** + * @file llfloaterlagmeter.h + * @brief The "Lag-o-Meter" floater used to tell users what is causing lag. + * + * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + +#ifndef LLFLOATERLAGMETER_H +#define LLFLOATERLAGMETER_H + +#include "llfloater.h" + +class LLFloaterLagMeter : public LLFloater +{ +public: + /*virtual*/ void draw(); + static void show(void*); + +private: + LLFloaterLagMeter(); + /*virtual*/ ~LLFloaterLagMeter(); + + void determineClient(); + void determineNetwork(); + void determineServer(); + + static void onClickShrink(void * data); + + bool mMinimized; + S32 mMaxWidth, mMinWidth; + + F32 mClientFrameTimeCritical; + F32 mClientFrameTimeWarning; + LLButton * mClientButton; + LLTextBox * mClientText; + LLTextBox * mClientCause; + + F32 mNetworkPacketLossCritical; + F32 mNetworkPacketLossWarning; + LLButton * mNetworkButton; + LLTextBox * mNetworkText; + LLTextBox * mNetworkCause; + + F32 mServerFrameTimeCritical; + F32 mServerFrameTimeWarning; + F32 mServerSingleProcessMaxTime; + LLButton * mServerButton; + LLTextBox * mServerText; + LLTextBox * mServerCause; + + static LLFloaterLagMeter * sInstance; +}; + +#endif diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 21a334e70b..c242d855f1 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -85,6 +85,7 @@ #include "llfloaterhtmlhelp.h" #include "llfloaterhtmlfind.h" #include "llfloaterinspect.h" +#include "llfloaterlagmeter.h" #include "llfloaterland.h" #include "llfloaterlandholdings.h" #include "llfloatermap.h" @@ -5514,6 +5515,10 @@ class LLShowFloater : public view_listener_t LLFloaterBump::show(NULL); } } + else if (floater_name == "lag meter") + { + LLFloaterLagMeter::show(NULL); + } else if (floater_name == "bug reporter") { // Prevent menu from appearing in screen shot. @@ -7760,6 +7765,7 @@ void initialize_menus() // Help menu addMenu(new LLHelpMOTD(), "Help.MOTD"); + // most items use the ShowFloater method // Self pie menu addMenu(new LLSelfStandUp(), "Self.StandUp"); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index b19b676fd6..897831afc0 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1800,6 +1800,8 @@ void LLViewerWindow::adjustRectanglesForFirstUse(const LLRect& window) adjust_rect_top_right("FloaterMapRect", window); + adjust_rect_top_right("FloaterLagMeter", window); + adjust_rect_top_left("FloaterBuildOptionsRect", window); // bottom-right |