performance optimization: only scan 32 objects per frame looking for invisibles.

meow-7.2.2
Xiaohong Bao 2013-05-01 10:57:09 -06:00
parent 41e5bf346e
commit 6244679b34
2 changed files with 29 additions and 6 deletions

View File

@ -524,7 +524,7 @@ void LLviewerOctreeGroup::handleChildAddition(const OctreeNode* parent, OctreeNo
}
else
{
OCT_ERRS << "LLSpatialGroup redundancy detected." << llendl;
OCT_ERRS << "LLviewerOctreeGroup redundancy detected." << llendl;
}
unbound();

View File

@ -1122,7 +1122,6 @@ BOOL LLViewerRegion::idleUpdate(F32 max_update_time)
createVisibleObjects(max_update_time);
mImpl->mVisibleGroups.clear();
mImpl->mWaitingList.clear();
sCurRegionp = NULL;
return did_update;
@ -1135,16 +1134,40 @@ F32 LLViewerRegion::killInvisibleObjects(F32 max_time)
{
return max_time;
}
std::vector<LLDrawable*> delete_list;
for(LLVOCacheEntry::vocache_entry_set_t::iterator iter = mImpl->mActiveSet.begin();
iter != mImpl->mActiveSet.end(); ++iter)
if(mImpl->mActiveSet.empty())
{
return max_time;
}
static LLVOCacheEntry* last_visited_entry = NULL;
const size_t MAX_UPDATE = 32;
std::vector<LLDrawable*> delete_list;
S32 update_counter = llmin(MAX_UPDATE, mImpl->mActiveSet.size());
LLVOCacheEntry::vocache_entry_set_t::iterator iter = mImpl->mActiveSet.upper_bound(last_visited_entry);
for(; update_counter > 0; --update_counter, ++iter)
{
if(iter == mImpl->mActiveSet.end())
{
iter = mImpl->mActiveSet.begin();
}
if(!(*iter)->isRecentlyVisible())
{
killObject((*iter), delete_list);
}
}
if(iter == mImpl->mActiveSet.end())
{
last_visited_entry = NULL;
}
else
{
last_visited_entry = *iter;
}
for(S32 i = 0; i < delete_list.size(); i++)
{
gObjectList.killObject(delete_list[i]->getVObj());