diff --git a/OpenSim/Framework/AgentUpdateArgs.cs b/OpenSim/Framework/AgentUpdateArgs.cs
index 994ab87fba..2e9ece5e18 100644
--- a/OpenSim/Framework/AgentUpdateArgs.cs
+++ b/OpenSim/Framework/AgentUpdateArgs.cs
@@ -78,6 +78,7 @@ namespace OpenSim.Framework
public bool NeedsCameraCollision;
public uint lastpacketSequence;
public double lastUpdateTS;
+ public double lastMoveUpdateTS;
public AgentUpdateArgs()
{
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 5898370b6e..454347fa55 100755
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -1003,6 +1003,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// reset agent update args
m_thisAgentUpdateArgs.CameraAtAxis.X = float.MinValue;
m_thisAgentUpdateArgs.lastUpdateTS = 0;
+ m_thisAgentUpdateArgs.lastMoveUpdateTS = 0;
m_thisAgentUpdateArgs.ControlFlags = 0;
UDPPacketBuffer buf = OpenSimUDPBase.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
@@ -8500,28 +8501,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// Threshold for camera rotation to be a significant agent update
private const float VDELTA = 0.01f;
- ///
- /// This checks the update significance against the last update made.
- ///
- /// Can only be called by one thread at a time
- ///
- ///
- public bool CheckAgentUpdateSignificance(AgentUpdatePacket.AgentDataBlock x)
- {
- return CheckAgentMovementUpdateSignificance(x) || CheckAgentCameraUpdateSignificance(x);
- }
-
///
/// This checks the movement/state update significance against the last update made.
///
/// Can only be called by one thread at a time
///
///
- private bool CheckAgentMovementUpdateSignificance(AgentUpdatePacket.AgentDataBlock x)
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ private bool CheckAgentMovementUpdateSignificance(AgentUpdatePacket.AgentDataBlock x, double now)
{
- if(
+ if((x.ControlFlags & ~(uint)AgentManager.ControlFlags.AGENT_CONTROL_FINISH_ANIM) != (uint)AgentManager.ControlFlags.NONE &&
+ now > m_thisAgentUpdateArgs.lastMoveUpdateTS + 20)
+ return true;
+
+ if (
(x.ControlFlags != m_thisAgentUpdateArgs.ControlFlags) // significant if control flags changed
- || (x.ControlFlags & ~(uint)AgentManager.ControlFlags.AGENT_CONTROL_FINISH_ANIM) != (uint)AgentManager.ControlFlags.NONE
|| (x.Flags != m_thisAgentUpdateArgs.Flags) // significant if Flags changed
|| (x.State != m_thisAgentUpdateArgs.State) // significant if Stats changed
|| (MathF.Abs(x.Far - m_thisAgentUpdateArgs.Far) >= 32f) // significant if far distance changed
@@ -8538,6 +8532,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// Can only be called by one thread at a time
///
///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
private bool CheckAgentCameraUpdateSignificance(AgentUpdatePacket.AgentDataBlock x)
{
return (MathF.Abs(x.CameraCenter.X - m_thisAgentUpdateArgs.CameraCenter.X) > VDELTA ||
@@ -8575,26 +8570,28 @@ namespace OpenSim.Region.ClientStack.LindenUDP
c.m_thisAgentUpdateArgs.lastpacketSequence = seq;
- c.OnPreAgentUpdate?.Invoke(c, c.m_thisAgentUpdateArgs);
-
bool movement;
bool camera;
double now = Util.GetTimeStampMS();
- if(now - c.m_thisAgentUpdateArgs.lastUpdateTS > 500.0) // at least 2 per sec
+ if (now - c.m_thisAgentUpdateArgs.lastUpdateTS > 500.0) // at least 2 per sec
{
movement = true;
camera = true;
}
else
{
- movement = c.CheckAgentMovementUpdateSignificance(x);
+ movement = c.CheckAgentMovementUpdateSignificance(x, now);
camera = c.CheckAgentCameraUpdateSignificance(x);
}
+ c.OnPreAgentUpdate?.Invoke(c, c.m_thisAgentUpdateArgs);
+
// Was there a significant movement/state change?
if (movement)
{
+ c.m_thisAgentUpdateArgs.lastMoveUpdateTS = now;
+
c.m_thisAgentUpdateArgs.BodyRotation = x.BodyRotation;
c.m_thisAgentUpdateArgs.ControlFlags = x.ControlFlags;
c.m_thisAgentUpdateArgs.Far = x.Far;