diff options
author | Xiaohong Bao <bao@lindenlab.com> | 2012-10-25 17:00:34 -0600 |
---|---|---|
committer | Xiaohong Bao <bao@lindenlab.com> | 2012-10-25 17:00:34 -0600 |
commit | 87097e546fa9e160264400f6d9d79d536abbb2fa (patch) | |
tree | 37d9bb03b6779a20b2cba8fa10dea27f3e5eb9c7 /indra/newview | |
parent | 6c7167b1f2363ab9412c4ded3b22c829018f6e45 (diff) |
more for SH-3333: avoid repeatedly creating/killing a same object from object cache due to occlusion culling.
Diffstat (limited to 'indra/newview')
-rw-r--r-- | indra/newview/llvocache.cpp | 47 | ||||
-rw-r--r-- | indra/newview/llvocache.h | 4 |
2 files changed, 44 insertions, 7 deletions
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index 236ce11c7e..fbab5c60e3 100644 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -54,7 +54,9 @@ LLVOCacheEntry::LLVOCacheEntry(U32 local_id, U32 crc, LLDataPackerBinaryBuffer & mHitCount(0), mDupeCount(0), mCRCChangeCount(0), - mState(INACTIVE) + mState(INACTIVE), + mRepeatedVisCounter(0), + mVisFrameRange(64) { mBuffer = new U8[dp.getBufferSize()]; mDP.assignBuffer(mBuffer, dp.getBufferSize()); @@ -69,7 +71,9 @@ LLVOCacheEntry::LLVOCacheEntry() mDupeCount(0), mCRCChangeCount(0), mBuffer(NULL), - mState(INACTIVE) + mState(INACTIVE), + mRepeatedVisCounter(0), + mVisFrameRange(64) { mDP.assignBuffer(mBuffer, 0); } @@ -77,7 +81,9 @@ LLVOCacheEntry::LLVOCacheEntry() LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file) : LLViewerOctreeEntryData(LLViewerOctreeEntry::LLVOCACHEENTRY), mBuffer(NULL), - mState(INACTIVE) + mState(INACTIVE), + mRepeatedVisCounter(0), + mVisFrameRange(64) { S32 size = -1; BOOL success; @@ -167,12 +173,41 @@ void LLVOCacheEntry::setOctreeEntry(LLViewerOctreeEntry* entry) LLViewerOctreeEntryData::setOctreeEntry(entry); } +void LLVOCacheEntry::setState(U32 state) +{ + mState = state; + + if(mState == ACTIVE) + { + const S32 MIN_REAVTIVE_INTERVAL = 20; + U32 last_visible = getVisible(); + + setVisible(); + + if(getVisible() - last_visible < MIN_REAVTIVE_INTERVAL + mVisFrameRange) + { + mRepeatedVisCounter++; + } + else + { + mRepeatedVisCounter = 0; + mVisFrameRange = 64; + } + + if(mRepeatedVisCounter > 2) + { + //if repeatedly becomes visible immediately after invisible, enlarge the visible frame range + + mRepeatedVisCounter = 0; + mVisFrameRange *= 2; + } + } +} + //virtual S32 LLVOCacheEntry::getMinVisFrameRange()const { - const S32 MIN_RANGE = 64; //frames - - return MIN_RANGE; + return mVisFrameRange; } void LLVOCacheEntry::addChild(LLVOCacheEntry* entry) diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h index 85538e8043..2228e3e43b 100644 --- a/indra/newview/llvocache.h +++ b/indra/newview/llvocache.h @@ -54,7 +54,7 @@ public: LLVOCacheEntry(LLAPRFile* apr_file); LLVOCacheEntry(); - void setState(U32 state) {mState = state;} + void setState(U32 state); bool isState(U32 state) {return mState == state;} U32 getState() const {return mState;} @@ -92,6 +92,8 @@ protected: LLDataPackerBinaryBuffer mDP; U8 *mBuffer; + S32 mVisFrameRange; + S32 mRepeatedVisCounter; //number of repeatedly visible within a short time. U32 mState; std::vector<LLVOCacheEntry*> mChildrenList; //children entries in a linked set. }; |