From eba0a1133f4d7b0280bd0942928931bdcab14d38 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Sat, 16 Dec 2017 19:24:37 +0100 Subject: [PATCH] Use timer for cleaning up dead objects --- indra/newview/llviewerobjectlist.cpp | 34 +++++++++++++++++++++------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 30881602ed..6684b046c3 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -1517,6 +1517,11 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer) S32 num_removed = 0; LLViewerObject *objectp; + + // Use timer for cleaning up dead objects + static const F64 max_time = 0.01; // Let's try 10ms per frame + LLTimer timer; + // vobj_list_t::reverse_iterator target = mObjects.rbegin(); @@ -1532,12 +1537,16 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer) if (objectp->isDead()) { + mDeadObjects.erase(objectp->mID); // Use timer for cleaning up dead objects LLPointer::swap(*iter, *target); *target = NULL; ++target; num_removed++; - if (num_removed == mNumDeadObjects || iter->isNull()) + // Use timer for cleaning up dead objects + //if (num_removed == mNumDeadObjects || iter->isNull()) + if (num_removed == mNumDeadObjects || iter->isNull() || (use_timer && timer.getElapsedTimeF64() > max_time)) + // { // We've cleaned up all of the dead objects or caught up to the dead tail break; @@ -1549,15 +1558,24 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer) } } - llassert(num_removed == mNumDeadObjects); + // Use timer for cleaning up dead objects + //llassert(num_removed == mNumDeadObjects); - //erase as a block - mObjects.erase(mObjects.begin()+(mObjects.size()-mNumDeadObjects), mObjects.end()); + ////erase as a block + //mObjects.erase(mObjects.begin()+(mObjects.size()-mNumDeadObjects), mObjects.end()); - // We've cleaned the global object list, now let's do some paranoia testing on objects - // before blowing away the dead list. - mDeadObjects.clear(); - mNumDeadObjects = 0; + //// We've cleaned the global object list, now let's do some paranoia testing on objects + //// before blowing away the dead list. + //mDeadObjects.clear(); + //mNumDeadObjects = 0; + mObjects.erase(mObjects.begin()+(mObjects.size()-num_removed), mObjects.end()); + mNumDeadObjects -= num_removed; + + if (mNumDeadObjects != mDeadObjects.size()) + { + LL_WARNS() << "Num dead objects != dead object list size" << LL_ENDL; + } + // } void LLViewerObjectList::removeFromActiveList(LLViewerObject* objectp)