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
00058
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
00120 if (gSavedSettings.getBOOL("LagMeterShrunk"))
00121 {
00122 onClickShrink(this);
00123 }
00124 }
00125
00126 LLFloaterLagMeter::~LLFloaterLagMeter()
00127 {
00128
00129 gSavedSettings.setBOOL("LagMeterShrunk", mShrunk);
00130
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
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
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
00322 button->setLabel( self->getString("smaller_label", self->mStringArgs) );
00323 }
00324 else
00325 {
00326 self->setTitle( self->getString("min_title_msg", self->mStringArgs) );
00327
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
00337 button->setLabel( self->getString("bigger_label", self->mStringArgs) );
00338 }
00339
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 }