Revert "MAINT-646: Hotspot in LLViewerObjectList::update"

This reverts commit d8fc691625.
This commit is contained in:
Siana Gearz
2012-08-27 07:32:29 +02:00
parent 953a7ff066
commit 32f9cbb11d
4 changed files with 18 additions and 73 deletions

View File

@@ -205,7 +205,6 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
mID(id), mID(id),
mLocalID(0), mLocalID(0),
mTotalCRC(0), mTotalCRC(0),
mListIndex(-1),
mTEImages(NULL), mTEImages(NULL),
mGLName(0), mGLName(0),
mbCanSelect(TRUE), mbCanSelect(TRUE),

View File

@@ -233,8 +233,6 @@ public:
const LLUUID &getID() const { return mID; } const LLUUID &getID() const { return mID; }
U32 getLocalID() const { return mLocalID; } U32 getLocalID() const { return mLocalID; }
U32 getCRC() const { return mTotalCRC; } U32 getCRC() const { return mTotalCRC; }
S32 getListIndex() const { return mListIndex; }
void setListIndex(S32 idx) { mListIndex = idx; }
virtual BOOL isFlexible() const { return FALSE; } virtual BOOL isFlexible() const { return FALSE; }
virtual BOOL isSculpted() const { return FALSE; } virtual BOOL isSculpted() const { return FALSE; }
@@ -618,9 +616,6 @@ public:
// Last total CRC received from sim, used for caching // Last total CRC received from sim, used for caching
U32 mTotalCRC; U32 mTotalCRC;
// index into LLViewerObjectList::mActiveObjects or -1 if not in list
S32 mListIndex;
LLPointer<LLViewerTexture> *mTEImages; LLPointer<LLViewerTexture> *mTEImages;
// Selection, picking and rendering variables // Selection, picking and rendering variables

View File

