llfloaterlagmeter.cpp

Go to the documentation of this file.
00001 
00032 #include "llviewerprecompiledheaders.h"
00033 
00034 #include "llfloaterlagmeter.h"
00035 
00036 #include "lluictrlfactory.h"
00037 #include "llviewerstats.h"
00038 #include "llviewerimage.h"
00039 #include "llviewercontrol.h"
00040 #include "llappviewer.h"
00041 
00042 #include "lltexturefetch.h"
00043 
00044 #include "llbutton.h"
00045 #include "llfocusmgr.h"
00046 #include "lltextbox.h"
00047 
00048 const LLString LAG_CRITICAL_IMAGE_NAME = "lag_status_critical.tga";
00049 const LLString LAG_WARNING_IMAGE_NAME  = "lag_status_warning.tga";
00050 const LLString LAG_GOOD_IMAGE_NAME     = "lag_status_good.tga";
00051 
00052 LLFloaterLagMeter::LLFloaterLagMeter(const LLSD& key)
00053         :       LLFloater("floater_lagmeter")
00054 {
00055         LLUICtrlFactory::getInstance()->buildFloater(this, "floater_lagmeter.xml");
00056 
00057         // Don't let this window take keyboard focus -- it's confusing to
00058         // lose arrow-key driving when testing lag.
00059         setIsChrome(TRUE);
00060 
00061         mClientButton = getChild<LLButton>("client_lagmeter");
00062         mClientText = getChild<LLTextBox>("client_text");
00063         mClientCause = getChild<LLTextBox>("client_lag_cause");
00064 
00065         mNetworkButton = getChild<LLButton>("network_lagmeter");
00066         mNetworkText = getChild<LLTextBox>("network_text");
00067         mNetworkCause = getChild<LLTextBox>("network_lag_cause");
00068 
00069         mServerButton = getChild<LLButton>("server_lagmeter");
00070         mServerText = getChild<LLTextBox>("server_text");
00071         mServerCause = getChild<LLTextBox>("server_lag_cause");
00072 
00073         LLString config_string = getString("client_frame_rate_critical_fps", mStringArgs);
00074         mClientFrameTimeCritical = 1.0f / (float)atof( config_string.c_str() );
00075         config_string = getString("client_frame_rate_warning_fps", mStringArgs);
00076         mClientFrameTimeWarning = 1.0f / (float)atof( config_string.c_str() );
00077 
00078         config_string = getString("network_packet_loss_critical_pct", mStringArgs);
00079         mNetworkPacketLossCritical = (float)atof( config_string.c_str() );
00080         config_string = getString("network_packet_loss_warning_pct", mStringArgs);
00081         mNetworkPacketLossWarning = (float)atof( config_string.c_str() );
00082 
00083         config_string = getString("network_ping_critical_ms", mStringArgs);
00084         mNetworkPingCritical = (float)atof( config_string.c_str() );
00085         config_string = getString("network_ping_warning_ms", mStringArgs);
00086         mNetworkPingWarning = (float)atof( config_string.c_str() );
00087         config_string = getString("server_frame_rate_critical_fps", mStringArgs);
00088 
00089         mServerFrameTimeCritical = 1000.0f / (float)atof( config_string.c_str() );
00090         config_string = getString("server_frame_rate_warning_fps", mStringArgs);
00091         mServerFrameTimeWarning = 1000.0f / (float)atof( config_string.c_str() );
00092         config_string = getString("server_single_process_max_time_ms", mStringArgs);
00093         mServerSingleProcessMaxTime = (float)atof( config_string.c_str() );
00094 
00095         mShrunk = false;
00096         config_string = getString("max_width_px", mStringArgs);
00097         mMaxWidth = atoi( config_string.c_str() );
00098         config_string = getString("min_width_px", mStringArgs);
00099         mMinWidth = atoi( config_string.c_str() );
00100 
00101         mStringArgs["[CLIENT_FRAME_RATE_CRITICAL]"] = getString("client_frame_rate_critical_fps");
00102         mStringArgs["[CLIENT_FRAME_RATE_CRITICAL]"] = getString("client_frame_rate_critical_fps");
00103         mStringArgs["[CLIENT_FRAME_RATE_WARNING]"] = getString("client_frame_rate_warning_fps");
00104 
00105         mStringArgs["[NETWORK_PACKET_LOSS_CRITICAL]"] = getString("network_packet_loss_critical_pct");
00106         mStringArgs["[NETWORK_PACKET_LOSS_CRITICAL]"] = getString("network_packet_loss_critical_pct");
00107         mStringArgs["[NETWORK_PACKET_LOSS_WARNING]"] = getString("network_packet_loss_warning_pct");
00108 
00109         mStringArgs["[NETWORK_PING_CRITICAL]"] = getString("network_ping_critical_ms");
00110         mStringArgs["[NETWORK_PING_CRITICAL]"] = getString("network_ping_critical_ms");
00111         mStringArgs["[NETWORK_PING_WARNING]"] = getString("network_ping_warning_ms");
00112 
00113         mStringArgs["[SERVER_FRAME_RATE_CRITICAL]"] = getString("server_frame_rate_critical_fps");
00114         mStringArgs["[SERVER_FRAME_RATE_CRITICAL]"] = getString("server_frame_rate_critical_fps");
00115         mStringArgs["[SERVER_FRAME_RATE_WARNING]"] = getString("server_frame_rate_warning_fps");
00116 
00117         childSetAction("minimize", onClickShrink, this);
00118 
00119         // were we shrunk last time?
00120         if (gSavedSettings.getBOOL("LagMeterShrunk"))
00121         {
00122                 onClickShrink(this);
00123         }
00124 }
00125 
00126 LLFloaterLagMeter::~LLFloaterLagMeter()
00127 {
00128         // save shrunk status for next time
00129         gSavedSettings.setBOOL("LagMeterShrunk", mShrunk);
00130         // expand so we save the large window rectangle
00131         if (mShrunk)
00132         {
00133                 onClickShrink(this);
00134         }
00135 }
00136 
00137 void LLFloaterLagMeter::draw()
00138 {
00139         determineClient();
00140         determineNetwork();
00141         determineServer();
00142 
00143         LLFloater::draw();
00144 }
00145 
00146 void LLFloaterLagMeter::determineClient()
00147 {
00148         F32 client_frame_time = LLViewerStats::getInstance()->mFPSStat.getMeanDuration();
00149         bool find_cause = false;
00150 
00151         if (!gFocusMgr.getAppHasFocus())
00152         {
00153                 mClientButton->setImageUnselected(LAG_GOOD_IMAGE_NAME);
00154                 mClientText->setText( getString("client_frame_time_window_bg_msg", mStringArgs) );
00155                 mClientCause->setText( LLString::null );
00156         }
00157         else if(client_frame_time >= mClientFrameTimeCritical)
00158         {
00159                 mClientButton->setImageUnselected(LAG_CRITICAL_IMAGE_NAME);
00160                 mClientText->setText( getString("client_frame_time_critical_msg", mStringArgs) );
00161                 find_cause = true;
00162         }
00163         else if(client_frame_time >= mClientFrameTimeWarning)
00164         {
00165                 mClientButton->setImageUnselected(LAG_WARNING_IMAGE_NAME);
00166                 mClientText->setText( getString("client_frame_time_warning_msg", mStringArgs) );
00167                 find_cause = true;
00168         }
00169         else
00170         {
00171                 mClientButton->setImageUnselected(LAG_GOOD_IMAGE_NAME);
00172                 mClientText->setText( getString("client_frame_time_normal_msg", mStringArgs) );
00173                 mClientCause->setText( LLString::null );
00174         }       
00175 
00176         if(find_cause)
00177         {
00178                 if(gSavedSettings.getF32("RenderFarClip") > 128)
00179                 {
00180                         mClientCause->setText( getString("client_draw_distance_cause_msg", mStringArgs) );
00181                 }
00182                 else if(LLAppViewer::instance()->getTextureFetch()->getNumRequests() > 2)
00183                 {
00184                         mClientCause->setText( getString("client_texture_loading_cause_msg", mStringArgs) );
00185                 }
00186                 else if(LLViewerImage::sBoundTextureMemory > LLViewerImage::sMaxBoundTextureMem)
00187                 {
00188                         mClientCause->setText( getString("client_texture_memory_cause_msg", mStringArgs) );
00189                 }
00190                 else 
00191                 {
00192                         mClientCause->setText( getString("client_complex_objects_cause_msg", mStringArgs) );
00193                 }
00194         }
00195 }
00196 
00197 void LLFloaterLagMeter::determineNetwork()
00198 {
00199         F32 packet_loss = LLViewerStats::getInstance()->mPacketsLostPercentStat.getMean();
00200         F32 ping_time = LLViewerStats::getInstance()->mSimPingStat.getMean();
00201         bool find_cause_loss = false;
00202         bool find_cause_ping = false;
00203 
00204         if(packet_loss >= mNetworkPacketLossCritical)
00205         {
00206                 mNetworkButton->setImageUnselected(LAG_CRITICAL_IMAGE_NAME);
00207                 mNetworkText->setText( getString("network_packet_loss_critical_msg", mStringArgs) );
00208                 find_cause_loss = true;
00209         }
00210         else if(ping_time >= mNetworkPingCritical)
00211         {
00212                 mNetworkButton->setImageUnselected(LAG_CRITICAL_IMAGE_NAME);
00213                 mNetworkText->setText( getString("network_ping_critical_msg", mStringArgs) );
00214                 find_cause_ping = true;
00215         }
00216         else if(packet_loss >= mNetworkPacketLossWarning)
00217         {
00218                 mNetworkButton->setImageUnselected(LAG_WARNING_IMAGE_NAME);
00219                 mNetworkText->setText( getString("network_packet_loss_warning_msg", mStringArgs) );
00220                 find_cause_loss = true;
00221         }
00222         else if(ping_time >= mNetworkPingWarning)
00223         {
00224                 mNetworkButton->setImageUnselected(LAG_WARNING_IMAGE_NAME);
00225                 mNetworkText->setText( getString("network_ping_warning_msg", mStringArgs) );
00226                 find_cause_ping = true;
00227         }
00228         else
00229         {
00230                 mNetworkButton->setImageUnselected(LAG_GOOD_IMAGE_NAME);
00231                 mNetworkText->setText( getString("network_performance_normal_msg", mStringArgs) );
00232         }
00233 
00234         if(find_cause_loss)
00235         {
00236                 mNetworkCause->setText( getString("network_packet_loss_cause_msg", mStringArgs) );
00237         }
00238         else if(find_cause_ping)
00239         {
00240                 mNetworkCause->setText( getString("network_ping_cause_msg", mStringArgs) );
00241         }
00242         else
00243         {
00244                 mNetworkCause->setText( LLString::null );
00245         }
00246 }
00247 
00248 void LLFloaterLagMeter::determineServer()
00249 {
00250         F32 sim_frame_time = LLViewerStats::getInstance()->mSimFrameMsec.getCurrent();
00251         bool find_cause = false;
00252 
00253         if(sim_frame_time >= mServerFrameTimeCritical)
00254         {
00255                 mServerButton->setImageUnselected(LAG_CRITICAL_IMAGE_NAME);
00256                 mServerText->setText( getString("server_frame_time_critical_msg", mStringArgs) );
00257                 find_cause = true;
00258         }
00259         else if(sim_frame_time >= mServerFrameTimeWarning)
00260         {
00261                 mServerButton->setImageUnselected(LAG_WARNING_IMAGE_NAME);
00262                 mServerText->setText( getString("server_frame_time_warning_msg", mStringArgs) );
00263                 find_cause = true;
00264         }
00265         else
00266         {
00267                 mServerButton->setImageUnselected(LAG_GOOD_IMAGE_NAME);
00268                 mServerText->setText( getString("server_frame_time_normal_msg", mStringArgs) );
00269                 mServerCause->setText( LLString::null );
00270         }       
00271 
00272         if(find_cause)
00273         {
00274                 if(LLViewerStats::getInstance()->mSimSimPhysicsMsec.getCurrent() > mServerSingleProcessMaxTime)
00275                 {
00276                         mServerCause->setText( getString("server_physics_cause_msg", mStringArgs) );
00277                 }
00278                 else if(LLViewerStats::getInstance()->mSimScriptMsec.getCurrent() > mServerSingleProcessMaxTime)
00279                 {
00280                         mServerCause->setText( getString("server_scripts_cause_msg", mStringArgs) );
00281                 }
00282                 else if(LLViewerStats::getInstance()->mSimNetMsec.getCurrent() > mServerSingleProcessMaxTime)
00283                 {
00284                         mServerCause->setText( getString("server_net_cause_msg", mStringArgs) );
00285                 }
00286                 else if(LLViewerStats::getInstance()->mSimAgentMsec.getCurrent() > mServerSingleProcessMaxTime)
00287                 {
00288                         mServerCause->setText( getString("server_agent_cause_msg", mStringArgs) );
00289                 }
00290                 else if(LLViewerStats::getInstance()->mSimImagesMsec.getCurrent() > mServerSingleProcessMaxTime)
00291                 {
00292                         mServerCause->setText( getString("server_images_cause_msg", mStringArgs) );
00293                 }
00294                 else
00295                 {
00296                         mServerCause->setText( getString("server_generic_cause_msg", mStringArgs) );
00297                 }
00298         }
00299 }
00300 
00301 //static
00302 void LLFloaterLagMeter::onClickShrink(void * data)
00303 {
00304         LLFloaterLagMeter * self = (LLFloaterLagMeter*)data;
00305 
00306         LLButton * button = self->getChild<LLButton>("minimize");
00307         S32 delta_width = self->mMaxWidth - self->mMinWidth;
00308         LLRect r = self->getRect();
00309         if(self->mShrunk)
00310         {
00311                 self->setTitle( self->getString("max_title_msg", self->mStringArgs) );
00312                 // make left edge appear to expand
00313                 r.translate(-delta_width, 0);
00314                 self->setRect(r);
00315                 self->reshape(self->mMaxWidth, self->getRect().getHeight());
00316                 
00317                 self->childSetText("client", self->getString("client_text_msg", self->mStringArgs) + ":");
00318                 self->childSetText("network", self->getString("network_text_msg", self->mStringArgs) + ":");
00319                 self->childSetText("server", self->getString("server_text_msg", self->mStringArgs) + ":");
00320 
00321                 // usually "<<"
00322                 button->setLabel( self->getString("smaller_label", self->mStringArgs) );
00323         }
00324         else
00325         {
00326                 self->setTitle( self->getString("min_title_msg", self->mStringArgs) );
00327                 // make left edge appear to collapse
00328                 r.translate(delta_width, 0);
00329                 self->setRect(r);
00330                 self->reshape(self->mMinWidth, self->getRect().getHeight());
00331                 
00332                 self->childSetText("client", self->getString("client_text_msg", self->mStringArgs) );
00333                 self->childSetText("network", self->getString("network_text_msg", self->mStringArgs) );
00334                 self->childSetText("server", self->getString("server_text_msg", self->mStringArgs) );
00335 
00336                 // usually ">>"
00337                 button->setLabel( self->getString("bigger_label", self->mStringArgs) );
00338         }
00339         // Don't put keyboard focus on the button
00340         button->setFocus(FALSE);
00341 
00342         self->mClientText->setVisible(self->mShrunk);
00343         self->mClientCause->setVisible(self->mShrunk);
00344         self->childSetVisible("client_help", self->mShrunk);
00345 
00346         self->mNetworkText->setVisible(self->mShrunk);
00347         self->mNetworkCause->setVisible(self->mShrunk);
00348         self->childSetVisible("network_help", self->mShrunk);
00349 
00350         self->mServerText->setVisible(self->mShrunk);
00351         self->mServerCause->setVisible(self->mShrunk);
00352         self->childSetVisible("server_help", self->mShrunk);
00353 
00354         self->mShrunk = !self->mShrunk;
00355 }

Generated on Fri May 16 08:33:28 2008 for SecondLife by  doxygen 1.5.5