diff options
| author | Cosmic Linden <cosmic@lindenlab.com> | 2022-07-08 16:25:21 -0700 | 
|---|---|---|
| committer | Cosmic Linden <cosmic@lindenlab.com> | 2022-07-12 15:53:38 -0700 | 
| commit | 0aaf52c77c6c65258ca580557b6fd0766011471c (patch) | |
| tree | 5c86076f223ad178145688e723783ae2742a2688 | |
| parent | 0c3149eb7dbcf484f13f511e7d9f137636ad1ea8 (diff) | |
SL-17691: Make objects active if there are too many material updates from the server
| -rw-r--r-- | indra/newview/llvovolume.cpp | 21 | ||||
| -rw-r--r-- | indra/newview/llvovolume.h | 4 | 
2 files changed, 17 insertions, 8 deletions
| diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index eb8ff29aca..367d8e328d 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -230,7 +230,7 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re  	mMediaImplList.resize(getNumTEs());  	mLastFetchedMediaVersion = -1; -    mServerVolumeUpdateCount = 0; +    mServerDrawableUpdateCount = 0;  	memset(&mIndexInTex, 0, sizeof(S32) * LLRender::NUM_VOLUME_TEXTURE_CHANNELS);  	mMDCImplCount = 0;  	mLastRiggingInfoLOD = -1; @@ -388,6 +388,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,                      }  					gPipeline.markTextured(mDrawable); +                    onDrawableUpdateFromServer();  					mFaceMappingChanged = TRUE;  					mTexAnimMode = 0;  				} @@ -401,7 +402,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,  			if (setVolume(volume_params, 0))  			{  				markForUpdate(TRUE); -                onVolumeUpdateFromServer(); +                onDrawableUpdateFromServer();  			}  		} @@ -412,6 +413,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,  		//  		S32 result = unpackTEMessage(mesgsys, _PREHASH_ObjectData, (S32) block_num); +        onDrawableUpdateFromServer();  		if (result & teDirtyBits)  		{  			updateTEData(); @@ -438,9 +440,10 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,  			if (setVolume(volume_params, 0))  			{  				markForUpdate(TRUE); -                onVolumeUpdateFromServer(); +                onDrawableUpdateFromServer();  			}  			S32 res2 = unpackTEMessage(*dp); +            onDrawableUpdateFromServer();  			if (TEM_INVALID == res2)  			{  				// There's something bogus in the data that we're unpacking. @@ -501,6 +504,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,                  }  				gPipeline.markTextured(mDrawable); +                onDrawableUpdateFromServer();  				mFaceMappingChanged = TRUE;  				mTexAnimMode = 0;  			} @@ -519,6 +523,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,  				LLDataPackerBinaryBuffer	tdp(tdpbuffer, 1024);  				mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_TextureEntry, tdpbuffer, 0, block_num, 1024);  				S32 result = unpackTEMessage(tdp); +                onDrawableUpdateFromServer();  				if (result & teDirtyBits)  				{  					updateTEData(); @@ -554,11 +559,15 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,  	return retval;  } -void LLVOVolume::onVolumeUpdateFromServer() +// Called when a volume, material, etc is updated by the server, possibly by a +// script. If this occurs too often for this object, mark it as active so that +// it doesn't disrupt the octree/render batches, thereby potentially causing a +// big performance penalty. +void LLVOVolume::onDrawableUpdateFromServer()  {      constexpr U32 UPDATES_UNTIL_ACTIVE = 8; -    ++mServerVolumeUpdateCount; -    if (mDrawable && !mDrawable->isActive() && mServerVolumeUpdateCount > UPDATES_UNTIL_ACTIVE) +    ++mServerDrawableUpdateCount; +    if (mDrawable && !mDrawable->isActive() && mServerDrawableUpdateCount > UPDATES_UNTIL_ACTIVE)      {          mDrawable->makeActive();      } diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index 66c87494df..71ac152490 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -170,7 +170,6 @@ public:  				const LLMatrix4& getWorldMatrix(LLXformMatrix* xform) const;  				void	markForUpdate(BOOL priority); -                void    onVolumeUpdateFromServer();  				void	markForUnload()							{ LLViewerObject::markForUnload(TRUE); mVolumeChanged = TRUE; }  				void    faceMappingChanged()                    { mFaceMappingChanged=TRUE; }; @@ -387,6 +386,7 @@ protected:  	static S32 mRenderComplexity_last;  	static S32 mRenderComplexity_current; +    void onDrawableUpdateFromServer();  	void requestMediaDataUpdate(bool isNew);  	void cleanUpMediaImpls();  	void addMediaImpl(LLViewerMediaImpl* media_impl, S32 texture_index) ; @@ -425,7 +425,7 @@ private:  	LLPointer<LLViewerFetchedTexture> mLightTexture;  	media_list_t mMediaImplList;  	S32			mLastFetchedMediaVersion; // as fetched from the server, starts as -1 -    U64         mServerVolumeUpdateCount; +    U64         mServerDrawableUpdateCount;  	S32 mIndexInTex[LLRender::NUM_VOLUME_TEXTURE_CHANNELS];  	S32 mMDCImplCount; | 