@@ -918,30 +918,21 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
LLViewerObject *objectp = NULL; LLViewerObject *objectp = NULL;
// Make a copy of the list in case something in idleUpdate() messes with it // Make a copy of the list in case something in idleUpdate() messes with it
static std::vector<LLViewerObject*> idle_list; std::vector<LLViewerObject*> idle_list;
U32 idle_count = 0;
static LLFastTimer::DeclareTimer idle_copy("Idle Copy"); static LLFastTimer::DeclareTimer idle_copy("Idle Copy");
{ {
LLFastTimer t(idle_copy); LLFastTimer t(idle_copy);
idle_list.reserve( mActiveObjects.size() );
for (std::vector<LLPointer<LLViewerObject> >::iterator active_iter = mActiveObjects.begin(); for (std::set<LLPointer<LLViewerObject> >::iterator active_iter = mActiveObjects.begin();
active_iter != mActiveObjects.end(); active_iter++) active_iter != mActiveObjects.end(); active_iter++)
{ {
objectp = *active_iter; objectp = *active_iter;
if (objectp) if (objectp)
{ {
if (idle_count >= idle_list.size()) idle_list.push_back( objectp );
{
idle_list.push_back( objectp );
}
else
{
idle_list[idle_count] = objectp;
}
++idle_count;
} }
else else
{ // There shouldn't be any NULL pointers in the list, but they have caused { // There shouldn't be any NULL pointers in the list, but they have caused
@@ -951,12 +942,11 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
} }
} }
std::vector<LLViewerObject*>::iterator idle_end = idle_list.begin()+idle_count;
static const LLCachedControl<bool> freeze_time("FreezeTime",0); static const LLCachedControl<bool> freeze_time("FreezeTime",0);
if (freeze_time) if (freeze_time)
{ {
for (std::vector<LLViewerObject*>::iterator iter = idle_list.begin(); for (std::vector<LLViewerObject*>::iterator iter = idle_list.begin();
iter != idle_end; iter++) iter != idle_list.end(); iter++)
{ {
objectp = *iter; objectp = *iter;
if ( if (
@@ -972,18 +962,18 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
else else
{ {
for (std::vector<LLViewerObject*>::iterator idle_iter = idle_list.begin(); for (std::vector<LLViewerObject*>::iterator idle_iter = idle_list.begin();
idle_iter != idle_end; idle_iter++) idle_iter != idle_list.end(); idle_iter++)
{ {
objectp = *idle_iter; objectp = *idle_iter;
if (objectp->idleUpdate(agent, world, frame_time)) if (!objectp->idleUpdate(agent, world, frame_time))
{
num_active_objects++;
}
else
{ {
// If Idle Update returns false, kill object! // If Idle Update returns false, kill object!
kill_list.push_back(objectp); kill_list.push_back(objectp);
} }
else
{
num_active_objects++;
}
} }
for (std::vector<LLViewerObject*>::iterator kill_iter = kill_list.begin(); for (std::vector<LLViewerObject*>::iterator kill_iter = kill_list.begin();
kill_iter != kill_list.end(); kill_iter++) kill_iter != kill_list.end(); kill_iter++)
@@ -1225,7 +1215,7 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
{ {
//llinfos << "Removing " << objectp->mID << " " << objectp->getPCodeString() << " from active list in cleanupReferences." << llendl; //llinfos << "Removing " << objectp->mID << " " << objectp->getPCodeString() << " from active list in cleanupReferences." << llendl;
objectp->setOnActiveList(FALSE); objectp->setOnActiveList(FALSE);
removeFromActiveList(objectp); mActiveObjects.erase(objectp);
} }
if (objectp->isOnMap()) if (objectp->isOnMap())
@@ -1292,7 +1282,6 @@ BOOL LLViewerObjectList::killObject(LLViewerObject *objectp)
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
@@ -1416,26 +1405,6 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)
mNumDeadObjects = 0; mNumDeadObjects = 0;
} }
void LLViewerObjectList::removeFromActiveList(LLViewerObject* objectp)
{
S32 idx = objectp->getListIndex();
if (idx != -1)
{ //remove by moving last element to this object's position
llassert(mActiveObjects[idx] == objectp);
objectp->setListIndex(-1);
S32 last_index = mActiveObjects.size()-1;
if (idx != last_index)
{
mActiveObjects[idx] = mActiveObjects[last_index];
mActiveObjects[idx]->setListIndex(idx);
mActiveObjects.pop_back();
}
}
}
void LLViewerObjectList::updateActive(LLViewerObject *objectp) void LLViewerObjectList::updateActive(LLViewerObject *objectp)
{ {
LLMemType mt(LLMemType::MTYPE_OBJECT); LLMemType mt(LLMemType::MTYPE_OBJECT);
@@ -1450,29 +1419,13 @@ void LLViewerObjectList::updateActive(LLViewerObject *objectp)
if (active) if (active)
{ {
//llinfos << "Adding " << objectp->mID << " " << objectp->getPCodeString() << " to active list." << llendl; //llinfos << "Adding " << objectp->mID << " " << objectp->getPCodeString() << " to active list." << llendl;
S32 idx = objectp->getListIndex(); mActiveObjects.insert(objectp);
if (idx <= -1) objectp->setOnActiveList(TRUE);
{
mActiveObjects.push_back(objectp);
objectp->setListIndex(mActiveObjects.size()-1);
objectp->setOnActiveList(TRUE);
}
else
{
llassert(idx < (S32)mActiveObjects.size());
llassert(mActiveObjects[idx] == objectp);
if (idx >= (S32)mActiveObjects.size() ||
mActiveObjects[idx] != objectp)
{
llwarns << "Invalid object list index detected!" << llendl;
}
}
} }
else else
{ {
//llinfos << "Removing " << objectp->mID << " " << objectp->getPCodeString() << " from active list." << llendl; //llinfos << "Removing " << objectp->mID << " " << objectp->getPCodeString() << " from active list." << llendl;
removeFromActiveList(objectp); mActiveObjects.erase(objectp);
objectp->setOnActiveList(FALSE); objectp->setOnActiveList(FALSE);
} }
} }

View File

@@ -128,9 +128,7 @@ public:
void dirtyAllObjectInventory(); void dirtyAllObjectInventory();
void removeFromActiveList(LLViewerObject* objectp);
void updateActive(LLViewerObject *objectp); void updateActive(LLViewerObject *objectp);
void updateAvatarVisibility(); void updateAvatarVisibility();
// Selection related stuff // Selection related stuff
@@ -208,7 +206,7 @@ public:
typedef std::vector<LLPointer<LLViewerObject> > vobj_list_t; typedef std::vector<LLPointer<LLViewerObject> > vobj_list_t;
vobj_list_t mObjects; vobj_list_t mObjects;
std::vector<LLPointer<LLViewerObject> > mActiveObjects; std::set<LLPointer<LLViewerObject> > mActiveObjects;
vobj_list_t mMapObjects; vobj_list_t mMapObjects;