From 0dce88bc92cfb1ebebb575087ca950a6d5363c0c Mon Sep 17 00:00:00 2001 From: Dave SIMmONs Date: Fri, 19 Nov 2010 16:49:24 -0800 Subject: ER-330 : Improve ObjectUpdateCached message packing. Added some viewer metrics, will disable later. --- indra/newview/llviewerobjectlist.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'indra/newview/llviewerobjectlist.cpp') diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index f5a32438cf..d14fd69348 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -56,6 +56,7 @@ #include "llresmgr.h" #include "llviewerregion.h" #include "llviewerstats.h" +#include "llviewerstatsrecorder.h" #include "llvoavatarself.h" #include "lltoolmgr.h" #include "lltoolpie.h" @@ -345,7 +346,13 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, U8 compressed_dpbuffer[2048]; LLDataPackerBinaryBuffer compressed_dp(compressed_dpbuffer, 2048); LLDataPacker *cached_dpp = NULL; - + +#if LL_RECORD_VIEWER_STATS + static LLViewerStatsRecorder stats_recorder; + stats_recorder.initStatsRecorder(regionp); + stats_recorder.initCachedObjectUpdate(regionp); +#endif + for (i = 0; i < num_objects; i++) { LLTimer update_timer; @@ -369,6 +376,10 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, } else { + #if LL_RECORD_VIEWER_STATS + stats_recorder.recordCachedObjectEvent(regionp, id, NULL); + #endif + continue; // no data packer, skip this object } } @@ -540,6 +551,10 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { objectp->mLocalID = local_id; processUpdateCore(objectp, user_data, i, update_type, cached_dpp, justCreated); + + #if LL_RECORD_VIEWER_STATS + stats_recorder.recordCachedObjectEvent(regionp, local_id, objectp); + #endif } else { @@ -551,6 +566,10 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, } } +#if LL_RECORD_VIEWER_STATS + stats_recorder.closeCachedObjectUpdate(regionp); +#endif + LLVOAvatar::cullAvatarsByPixelArea(); } -- cgit v1.3 From 03b68dad4bb6da4fa6ca7dcd05af91cfc96b4e31 Mon Sep 17 00:00:00 2001 From: Don Kjer Date: Thu, 9 Dec 2010 20:02:36 -0800 Subject: Expanded viewer stats recorder metrics to include all object update types --- indra/newview/llviewerobjectlist.cpp | 75 +++++++++++++++++++++------------ indra/newview/llviewerstatsrecorder.cpp | 63 ++++++++++++++++++++------- indra/newview/llviewerstatsrecorder.h | 11 +++-- 3 files changed, 105 insertions(+), 44 deletions(-) (limited to 'indra/newview/llviewerobjectlist.cpp') diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index d14fd69348..5a42f10c8f 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -303,8 +303,10 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, // have to transform to absolute coordinates. num_objects = mesgsys->getNumberOfBlocksFast(_PREHASH_ObjectData); + // I don't think this case is ever hit. TODO* Test this. if (!cached && !compressed && update_type != OUT_FULL) { + llinfos << "TEST: !cached && !compressed && update_type != OUT_FULL" << llendl; gTerseObjectUpdates += num_objects; S32 size; if (mesgsys->getReceiveCompressedSize()) @@ -315,7 +317,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { size = mesgsys->getReceiveSize(); } - // llinfos << "Received terse " << num_objects << " in " << size << " byte (" << size/num_objects << ")" << llendl; + llinfos << "Received terse " << num_objects << " in " << size << " byte (" << size/num_objects << ")" << llendl; } else { @@ -349,12 +351,12 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, #if LL_RECORD_VIEWER_STATS static LLViewerStatsRecorder stats_recorder; - stats_recorder.initStatsRecorder(regionp); - stats_recorder.initCachedObjectUpdate(regionp); + stats_recorder.initObjectUpdateEvents(regionp); #endif for (i = 0; i < num_objects; i++) { + // timer is unused? LLTimer update_timer; BOOL justCreated = FALSE; @@ -369,6 +371,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, cached_dpp = regionp->getDP(id, crc); if (cached_dpp) { + // Cache Hit. cached_dpp->reset(); cached_dpp->unpackUUID(fullid, "ID"); cached_dpp->unpackU32(local_id, "LocalID"); @@ -376,8 +379,10 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, } else { + // Cache Miss. #if LL_RECORD_VIEWER_STATS - stats_recorder.recordCachedObjectEvent(regionp, id, NULL); + const BOOL success = TRUE; + stats_recorder.recordObjectUpdateEvent(regionp, id, update_type, success, NULL); #endif continue; // no data packer, skip this object @@ -391,13 +396,15 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, compressed_dp.reset(); U32 flags = 0; - if (update_type != OUT_TERSE_IMPROVED) + if (update_type != OUT_TERSE_IMPROVED) // OUT_FULL_COMPRESSED only? { mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_UpdateFlags, flags, i); } + // I don't think we ever use this flag from the server. DK 2010/12/09 if (flags & FLAGS_ZLIB_COMPRESSED) { + llinfos << "TEST: flags & FLAGS_ZLIB_COMPRESSED" << llendl; compressed_length = mesgsys->getSizeFast(_PREHASH_ObjectData, i, _PREHASH_Data); mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_Data, compbuffer, 0, i); uncompressed_length = 2048; @@ -413,7 +420,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, } - if (update_type != OUT_TERSE_IMPROVED) + if (update_type != OUT_TERSE_IMPROVED) // OUT_FULL_COMPRESSED only? { compressed_dp.unpackUUID(fullid, "ID"); compressed_dp.unpackU32(local_id, "LocalID"); @@ -433,7 +440,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, } } } - else if (update_type != OUT_FULL) + else if (update_type != OUT_FULL) // !compressed, !OUT_FULL ==> OUT_FULL_CACHED only? { mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, local_id, i); getUUIDFromLocal(fullid, @@ -446,7 +453,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, mNumUnknownUpdates++; } } - else + else // OUT_FULL only? { mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_FullID, fullid, i); mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, local_id, i); @@ -478,12 +485,12 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, gMessageSystem->getSenderPort()); if (objectp->mLocalID != local_id) - { // Update local ID in object with the one sent from the region + { // Update local ID in object with the one sent from the region objectp->mLocalID = local_id; } if (objectp->getRegion() != regionp) - { // Object changed region, so update it + { // Object changed region, so update it objectp->updateRegion(regionp); // for LLVOAvatar } } @@ -495,10 +502,14 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, if (update_type == OUT_TERSE_IMPROVED) { // llinfos << "terse update for an unknown object:" << fullid << llendl; + #if LL_RECORD_VIEWER_STATS + const BOOL success = FALSE; + stats_recorder.recordObjectUpdateEvent(regionp, local_id, update_type, success, NULL); + #endif continue; } } - else if (cached) + else if (cached) // Cache hit only? { } else @@ -506,6 +517,10 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, if (update_type != OUT_FULL) { // llinfos << "terse update for an unknown object:" << fullid << llendl; + #if LL_RECORD_VIEWER_STATS + const BOOL success = FALSE; + stats_recorder.recordObjectUpdateEvent(regionp, local_id, update_type, success, NULL); + #endif continue; } @@ -516,6 +531,10 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { mNumDeadObjectUpdates++; // llinfos << "update for a dead object:" << fullid << llendl; + #if LL_RECORD_VIEWER_STATS + const BOOL success = FALSE; + stats_recorder.recordObjectUpdateEvent(regionp, local_id, update_type, success, NULL); + #endif continue; } #endif @@ -523,6 +542,10 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, objectp = createObject(pcode, regionp, fullid, local_id, gMessageSystem->getSender()); if (!objectp) { + #if LL_RECORD_VIEWER_STATS + const BOOL success = FALSE; + stats_recorder.recordObjectUpdateEvent(regionp, local_id, update_type, success, NULL); + #endif continue; } justCreated = TRUE; @@ -537,24 +560,20 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, if (compressed) { - if (update_type != OUT_TERSE_IMPROVED) + if (update_type != OUT_TERSE_IMPROVED) // OUT_FULL_COMPRESSED only? { objectp->mLocalID = local_id; } processUpdateCore(objectp, user_data, i, update_type, &compressed_dp, justCreated); - if (update_type != OUT_TERSE_IMPROVED) + if (update_type != OUT_TERSE_IMPROVED) // OUT_FULL_COMPRESSED only? { objectp->mRegionp->cacheFullUpdate(objectp, compressed_dp); } } - else if (cached) + else if (cached) // Cache hit only? { objectp->mLocalID = local_id; processUpdateCore(objectp, user_data, i, update_type, cached_dpp, justCreated); - - #if LL_RECORD_VIEWER_STATS - stats_recorder.recordCachedObjectEvent(regionp, local_id, objectp); - #endif } else { @@ -564,10 +583,14 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, } processUpdateCore(objectp, user_data, i, update_type, NULL, justCreated); } + #if LL_RECORD_VIEWER_STATS + const BOOL success = TRUE; + stats_recorder.recordObjectUpdateEvent(regionp, local_id, update_type, success, objectp); + #endif } #if LL_RECORD_VIEWER_STATS - stats_recorder.closeCachedObjectUpdate(regionp); + stats_recorder.closeObjectUpdateEvents(regionp); #endif LLVOAvatar::cullAvatarsByPixelArea(); @@ -700,12 +723,12 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world) // update global timer F32 last_time = gFrameTimeSeconds; - U64 time = totalTime(); // this will become the new gFrameTime when the update is done + U64 time = totalTime(); // this will become the new gFrameTime when the update is done // Time _can_ go backwards, for example if the user changes the system clock. // It doesn't cause any fatal problems (just some oddness with stats), so we shouldn't assert here. // llassert(time > gFrameTime); F64 time_diff = U64_to_F64(time - gFrameTime)/(F64)SEC_TO_MICROSEC; - gFrameTime = time; + gFrameTime = time; F64 time_since_start = U64_to_F64(gFrameTime - gStartTime)/(F64)SEC_TO_MICROSEC; gFrameTimeSeconds = (F32)time_since_start; @@ -807,7 +830,7 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world) { std::string id_str; objectp->mID.toString(id_str); - std::string tmpstr = std::string("Par: ") + id_str; + std::string tmpstr = std::string("Par: ") + id_str; addDebugBeacon(objectp->getPositionAgent(), tmpstr, LLColor4(1.f,0.f,0.f,1.f), @@ -827,12 +850,12 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world) std::string tmpstr; if (objectp->getParent()) { - tmpstr = std::string("ChP: ") + id_str; + tmpstr = std::string("ChP: ") + id_str; text_color = LLColor4(0.f, 1.f, 0.f, 1.f); } else { - tmpstr = std::string("ChNoP: ") + id_str; + tmpstr = std::string("ChNoP: ") + id_str; text_color = LLColor4(1.f, 0.f, 0.f, 1.f); } id = sIndexAndLocalIDToUUID[oi.mParentInfo]; @@ -1538,8 +1561,8 @@ void LLViewerObjectList::findOrphans(LLViewerObject* objectp, U32 ip, U32 port) llinfos << "Agent: " << objectp->getPositionAgent() << llendl; addDebugBeacon(objectp->getPositionAgent(),""); #endif - gPipeline.markMoved(objectp->mDrawable); - objectp->setChanged(LLXform::MOVED | LLXform::SILHOUETTE); + gPipeline.markMoved(objectp->mDrawable); + objectp->setChanged(LLXform::MOVED | LLXform::SILHOUETTE); // Flag the object as no longer orphaned childp->mOrphaned = FALSE; diff --git a/indra/newview/llviewerstatsrecorder.cpp b/indra/newview/llviewerstatsrecorder.cpp index 83c115af90..1b80a2bc1c 100644 --- a/indra/newview/llviewerstatsrecorder.cpp +++ b/indra/newview/llviewerstatsrecorder.cpp @@ -59,10 +59,14 @@ void LLViewerStatsRecorder::initStatsRecorder(LLViewerRegion *regionp) if (mObjectCacheFile) { // Write column headers std::ostringstream data_msg; - data_msg << "Time, " - << "Hits, " - << "Misses, " - << "Objects " + data_msg << "EventTime, " + << "ProcessingTime, " + << "CacheHits, " + << "CacheMisses, " + << "FullUpdates, " + << "TerseUpdates, " + << "CacheMissResponses, " + << "TotalUpdates " << "\n"; fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile ); @@ -71,42 +75,71 @@ void LLViewerStatsRecorder::initStatsRecorder(LLViewerRegion *regionp) } -void LLViewerStatsRecorder::initCachedObjectUpdate(LLViewerRegion *regionp) +void LLViewerStatsRecorder::initObjectUpdateEvents(LLViewerRegion *regionp) { + initStatsRecorder(regionp); mObjectCacheHitCount = 0; mObjectCacheMissCount = 0; + mObjectFullUpdates = 0; + mObjectTerseUpdates = 0; + mObjectCacheMissResponses = 0; + mProcessingTime = LLTimer::getTotalTime(); } -void LLViewerStatsRecorder::recordCachedObjectEvent(LLViewerRegion *regionp, U32 local_id, LLViewerObject * objectp) +void LLViewerStatsRecorder::recordObjectUpdateEvent(LLViewerRegion *regionp, U32 local_id, const EObjectUpdateType update_type, BOOL success, LLViewerObject * objectp) { - if (objectp) + if (!objectp) { - mObjectCacheHitCount++; + // no object, must be a miss + mObjectCacheMissCount++; } else - { // no object, must be a miss - mObjectCacheMissCount++; + { + switch (update_type) + { + case OUT_FULL: + mObjectFullUpdates++; + break; + case OUT_TERSE_IMPROVED: + mObjectTerseUpdates++; + break; + case OUT_FULL_COMPRESSED: + mObjectCacheMissResponses++; + break; + case OUT_FULL_CACHED: + default: + mObjectCacheHitCount++; + break; + }; } } -void LLViewerStatsRecorder::closeCachedObjectUpdate(LLViewerRegion *regionp) +void LLViewerStatsRecorder::closeObjectUpdateEvents(LLViewerRegion *regionp) { - llinfos << "ILX: " << mObjectCacheHitCount - << " hits " - << mObjectCacheMissCount << " misses" + llinfos << "ILX: " + << mObjectCacheHitCount << " hits, " + << mObjectCacheMissCount << " misses, " + << mObjectFullUpdates << " full updates, " + << mObjectTerseUpdates << " terse updates, " + << mObjectCacheMissResponses << " cache miss responses" << llendl; - S32 total_objects = mObjectCacheHitCount + mObjectCacheMissCount; + S32 total_objects = mObjectCacheHitCount + mObjectCacheMissCount + mObjectFullUpdates + mObjectTerseUpdates + mObjectCacheMissResponses;; if (mObjectCacheFile != NULL && total_objects > 0) { std::ostringstream data_msg; F32 now32 = (F32) ((LLTimer::getTotalTime() - mStartTime) / 1000.0); + F32 processing32 = (F32) ((LLTimer::getTotalTime() - mProcessingTime) / 1000.0); data_msg << now32 + << ", " << processing32 << ", " << mObjectCacheHitCount << ", " << mObjectCacheMissCount + << ", " << mObjectFullUpdates + << ", " << mObjectTerseUpdates + << ", " << mObjectCacheMissResponses << ", " << total_objects << "\n"; diff --git a/indra/newview/llviewerstatsrecorder.h b/indra/newview/llviewerstatsrecorder.h index 0c5e6d5010..213d15f963 100644 --- a/indra/newview/llviewerstatsrecorder.h +++ b/indra/newview/llviewerstatsrecorder.h @@ -37,6 +37,7 @@ #if LL_RECORD_VIEWER_STATS #include "llframetimer.h" +#include "llviewerobject.h" class LLViewerRegion; class LLViewerObject; @@ -49,17 +50,21 @@ class LLViewerStatsRecorder void initStatsRecorder(LLViewerRegion *regionp); - void initCachedObjectUpdate(LLViewerRegion *regionp); - void recordCachedObjectEvent(LLViewerRegion *regionp, U32 local_id, LLViewerObject * objectp); - void closeCachedObjectUpdate(LLViewerRegion *regionp); + void initObjectUpdateEvents(LLViewerRegion *regionp); + void recordObjectUpdateEvent(LLViewerRegion *regionp, U32 local_id, const EObjectUpdateType update_type, BOOL success, LLViewerObject * objectp); + void closeObjectUpdateEvents(LLViewerRegion *regionp); private: LLFrameTimer mTimer; F64 mStartTime; + F64 mProcessingTime; LLFILE * mObjectCacheFile; // File to write data into S32 mObjectCacheHitCount; S32 mObjectCacheMissCount; + S32 mObjectFullUpdates; + S32 mObjectTerseUpdates; + S32 mObjectCacheMissResponses; }; #endif // LL_RECORD_VIEWER_STATS -- cgit v1.3 From f4884faf3a020a718c611f34aa534e80d8a8b666 Mon Sep 17 00:00:00 2001 From: Don Kjer Date: Mon, 13 Dec 2010 12:33:19 -0800 Subject: Expanded viewer stats recorder to include cache miss type, cache miss requests, and update failures --- indra/newview/llappviewer.cpp | 11 +++ indra/newview/llviewerobjectlist.cpp | 26 +++--- indra/newview/llviewerregion.cpp | 14 ++- indra/newview/llviewerregion.h | 9 +- indra/newview/llviewerstatsrecorder.cpp | 150 ++++++++++++++++++++++---------- indra/newview/llviewerstatsrecorder.h | 44 +++++++--- 6 files changed, 173 insertions(+), 81 deletions(-) (limited to 'indra/newview/llviewerobjectlist.cpp') diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 6c07974f69..5972e7aef8 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -44,6 +44,7 @@ #include "llagentwearables.h" #include "llwindow.h" #include "llviewerstats.h" +#include "llviewerstatsrecorder.h" #include "llmd5.h" #include "llpumpio.h" #include "llmimetypes.h" @@ -648,6 +649,10 @@ bool LLAppViewer::init() mAlloc.setProfilingEnabled(gSavedSettings.getBOOL("MemProfiling")); +#if LL_RECORD_VIEWER_STATS + LLViewerStatsRecorder::initClass(); +#endif + // *NOTE:Mani - LLCurl::initClass is not thread safe. // Called before threads are created. LLCurl::initClass(); @@ -950,6 +955,8 @@ bool LLAppViewer::init() LLAgentLanguage::init(); + + return true; } @@ -1665,6 +1672,10 @@ bool LLAppViewer::cleanup() } LLMetricPerformanceTesterBasic::cleanClass() ; +#if LL_RECORD_VIEWER_STATS + LLViewerStatsRecorder::cleanupClass(); +#endif + llinfos << "Cleaning up Media and Textures" << llendflush; //Note: diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 5a42f10c8f..249799bf55 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -350,8 +350,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, LLDataPacker *cached_dpp = NULL; #if LL_RECORD_VIEWER_STATS - static LLViewerStatsRecorder stats_recorder; - stats_recorder.initObjectUpdateEvents(regionp); + LLViewerStatsRecorder::instance()->beginObjectUpdateEvents(regionp); #endif for (i = 0; i < num_objects; i++) @@ -368,7 +367,8 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_CRC, crc, i); // Lookup data packer and add this id to cache miss lists if necessary. - cached_dpp = regionp->getDP(id, crc); + U8 cache_miss_type = LLViewerRegion::CACHE_MISS_TYPE_NONE; + cached_dpp = regionp->getDP(id, crc, cache_miss_type); if (cached_dpp) { // Cache Hit. @@ -381,8 +381,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { // Cache Miss. #if LL_RECORD_VIEWER_STATS - const BOOL success = TRUE; - stats_recorder.recordObjectUpdateEvent(regionp, id, update_type, success, NULL); + LLViewerStatsRecorder::instance()->recordCacheMissEvent(id, update_type, cache_miss_type); #endif continue; // no data packer, skip this object @@ -503,8 +502,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { // llinfos << "terse update for an unknown object:" << fullid << llendl; #if LL_RECORD_VIEWER_STATS - const BOOL success = FALSE; - stats_recorder.recordObjectUpdateEvent(regionp, local_id, update_type, success, NULL); + LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type); #endif continue; } @@ -518,8 +516,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { // llinfos << "terse update for an unknown object:" << fullid << llendl; #if LL_RECORD_VIEWER_STATS - const BOOL success = FALSE; - stats_recorder.recordObjectUpdateEvent(regionp, local_id, update_type, success, NULL); + LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type); #endif continue; } @@ -532,8 +529,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, mNumDeadObjectUpdates++; // llinfos << "update for a dead object:" << fullid << llendl; #if LL_RECORD_VIEWER_STATS - const BOOL success = FALSE; - stats_recorder.recordObjectUpdateEvent(regionp, local_id, update_type, success, NULL); + LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type); #endif continue; } @@ -543,8 +539,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, if (!objectp) { #if LL_RECORD_VIEWER_STATS - const BOOL success = FALSE; - stats_recorder.recordObjectUpdateEvent(regionp, local_id, update_type, success, NULL); + LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type); #endif continue; } @@ -584,13 +579,12 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, processUpdateCore(objectp, user_data, i, update_type, NULL, justCreated); } #if LL_RECORD_VIEWER_STATS - const BOOL success = TRUE; - stats_recorder.recordObjectUpdateEvent(regionp, local_id, update_type, success, objectp); + LLViewerStatsRecorder::instance()->recordObjectUpdateEvent(local_id, update_type, objectp); #endif } #if LL_RECORD_VIEWER_STATS - stats_recorder.closeObjectUpdateEvents(regionp); + LLViewerStatsRecorder::instance()->endObjectUpdateEvents(); #endif LLVOAvatar::cullAvatarsByPixelArea(); diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index ca07e7c4cf..da2373c39d 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -59,6 +59,7 @@ #include "llurldispatcher.h" #include "llviewerobjectlist.h" #include "llviewerparceloverlay.h" +#include "llviewerstatsrecorder.h" #include "llvlmanager.h" #include "llvlcomposition.h" #include "llvocache.h" @@ -1074,7 +1075,7 @@ void LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinary // Get data packer for this object, if we have cached data // AND the CRC matches. JC -LLDataPacker *LLViewerRegion::getDP(U32 local_id, U32 crc) +LLDataPacker *LLViewerRegion::getDP(U32 local_id, U32 crc, U8 &cache_miss_type) { llassert(mCacheLoaded); @@ -1087,17 +1088,20 @@ LLDataPacker *LLViewerRegion::getDP(U32 local_id, U32 crc) { // Record a hit entry->recordHit(); + cache_miss_type = CACHE_MISS_TYPE_NONE; return entry->getDP(crc); } else { // llinfos << "CRC miss for " << local_id << llendl; + cache_miss_type = CACHE_MISS_TYPE_CRC; mCacheMissCRC.put(local_id); } } else { // llinfos << "Cache miss for " << local_id << llendl; + cache_miss_type = CACHE_MISS_TYPE_FULL; mCacheMissFull.put(local_id); } return NULL; @@ -1119,9 +1123,6 @@ void LLViewerRegion::requestCacheMisses() S32 blocks = 0; S32 i; - const U8 CACHE_MISS_TYPE_FULL = 0; - const U8 CACHE_MISS_TYPE_CRC = 1; - // Send full cache miss updates. For these, we KNOW we don't // have a viewer object. for (i = 0; i < full_count; i++) @@ -1184,6 +1185,11 @@ void LLViewerRegion::requestCacheMisses() mCacheDirty = TRUE ; // llinfos << "KILLDEBUG Sent cache miss full " << full_count << " crc " << crc_count << llendl; + #if LL_RECORD_VIEWER_STATS + LLViewerStatsRecorder::instance()->beginObjectUpdateEvents(this); + LLViewerStatsRecorder::instance()->recordRequestCacheMissesEvent(full_count + crc_count); + LLViewerStatsRecorder::instance()->endObjectUpdateEvents(); + #endif } void LLViewerRegion::dumpCache() diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 8b71998f60..7fac2020ee 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -274,9 +274,16 @@ public: void getInfo(LLSD& info); + typedef enum + { + CACHE_MISS_TYPE_FULL = 0, + CACHE_MISS_TYPE_CRC, + CACHE_MISS_TYPE_NONE + } eCacheMissType; + // handle a full update message void cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp); - LLDataPacker *getDP(U32 local_id, U32 crc); + LLDataPacker *getDP(U32 local_id, U32 crc, U8 &cache_miss_type); void requestCacheMisses(); void addCacheMissFull(const U32 local_id); diff --git a/indra/newview/llviewerstatsrecorder.cpp b/indra/newview/llviewerstatsrecorder.cpp index 1b80a2bc1c..27bbc17b36 100644 --- a/indra/newview/llviewerstatsrecorder.cpp +++ b/indra/newview/llviewerstatsrecorder.cpp @@ -30,43 +30,73 @@ #include "llviewerregion.h" #include "llviewerobject.h" + +// To do - something using region name or global position +#if LL_WINDOWS + static const std::string STATS_FILE_NAME("C:\\ViewerObjectCacheStats.csv"); +#else + static const std::string STATS_FILE_NAME("/tmp/viewerstats.csv"); +#endif + + +LLViewerStatsRecorder* LLViewerStatsRecorder::sInstance = NULL; LLViewerStatsRecorder::LLViewerStatsRecorder() : mObjectCacheFile(NULL), - mTimer() + mTimer(), + mRegionp(NULL), + mStartTime(0.f), + mProcessingTime(0.f) { - mStartTime = LLTimer::getTotalTime(); + if (NULL != sInstance) + { + llerrs << "Attempted to create multiple instances of LLViewerStatsRecorder!" << llendl; + } + sInstance = this; + clearStats(); } LLViewerStatsRecorder::~LLViewerStatsRecorder() { - LLFile::close(mObjectCacheFile); - mObjectCacheFile = NULL; + if (mObjectCacheFile != NULL) + { + LLFile::close(mObjectCacheFile); + mObjectCacheFile = NULL; + } } +// static +void LLViewerStatsRecorder::initClass() +{ + sInstance = new LLViewerStatsRecorder(); +} -void LLViewerStatsRecorder::initStatsRecorder(LLViewerRegion *regionp) +// static +void LLViewerStatsRecorder::cleanupClass() { - // To do - something using region name or global position -#if LL_WINDOWS - std::string stats_file_name("C:\\ViewerObjectCacheStats.csv"); -#else - std::string stats_file_name("/tmp/viewerstats.csv"); -#endif + delete sInstance; + sInstance = NULL; +} + +void LLViewerStatsRecorder::initStatsRecorder(LLViewerRegion *regionp) +{ if (mObjectCacheFile == NULL) { - mObjectCacheFile = LLFile::fopen(stats_file_name, "wb"); + mStartTime = LLTimer::getTotalTime(); + mObjectCacheFile = LLFile::fopen(STATS_FILE_NAME, "wb"); if (mObjectCacheFile) { // Write column headers std::ostringstream data_msg; data_msg << "EventTime, " << "ProcessingTime, " << "CacheHits, " - << "CacheMisses, " + << "CacheFullMisses, " + << "CacheCrcMisses, " << "FullUpdates, " << "TerseUpdates, " + << "CacheMissRequests, " << "CacheMissResponses, " - << "TotalUpdates " + << "UpdateFailures" << "\n"; fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile ); @@ -74,58 +104,83 @@ void LLViewerStatsRecorder::initStatsRecorder(LLViewerRegion *regionp) } } - -void LLViewerStatsRecorder::initObjectUpdateEvents(LLViewerRegion *regionp) +void LLViewerStatsRecorder::beginObjectUpdateEvents(LLViewerRegion *regionp) { initStatsRecorder(regionp); + mRegionp = regionp; + mProcessingTime = LLTimer::getTotalTime(); + clearStats(); +} + +void LLViewerStatsRecorder::clearStats() +{ mObjectCacheHitCount = 0; - mObjectCacheMissCount = 0; + mObjectCacheMissFullCount = 0; + mObjectCacheMissCrcCount = 0; mObjectFullUpdates = 0; mObjectTerseUpdates = 0; + mObjectCacheMissRequests = 0; mObjectCacheMissResponses = 0; - mProcessingTime = LLTimer::getTotalTime(); + mObjectUpdateFailures = 0; } -void LLViewerStatsRecorder::recordObjectUpdateEvent(LLViewerRegion *regionp, U32 local_id, const EObjectUpdateType update_type, BOOL success, LLViewerObject * objectp) +void LLViewerStatsRecorder::recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type) +{ + mObjectUpdateFailures++; +} + +void LLViewerStatsRecorder::recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type) { - if (!objectp) + if (LLViewerRegion::CACHE_MISS_TYPE_FULL == cache_miss_type) { - // no object, must be a miss - mObjectCacheMissCount++; + mObjectCacheMissFullCount++; } else - { - switch (update_type) - { - case OUT_FULL: - mObjectFullUpdates++; - break; - case OUT_TERSE_IMPROVED: - mObjectTerseUpdates++; - break; - case OUT_FULL_COMPRESSED: - mObjectCacheMissResponses++; - break; - case OUT_FULL_CACHED: - default: - mObjectCacheHitCount++; - break; - }; + { + mObjectCacheMissCrcCount++; } } -void LLViewerStatsRecorder::closeObjectUpdateEvents(LLViewerRegion *regionp) +void LLViewerStatsRecorder::recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp) +{ + switch (update_type) + { + case OUT_FULL: + mObjectFullUpdates++; + break; + case OUT_TERSE_IMPROVED: + mObjectTerseUpdates++; + break; + case OUT_FULL_COMPRESSED: + mObjectCacheMissResponses++; + break; + case OUT_FULL_CACHED: + default: + mObjectCacheHitCount++; + break; + }; +} + +void LLViewerStatsRecorder::recordRequestCacheMissesEvent(S32 count) +{ + mObjectCacheMissRequests += count; +} + +void LLViewerStatsRecorder::endObjectUpdateEvents() { llinfos << "ILX: " << mObjectCacheHitCount << " hits, " - << mObjectCacheMissCount << " misses, " + << mObjectCacheMissFullCount << " full misses, " + << mObjectCacheMissCrcCount << " crc misses, " << mObjectFullUpdates << " full updates, " << mObjectTerseUpdates << " terse updates, " - << mObjectCacheMissResponses << " cache miss responses" + << mObjectCacheMissRequests << " cache miss requests, " + << mObjectCacheMissResponses << " cache miss responses, " + << mObjectUpdateFailures << " update failures" << llendl; - S32 total_objects = mObjectCacheHitCount + mObjectCacheMissCount + mObjectFullUpdates + mObjectTerseUpdates + mObjectCacheMissResponses;; + S32 total_objects = mObjectCacheHitCount + mObjectCacheMissCrcCount + mObjectCacheMissFullCount + mObjectFullUpdates + mObjectTerseUpdates + mObjectCacheMissRequests + mObjectCacheMissResponses + mObjectUpdateFailures; if (mObjectCacheFile != NULL && total_objects > 0) { @@ -136,18 +191,19 @@ void LLViewerStatsRecorder::closeObjectUpdateEvents(LLViewerRegion *regionp) data_msg << now32 << ", " << processing32 << ", " << mObjectCacheHitCount - << ", " << mObjectCacheMissCount + << ", " << mObjectCacheMissFullCount + << ", " << mObjectCacheMissCrcCount << ", " << mObjectFullUpdates << ", " << mObjectTerseUpdates + << ", " << mObjectCacheMissRequests << ", " << mObjectCacheMissResponses - << ", " << total_objects + << ", " << mObjectUpdateFailures << "\n"; fwrite(data_msg.str().c_str(), 1, data_msg.str().size(), mObjectCacheFile ); } - mObjectCacheHitCount = 0; - mObjectCacheMissCount = 0; + clearStats(); } diff --git a/indra/newview/llviewerstatsrecorder.h b/indra/newview/llviewerstatsrecorder.h index 213d15f963..001b8d9bd6 100644 --- a/indra/newview/llviewerstatsrecorder.h +++ b/indra/newview/llviewerstatsrecorder.h @@ -39,6 +39,7 @@ #include "llframetimer.h" #include "llviewerobject.h" +class LLMutex; class LLViewerRegion; class LLViewerObject; @@ -48,24 +49,41 @@ class LLViewerStatsRecorder LLViewerStatsRecorder(); ~LLViewerStatsRecorder(); + static void initClass(); + static void cleanupClass(); + static LLViewerStatsRecorder* instance() {return sInstance; } + void initStatsRecorder(LLViewerRegion *regionp); - void initObjectUpdateEvents(LLViewerRegion *regionp); - void recordObjectUpdateEvent(LLViewerRegion *regionp, U32 local_id, const EObjectUpdateType update_type, BOOL success, LLViewerObject * objectp); - void closeObjectUpdateEvents(LLViewerRegion *regionp); + void beginObjectUpdateEvents(LLViewerRegion *regionp); + void recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type); + void recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type); + void recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp); + void recordRequestCacheMissesEvent(S32 count); + void endObjectUpdateEvents(); private: - LLFrameTimer mTimer; - F64 mStartTime; - F64 mProcessingTime; - - LLFILE * mObjectCacheFile; // File to write data into - S32 mObjectCacheHitCount; - S32 mObjectCacheMissCount; - S32 mObjectFullUpdates; - S32 mObjectTerseUpdates; - S32 mObjectCacheMissResponses; + static LLViewerStatsRecorder* sInstance; + + LLFILE * mObjectCacheFile; // File to write data into + LLFrameTimer mTimer; + LLViewerRegion* mRegionp; + F64 mStartTime; + F64 mProcessingTime; + + S32 mObjectCacheHitCount; + S32 mObjectCacheMissFullCount; + S32 mObjectCacheMissCrcCount; + S32 mObjectFullUpdates; + S32 mObjectTerseUpdates; + S32 mObjectCacheMissRequests; + S32 mObjectCacheMissResponses; + S32 mObjectUpdateFailures; + + + void clearStats(); }; #endif // LL_RECORD_VIEWER_STATS #endif // LLVIEWERSTATSRECORDER_H + -- cgit v1.3 From b71b9ee08e0b59274346a3b4da2c33ff84a5eb90 Mon Sep 17 00:00:00 2001 From: Don Kjer Date: Mon, 13 Dec 2010 16:15:25 -0800 Subject: Added object update cache results to viewer stats recorder --- indra/newview/llviewerobjectlist.cpp | 12 ++++++--- indra/newview/llviewerregion.cpp | 9 +++++-- indra/newview/llviewerregion.h | 10 +++++++- indra/newview/llviewerstatsrecorder.cpp | 44 +++++++++++++++++++++++++++++++-- indra/newview/llviewerstatsrecorder.h | 6 +++++ 5 files changed, 72 insertions(+), 9 deletions(-) (limited to 'indra/newview/llviewerobjectlist.cpp') diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 249799bf55..64949ecc44 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -500,7 +500,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { if (update_type == OUT_TERSE_IMPROVED) { - // llinfos << "terse update for an unknown object:" << fullid << llendl; + llinfos << "terse update for an unknown object (compressed):" << fullid << llendl; #if LL_RECORD_VIEWER_STATS LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type); #endif @@ -514,7 +514,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { if (update_type != OUT_FULL) { - // llinfos << "terse update for an unknown object:" << fullid << llendl; + llinfos << "terse update for an unknown object:" << fullid << llendl; #if LL_RECORD_VIEWER_STATS LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type); #endif @@ -527,7 +527,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, if (mDeadObjects.find(fullid) != mDeadObjects.end()) { mNumDeadObjectUpdates++; - // llinfos << "update for a dead object:" << fullid << llendl; + llinfos << "update for a dead object:" << fullid << llendl; #if LL_RECORD_VIEWER_STATS LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type); #endif @@ -538,6 +538,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, objectp = createObject(pcode, regionp, fullid, local_id, gMessageSystem->getSender()); if (!objectp) { + llinfos << "createObject failure for object: " << fullid << llendl; #if LL_RECORD_VIEWER_STATS LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type); #endif @@ -562,7 +563,10 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, processUpdateCore(objectp, user_data, i, update_type, &compressed_dp, justCreated); if (update_type != OUT_TERSE_IMPROVED) // OUT_FULL_COMPRESSED only? { - objectp->mRegionp->cacheFullUpdate(objectp, compressed_dp); + LLViewerRegion::eCacheUpdateResult result = objectp->mRegionp->cacheFullUpdate(objectp, compressed_dp); + #if LL_RECORD_VIEWER_STATS + LLViewerStatsRecorder::instance()->recordCacheFullUpdate(local_id, update_type, result, objectp); + #endif } } else if (cached) // Cache hit only? diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index da2373c39d..ea6f1ab342 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1033,7 +1033,7 @@ void LLViewerRegion::getInfo(LLSD& info) info["Region"]["Handle"]["y"] = (LLSD::Integer)y; } -void LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp) +LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp) { U32 local_id = objectp->getLocalID(); U32 crc = objectp->getCRC(); @@ -1047,6 +1047,7 @@ void LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinary { // Record a hit entry->recordDupe(); + return CACHE_UPDATE_DUPE; } else { @@ -1055,6 +1056,7 @@ void LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinary delete entry; entry = new LLVOCacheEntry(local_id, crc, dp); mCacheMap[local_id] = entry; + return CACHE_UPDATE_CHANGED; } } else @@ -1062,15 +1064,18 @@ void LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinary // we haven't seen this object before // Create new entry and add to map + eCacheUpdateResult result = CACHE_UPDATE_ADDED; if (mCacheMap.size() > MAX_OBJECT_CACHE_ENTRIES) { mCacheMap.erase(mCacheMap.begin()); + result = CACHE_UPDATE_REPLACED; + } entry = new LLVOCacheEntry(local_id, crc, dp); mCacheMap[local_id] = entry; + return result; } - return ; } // Get data packer for this object, if we have cached data diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 7fac2020ee..5e17f3352d 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -281,8 +281,16 @@ public: CACHE_MISS_TYPE_NONE } eCacheMissType; + typedef enum + { + CACHE_UPDATE_DUPE = 0, + CACHE_UPDATE_CHANGED, + CACHE_UPDATE_ADDED, + CACHE_UPDATE_REPLACED + } eCacheUpdateResult; + // handle a full update message - void cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp); + eCacheUpdateResult cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp); LLDataPacker *getDP(U32 local_id, U32 crc, U8 &cache_miss_type); void requestCacheMisses(); void addCacheMissFull(const U32 local_id); diff --git a/indra/newview/llviewerstatsrecorder.cpp b/indra/newview/llviewerstatsrecorder.cpp index 27bbc17b36..b6ef260b6a 100644 --- a/indra/newview/llviewerstatsrecorder.cpp +++ b/indra/newview/llviewerstatsrecorder.cpp @@ -96,6 +96,10 @@ void LLViewerStatsRecorder::initStatsRecorder(LLViewerRegion *regionp) << "TerseUpdates, " << "CacheMissRequests, " << "CacheMissResponses, " + << "CacheUpdateDupes, " + << "CacheUpdateChanges, " + << "CacheUpdateAdds, " + << "CacheUpdateReplacements, " << "UpdateFailures" << "\n"; @@ -121,6 +125,10 @@ void LLViewerStatsRecorder::clearStats() mObjectTerseUpdates = 0; mObjectCacheMissRequests = 0; mObjectCacheMissResponses = 0; + mObjectCacheUpdateDupes = 0; + mObjectCacheUpdateChanges = 0; + mObjectCacheUpdateAdds = 0; + mObjectCacheUpdateReplacements = 0; mObjectUpdateFailures = 0; } @@ -156,9 +164,33 @@ void LLViewerStatsRecorder::recordObjectUpdateEvent(U32 local_id, const EObjectU mObjectCacheMissResponses++; break; case OUT_FULL_CACHED: - default: mObjectCacheHitCount++; break; + default: + llwarns << "Unknown update_type" << llendl; + break; + }; +} + +void LLViewerStatsRecorder::recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp) +{ + switch (update_result) + { + case LLViewerRegion::CACHE_UPDATE_DUPE: + mObjectCacheUpdateDupes++; + break; + case LLViewerRegion::CACHE_UPDATE_CHANGED: + mObjectCacheUpdateChanges++; + break; + case LLViewerRegion::CACHE_UPDATE_ADDED: + mObjectCacheUpdateAdds++; + break; + case LLViewerRegion::CACHE_UPDATE_REPLACED: + mObjectCacheUpdateReplacements++; + break; + default: + llwarns << "Unknown update_result type" << llendl; + break; }; } @@ -177,10 +209,14 @@ void LLViewerStatsRecorder::endObjectUpdateEvents() << mObjectTerseUpdates << " terse updates, " << mObjectCacheMissRequests << " cache miss requests, " << mObjectCacheMissResponses << " cache miss responses, " + << mObjectCacheUpdateDupes << " cache update dupes, " + << mObjectCacheUpdateChanges << " cache update changes, " + << mObjectCacheUpdateAdds << " cache update adds, " + << mObjectCacheUpdateReplacements << " cache update replacements, " << mObjectUpdateFailures << " update failures" << llendl; - S32 total_objects = mObjectCacheHitCount + mObjectCacheMissCrcCount + mObjectCacheMissFullCount + mObjectFullUpdates + mObjectTerseUpdates + mObjectCacheMissRequests + mObjectCacheMissResponses + mObjectUpdateFailures; + S32 total_objects = mObjectCacheHitCount + mObjectCacheMissCrcCount + mObjectCacheMissFullCount + mObjectFullUpdates + mObjectTerseUpdates + mObjectCacheMissRequests + mObjectCacheMissResponses + mObjectCacheUpdateDupes + mObjectCacheUpdateChanges + mObjectCacheUpdateAdds + mObjectCacheUpdateReplacements + mObjectUpdateFailures; if (mObjectCacheFile != NULL && total_objects > 0) { @@ -197,6 +233,10 @@ void LLViewerStatsRecorder::endObjectUpdateEvents() << ", " << mObjectTerseUpdates << ", " << mObjectCacheMissRequests << ", " << mObjectCacheMissResponses + << ", " << mObjectCacheUpdateDupes + << ", " << mObjectCacheUpdateChanges + << ", " << mObjectCacheUpdateAdds + << ", " << mObjectCacheUpdateReplacements << ", " << mObjectUpdateFailures << "\n"; diff --git a/indra/newview/llviewerstatsrecorder.h b/indra/newview/llviewerstatsrecorder.h index 001b8d9bd6..16e04fb11e 100644 --- a/indra/newview/llviewerstatsrecorder.h +++ b/indra/newview/llviewerstatsrecorder.h @@ -38,6 +38,7 @@ #if LL_RECORD_VIEWER_STATS #include "llframetimer.h" #include "llviewerobject.h" +#include "llviewerregion.h" class LLMutex; class LLViewerRegion; @@ -59,6 +60,7 @@ class LLViewerStatsRecorder void recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type); void recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type); void recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp); + void recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp); void recordRequestCacheMissesEvent(S32 count); void endObjectUpdateEvents(); @@ -78,6 +80,10 @@ private: S32 mObjectTerseUpdates; S32 mObjectCacheMissRequests; S32 mObjectCacheMissResponses; + S32 mObjectCacheUpdateDupes; + S32 mObjectCacheUpdateChanges; + S32 mObjectCacheUpdateAdds; + S32 mObjectCacheUpdateReplacements; S32 mObjectUpdateFailures; -- cgit v1.3 From 01c13c3b9403991c04166f6ac57c93aaf5f17f83 Mon Sep 17 00:00:00 2001 From: Don Kjer Date: Mon, 13 Dec 2010 18:29:31 -0800 Subject: Added in-world color coding to objects based on update type --- indra/newview/llviewerobjectlist.cpp | 32 ++++++++++++++++++++++++++++++++ indra/newview/llviewerstatsrecorder.cpp | 7 +++++-- indra/newview/llviewerstatsrecorder.h | 2 ++ 3 files changed, 39 insertions(+), 2 deletions(-) (limited to 'indra/newview/llviewerobjectlist.cpp') diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 64949ecc44..285f067b0e 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -554,6 +554,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, llwarns << "Dead object " << objectp->mID << " in UUID map 1!" << llendl; } + bool bCached = false; if (compressed) { if (update_type != OUT_TERSE_IMPROVED) // OUT_FULL_COMPRESSED only? @@ -564,6 +565,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, if (update_type != OUT_TERSE_IMPROVED) // OUT_FULL_COMPRESSED only? { LLViewerRegion::eCacheUpdateResult result = objectp->mRegionp->cacheFullUpdate(objectp, compressed_dp); + bCached = true; #if LL_RECORD_VIEWER_STATS LLViewerStatsRecorder::instance()->recordCacheFullUpdate(local_id, update_type, result, objectp); #endif @@ -584,6 +586,36 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, } #if LL_RECORD_VIEWER_STATS LLViewerStatsRecorder::instance()->recordObjectUpdateEvent(local_id, update_type, objectp); + F32 color_strength = llmin((LLViewerStatsRecorder::instance()->getTimeSinceStart() / 1000.0f) + 64.0f, 255.0f); + LLColor4 color; + switch (update_type) + { + case OUT_FULL: + color[VGREEN] = color_strength; + break; + case OUT_TERSE_IMPROVED: + color[VGREEN] = color_strength; + color[VBLUE] = color_strength; + break; + case OUT_FULL_COMPRESSED: + color[VRED] = color_strength; + if (!bCached) + { + color[VGREEN] = color_strength; + } + break; + case OUT_FULL_CACHED: + color[VBLUE] = color_strength; + break; + default: + llwarns << "Unknown update_type " << update_type << llendl; + break; + }; + U8 te; + for (te = 0; te < objectp->getNumTEs(); ++te) + { + objectp->setTEColor(te, color); + } #endif } diff --git a/indra/newview/llviewerstatsrecorder.cpp b/indra/newview/llviewerstatsrecorder.cpp index b6ef260b6a..a8d1565742 100644 --- a/indra/newview/llviewerstatsrecorder.cpp +++ b/indra/newview/llviewerstatsrecorder.cpp @@ -221,10 +221,9 @@ void LLViewerStatsRecorder::endObjectUpdateEvents() total_objects > 0) { std::ostringstream data_msg; - F32 now32 = (F32) ((LLTimer::getTotalTime() - mStartTime) / 1000.0); F32 processing32 = (F32) ((LLTimer::getTotalTime() - mProcessingTime) / 1000.0); - data_msg << now32 + data_msg << getTimeSinceStart() << ", " << processing32 << ", " << mObjectCacheHitCount << ", " << mObjectCacheMissFullCount @@ -246,5 +245,9 @@ void LLViewerStatsRecorder::endObjectUpdateEvents() clearStats(); } +F32 LLViewerStatsRecorder::getTimeSinceStart() +{ + return (F32) ((LLTimer::getTotalTime() - mStartTime) / 1000.0); +} diff --git a/indra/newview/llviewerstatsrecorder.h b/indra/newview/llviewerstatsrecorder.h index 16e04fb11e..f9ccdd6e78 100644 --- a/indra/newview/llviewerstatsrecorder.h +++ b/indra/newview/llviewerstatsrecorder.h @@ -64,6 +64,8 @@ class LLViewerStatsRecorder void recordRequestCacheMissesEvent(S32 count); void endObjectUpdateEvents(); + F32 getTimeSinceStart(); + private: static LLViewerStatsRecorder* sInstance; -- cgit v1.3 From 2938086cdc8668913181ae4072866ae2993e0375 Mon Sep 17 00:00:00 2001 From: Don Kjer Date: Tue, 14 Dec 2010 15:56:09 -0800 Subject: Simple fix for color strength of viewer update goggles. --- indra/newview/llviewerobjectlist.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/llviewerobjectlist.cpp') diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 285f067b0e..70631f9481 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -586,7 +586,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, } #if LL_RECORD_VIEWER_STATS LLViewerStatsRecorder::instance()->recordObjectUpdateEvent(local_id, update_type, objectp); - F32 color_strength = llmin((LLViewerStatsRecorder::instance()->getTimeSinceStart() / 1000.0f) + 64.0f, 255.0f); + F32 color_strength = llmin(((LLViewerStatsRecorder::instance()->getTimeSinceStart() / 1000.0f) + 128.0f) / 255.0f, 1.0f); LLColor4 color; switch (update_type) { -- cgit v1.3 From 14e402cf5e8274caddaf1c763c2e044c53514b1e Mon Sep 17 00:00:00 2001 From: Don Kjer Date: Thu, 16 Dec 2010 22:09:49 -0800 Subject: ER-414: Add object update type debug rendering view --- indra/newview/llspatialpartition.cpp | 33 ++++++++++++++++++++++++++++-- indra/newview/llviewerobject.cpp | 24 +++++++++++++++++++++- indra/newview/llviewerobject.h | 8 ++++++++ indra/newview/llviewerobjectlist.cpp | 36 +++++---------------------------- indra/newview/llviewerstatsrecorder.cpp | 7 ++++++- 5 files changed, 73 insertions(+), 35 deletions(-) (limited to 'indra/newview/llviewerobjectlist.cpp') diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 3dd0e1081e..8adb8c30e0 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -2580,11 +2580,40 @@ void renderCrossHairs(LLVector3 position, F32 size, LLColor4 color) void renderUpdateType(LLDrawable* drawablep) { + LLViewerObject* vobj = drawablep->getVObj(); + if (!vobj || OUT_UNKNOWN == vobj->getLastUpdateType()) + { + return; + } + LLGLEnable blend(GL_BLEND); + switch (vobj->getLastUpdateType()) + { + case OUT_FULL: + glColor4f(0,1,0,0.5f); + break; + case OUT_TERSE_IMPROVED: + glColor4f(0,1,1,0.5f); + break; + case OUT_FULL_COMPRESSED: + if (vobj->getLastUpdateCached()) + { + glColor4f(1,0,0,0.5f); + } + else + { + glColor4f(1,1,0,0.5f); + } + break; + case OUT_FULL_CACHED: + glColor4f(0,0,1,0.5f); + break; + default: + llwarns << "Unknown update_type " << vobj->getLastUpdateType() << llendl; + break; + }; S32 num_faces = drawablep->getNumFaces(); if (num_faces) { - LLGLEnable blend(GL_BLEND); - glColor4f(0,1,1,0.5f); for (S32 i = 0; i < num_faces; ++i) { pushVerts(drawablep->getFace(i), LLVertexBuffer::MAP_VERTEX); diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 1804fac1b3..3c12cb66b2 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -234,7 +234,9 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe mState(0), mMedia(NULL), mClickAction(0), - mAttachmentItemID(LLUUID::null) + mAttachmentItemID(LLUUID::null), + mLastUpdateType(OUT_UNKNOWN), + mLastUpdateCached(FALSE) { if (!is_global) { @@ -5400,6 +5402,26 @@ void LLViewerObject::setAttachmentItemID(const LLUUID &id) mAttachmentItemID = id; } +EObjectUpdateType LLViewerObject::getLastUpdateType() +{ + return mLastUpdateType; +} + +void LLViewerObject::setLastUpdateType(EObjectUpdateType last_update_type) +{ + mLastUpdateType = last_update_type; +} + +BOOL LLViewerObject::getLastUpdateCached() +{ + return mLastUpdateCached; +} + +void LLViewerObject::setLastUpdateCached(BOOL last_update_cached) +{ + mLastUpdateCached = last_update_cached; +} + const LLUUID &LLViewerObject::extractAttachmentItemID() { LLUUID item_id = LLUUID::null; diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index fe670f8827..c83cc06128 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -77,6 +77,7 @@ typedef enum e_object_update_type OUT_TERSE_IMPROVED, OUT_FULL_COMPRESSED, OUT_FULL_CACHED, + OUT_UNKNOWN, } EObjectUpdateType; @@ -696,8 +697,15 @@ public: const LLUUID &getAttachmentItemID() const; void setAttachmentItemID(const LLUUID &id); const LLUUID &extractAttachmentItemID(); // find&set the inventory item ID of the attached object + EObjectUpdateType getLastUpdateType(); + void setLastUpdateType(EObjectUpdateType last_update_type); + BOOL getLastUpdateCached(); + void setLastUpdateCached(BOOL last_update_cached); + private: LLUUID mAttachmentItemID; // ItemID of the associated object is in user inventory. + EObjectUpdateType mLastUpdateType; + BOOL mLastUpdateCached; }; /////////////////// diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 70631f9481..77fbc08ca4 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -564,10 +564,12 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, processUpdateCore(objectp, user_data, i, update_type, &compressed_dp, justCreated); if (update_type != OUT_TERSE_IMPROVED) // OUT_FULL_COMPRESSED only? { - LLViewerRegion::eCacheUpdateResult result = objectp->mRegionp->cacheFullUpdate(objectp, compressed_dp); bCached = true; #if LL_RECORD_VIEWER_STATS + LLViewerRegion::eCacheUpdateResult result = objectp->mRegionp->cacheFullUpdate(objectp, compressed_dp); LLViewerStatsRecorder::instance()->recordCacheFullUpdate(local_id, update_type, result, objectp); + #else + objectp->mRegionp->cacheFullUpdate(objectp, compressed_dp); #endif } } @@ -586,37 +588,9 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, } #if LL_RECORD_VIEWER_STATS LLViewerStatsRecorder::instance()->recordObjectUpdateEvent(local_id, update_type, objectp); - F32 color_strength = llmin(((LLViewerStatsRecorder::instance()->getTimeSinceStart() / 1000.0f) + 128.0f) / 255.0f, 1.0f); - LLColor4 color; - switch (update_type) - { - case OUT_FULL: - color[VGREEN] = color_strength; - break; - case OUT_TERSE_IMPROVED: - color[VGREEN] = color_strength; - color[VBLUE] = color_strength; - break; - case OUT_FULL_COMPRESSED: - color[VRED] = color_strength; - if (!bCached) - { - color[VGREEN] = color_strength; - } - break; - case OUT_FULL_CACHED: - color[VBLUE] = color_strength; - break; - default: - llwarns << "Unknown update_type " << update_type << llendl; - break; - }; - U8 te; - for (te = 0; te < objectp->getNumTEs(); ++te) - { - objectp->setTEColor(te, color); - } #endif + objectp->setLastUpdateType(update_type); + objectp->setLastUpdateCached(bCached); } #if LL_RECORD_VIEWER_STATS diff --git a/indra/newview/llviewerstatsrecorder.cpp b/indra/newview/llviewerstatsrecorder.cpp index a8d1565742..e9d21b4848 100644 --- a/indra/newview/llviewerstatsrecorder.cpp +++ b/indra/newview/llviewerstatsrecorder.cpp @@ -26,6 +26,9 @@ #include "llviewerprecompiledheaders.h" #include "llviewerstatsrecorder.h" + +#if LL_RECORD_VIEWER_STATS + #include "llfile.h" #include "llviewerregion.h" #include "llviewerobject.h" @@ -38,7 +41,6 @@ static const std::string STATS_FILE_NAME("/tmp/viewerstats.csv"); #endif - LLViewerStatsRecorder* LLViewerStatsRecorder::sInstance = NULL; LLViewerStatsRecorder::LLViewerStatsRecorder() : mObjectCacheFile(NULL), @@ -250,4 +252,7 @@ F32 LLViewerStatsRecorder::getTimeSinceStart() return (F32) ((LLTimer::getTotalTime() - mStartTime) / 1000.0); } +#endif + + -- cgit v1.3 From 649dd6eb74023d48379ebaadd2ff000801306f17 Mon Sep 17 00:00:00 2001 From: Don Kjer Date: Wed, 22 Dec 2010 14:23:35 -0800 Subject: Cleanup from review with Andrew and Merov --- indra/newview/llviewerobject.cpp | 4 ++-- indra/newview/llviewerobject.h | 4 ++-- indra/newview/llviewerobjectlist.cpp | 12 +++++------ indra/newview/llviewerregion.cpp | 42 ++++++++++++++++-------------------- indra/newview/llvocache.cpp | 2 +- 5 files changed, 30 insertions(+), 34 deletions(-) (limited to 'indra/newview/llviewerobjectlist.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 3c12cb66b2..4b7e518af3 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -5402,7 +5402,7 @@ void LLViewerObject::setAttachmentItemID(const LLUUID &id) mAttachmentItemID = id; } -EObjectUpdateType LLViewerObject::getLastUpdateType() +EObjectUpdateType LLViewerObject::getLastUpdateType() const { return mLastUpdateType; } @@ -5412,7 +5412,7 @@ void LLViewerObject::setLastUpdateType(EObjectUpdateType last_update_type) mLastUpdateType = last_update_type; } -BOOL LLViewerObject::getLastUpdateCached() +BOOL LLViewerObject::getLastUpdateCached() const { return mLastUpdateCached; } diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index c83cc06128..78837ec0a1 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -697,9 +697,9 @@ public: const LLUUID &getAttachmentItemID() const; void setAttachmentItemID(const LLUUID &id); const LLUUID &extractAttachmentItemID(); // find&set the inventory item ID of the attached object - EObjectUpdateType getLastUpdateType(); + EObjectUpdateType getLastUpdateType() const; void setLastUpdateType(EObjectUpdateType last_update_type); - BOOL getLastUpdateCached(); + BOOL getLastUpdateCached() const; void setLastUpdateCached(BOOL last_update_cached); private: diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 77fbc08ca4..5849ab4307 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -306,7 +306,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, // I don't think this case is ever hit. TODO* Test this. if (!cached && !compressed && update_type != OUT_FULL) { - llinfos << "TEST: !cached && !compressed && update_type != OUT_FULL" << llendl; + //llinfos << "TEST: !cached && !compressed && update_type != OUT_FULL" << llendl; gTerseObjectUpdates += num_objects; S32 size; if (mesgsys->getReceiveCompressedSize()) @@ -317,7 +317,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { size = mesgsys->getReceiveSize(); } - llinfos << "Received terse " << num_objects << " in " << size << " byte (" << size/num_objects << ")" << llendl; + //llinfos << "Received terse " << num_objects << " in " << size << " byte (" << size/num_objects << ")" << llendl; } else { @@ -403,7 +403,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, // I don't think we ever use this flag from the server. DK 2010/12/09 if (flags & FLAGS_ZLIB_COMPRESSED) { - llinfos << "TEST: flags & FLAGS_ZLIB_COMPRESSED" << llendl; + //llinfos << "TEST: flags & FLAGS_ZLIB_COMPRESSED" << llendl; compressed_length = mesgsys->getSizeFast(_PREHASH_ObjectData, i, _PREHASH_Data); mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_Data, compbuffer, 0, i); uncompressed_length = 2048; @@ -500,7 +500,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { if (update_type == OUT_TERSE_IMPROVED) { - llinfos << "terse update for an unknown object (compressed):" << fullid << llendl; + // llinfos << "terse update for an unknown object (compressed):" << fullid << llendl; #if LL_RECORD_VIEWER_STATS LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type); #endif @@ -514,7 +514,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { if (update_type != OUT_FULL) { - llinfos << "terse update for an unknown object:" << fullid << llendl; + //llinfos << "terse update for an unknown object:" << fullid << llendl; #if LL_RECORD_VIEWER_STATS LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type); #endif @@ -527,7 +527,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, if (mDeadObjects.find(fullid) != mDeadObjects.end()) { mNumDeadObjectUpdates++; - llinfos << "update for a dead object:" << fullid << llendl; + //llinfos << "update for a dead object:" << fullid << llendl; #if LL_RECORD_VIEWER_STATS LLViewerStatsRecorder::instance()->recordObjectUpdateFailure(local_id, update_type); #endif diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index ea6f1ab342..4648f318d4 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1049,33 +1049,29 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec entry->recordDupe(); return CACHE_UPDATE_DUPE; } - else - { - // Update the cache entry - mCacheMap.erase(local_id); - delete entry; - entry = new LLVOCacheEntry(local_id, crc, dp); - mCacheMap[local_id] = entry; - return CACHE_UPDATE_CHANGED; - } - } - else - { - // we haven't seen this object before - // Create new entry and add to map - eCacheUpdateResult result = CACHE_UPDATE_ADDED; - if (mCacheMap.size() > MAX_OBJECT_CACHE_ENTRIES) - { - mCacheMap.erase(mCacheMap.begin()); - result = CACHE_UPDATE_REPLACED; - - } + // Update the cache entry + mCacheMap.erase(local_id); + delete entry; entry = new LLVOCacheEntry(local_id, crc, dp); - mCacheMap[local_id] = entry; - return result; + return CACHE_UPDATE_CHANGED; + } + + // we haven't seen this object before + + // Create new entry and add to map + eCacheUpdateResult result = CACHE_UPDATE_ADDED; + if (mCacheMap.size() > MAX_OBJECT_CACHE_ENTRIES) + { + mCacheMap.erase(mCacheMap.begin()); + result = CACHE_UPDATE_REPLACED; + } + entry = new LLVOCacheEntry(local_id, crc, dp); + + mCacheMap[local_id] = entry; + return result; } // Get data packer for this object, if we have cached data diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index 040139f3ab..d372fd0212 100644 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -593,7 +593,7 @@ void LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::voca void LLVOCache::purgeEntries() { - U32 limit = mCacheSize / ENTRIES_PURGE_FACTOR; + U32 limit = mCacheSize - (mCacheSize / ENTRIES_PURGE_FACTOR); limit = llclamp(limit, (U32)1, mCacheSize); // Construct a vector of entries out of the map so we can sort by time. std::vector header_vector; -- cgit v1.3