Revert "MAINT-646: Hotspot in LLViewerObjectList::update"
This reverts commit d8fc691625.
This commit is contained in:
@@ -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),
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user