summaryrefslogtreecommitdiff
path: root/indra/newview/llvoavatar.cpp
diff options
context:
space:
mode:
authorBeq Janus <beqjanus@gmail.com>2024-08-08 17:10:03 +0100
committerGitHub <noreply@github.com>2024-08-08 19:10:03 +0300
commitfe0f1be17bfd83323f2fcda124f3327cc14b0cad (patch)
tree2359eb64cd644dc47024ab05eebcc4fe7c7ea1cb /indra/newview/llvoavatar.cpp
parent77d50cad495511a91ca1461d9e6f43a7e8656965 (diff)
Auto-scaling amortisation of dynamic BB calcs (#2226)
* Auto-scaling amortisation of dynamic BB calcs This fix limits the overhead of the dynamic BB calcs to AvatarExtentRefreshMaxPerBatch per AvatarExtentRefreshPeriodBatch frames default is 5 avatar per 4 frames. Thus a standard busy region 25 avatars would take 20 frames to refresh the BBs. * Add comments to give context to the amortised BB recalcs explain the frequency of updates given the number of avatars present as to how that limits the impact on frame rate in busy scenes
Diffstat (limited to 'indra/newview/llvoavatar.cpp')
-rw-r--r--indra/newview/llvoavatar.cpp37
1 files changed, 31 insertions, 6 deletions
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index d5a8ee6cf8..b3b8969faa 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -2631,6 +2631,29 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
}
// Update should be happening max once per frame.
+ static LLCachedControl<S32> refreshPeriod(gSavedSettings, "AvatarExtentRefreshPeriodBatch");
+ static LLCachedControl<S32> refreshMaxPerPeriod(gSavedSettings, "AvatarExtentRefreshMaxPerBatch");
+ static S32 upd_freq = refreshPeriod; // initialise to a reasonable default of 1 batch
+ static S32 lastRecalibrationFrame{ 0 };
+
+ const S32 thisFrame = LLDrawable::getCurrentFrame();
+ if (thisFrame - lastRecalibrationFrame >= upd_freq)
+ {
+ // Only update at the start of a cycle. .
+ // update frequency = ((Num_Avatars -1 / NumberPerPeriod) + 1 ) * Periodicity
+ // Given NumberPerPeriod = 5 and Periodicity = 4
+ // | NumAvatars | frequency |
+ // +-------------+-----------+
+ // | 1 | 4 |
+ // | 2 | 4 |
+ // | 5 | 4 |
+ // | 10 | 8 |
+ // | 25 | 20 |
+
+ upd_freq = (((gObjectList.getAvatarCount() - 1) / refreshMaxPerPeriod) + 1)*refreshPeriod;
+ lastRecalibrationFrame = thisFrame;
+ }
+
if ((mLastAnimExtents[0]==LLVector3())||
(mLastAnimExtents[1])==LLVector3())
{
@@ -2638,8 +2661,9 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
}
else
{
- const S32 upd_freq = 4; // force update every upd_freq frames.
- mNeedsExtentUpdate = ((LLDrawable::getCurrentFrame()+mID.mData[0])%upd_freq==0);
+ // Update extent if necessary.
+ // if the frame counnter + the first byte of the UUID % upd_freq = 0 then update the extent.
+ mNeedsExtentUpdate = ((thisFrame + mID.mData[0]) % upd_freq == 0);
}
LLScopedContextString str("avatar_idle_update " + getFullname());
@@ -10725,10 +10749,11 @@ void LLVOAvatar::updateRiggingInfo()
}
//LL_INFOS() << "done update rig count is " << countRigInfoTab(mJointRiggingInfoTab) << LL_ENDL;
- LL_DEBUGS("RigSpammish") << getFullname() << " after update rig tab:" << LL_ENDL;
- S32 joint_count, box_count;
- showRigInfoTabExtents(this, mJointRiggingInfoTab, joint_count, box_count);
- LL_DEBUGS("RigSpammish") << "uses " << joint_count << " joints " << " nonzero boxes: " << box_count << LL_ENDL;
+ // Remove debug only stuff on hot path
+ // LL_DEBUGS("RigSpammish") << getFullname() << " after update rig tab:" << LL_ENDL;
+ // S32 joint_count, box_count;
+ // showRigInfoTabExtents(this, mJointRiggingInfoTab, joint_count, box_count);
+ // LL_DEBUGS("RigSpammish") << "uses " << joint_count << " joints " << " nonzero boxes: " << box_count << LL_ENDL;
}
// virtual