diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index 5932fb87c15afcc8507ff520ee9d2ca3d9009f0c..6d2a17882adc429de5fc600cc000f39229785f48 100755 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -491,8 +491,7 @@ LLVOCachePartition::LLVOCachePartition(LLViewerRegion* regionp) mLODPeriod = 16; mRegionp = regionp; mPartitionType = LLViewerRegion::PARTITION_VO_CACHE; - mDirty = FALSE; - + for(S32 i = 0; i < LLViewerCamera::NUM_CAMERAS; i++) { mCulledTime[i] = 0; @@ -501,17 +500,11 @@ LLVOCachePartition::LLVOCachePartition(LLViewerRegion* regionp) new LLOcclusionCullingGroup(mOctree, this); } -void LLVOCachePartition::setDirty() -{ - mDirty = TRUE; -} - void LLVOCachePartition::addEntry(LLViewerOctreeEntry* entry) { llassert(entry->hasVOCacheEntry()); mOctree->insert(entry); - setDirty(); } void LLVOCachePartition::removeEntry(LLViewerOctreeEntry* entry) @@ -643,12 +636,28 @@ S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion) } mCulledTime[LLViewerCamera::sCurCameraID] = LLViewerOctreeEntryData::getCurrentFrame(); - if(!mDirty && !mCullHistory[LLViewerCamera::sCurCameraID] && LLViewerRegion::isViewerCameraStatic()) + if(!mCullHistory[LLViewerCamera::sCurCameraID] && LLViewerRegion::isViewerCameraStatic()) { - return 0; //nothing changed, skip culling + static U32 hash = 0; + + U32 seed = llmax(mLODPeriod >> 1, (U32)4); + if(LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD) + { + if(!(LLViewerOctreeEntryData::getCurrentFrame() % seed)) + { + hash = (hash + 1) % seed; + } + } + if(LLViewerOctreeEntryData::getCurrentFrame() % seed != hash) + { + return 0; //nothing changed, reduce frequency of culling + } } - mCullHistory[LLViewerCamera::sCurCameraID] <<= 1; + if(LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD) + { + mCullHistory[LLViewerCamera::sCurCameraID] <<= 1; + } //localize the camera LLVector3 region_agent = mRegionp->getOriginAgent(); @@ -709,7 +718,6 @@ void LLVOCachePartition::resetOccluders() group->clearOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION); } mOccludedGroups.clear(); - mDirty = FALSE; sNeedsOcclusionCheck = FALSE; } diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h index 1fa019cfa6ecb8f0972a0fa83fe3dbcbcf479dae..7c7b64ad5ba2e402541d37fe181e70c1fa9c06c1 100755 --- a/indra/newview/llvocache.h +++ b/indra/newview/llvocache.h @@ -172,14 +172,11 @@ class LLVOCachePartition : public LLViewerOctreePartition, public LLTrace::MemTr void resetOccluders(); void processOccluders(LLCamera* camera); - void setDirty(); - public: static BOOL sNeedsOcclusionCheck; //static LLTrace::MemStatHandle sMemStat; private: - BOOL mDirty; U32 mCullHistory[LLViewerCamera::NUM_CAMERAS]; U32 mCulledTime[LLViewerCamera::NUM_CAMERAS]; std::set<LLOcclusionCullingGroup*> mOccludedGroups;