From 13ab00e45a1e52b4668a472130eb83cdf45850ca Mon Sep 17 00:00:00 2001 From: dahlia Date: Tue, 3 May 2011 19:47:50 -0700 Subject: [PATCH] adjust terse avatar update filtering to send updates when distance traveled does not match expected distance, rather than at a fixed time period. this should smooth avatar motion somewhat when moving in a straight line and velocity is constant. --- .../Region/Framework/Scenes/ScenePresence.cs | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 5b86735ef3..feab35cbd7 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -2395,6 +2395,7 @@ namespace OpenSim.Region.Framework.Scenes // vars to support reduced update frequency when velocity is unchanged private Vector3 lastVelocitySentToAllClients = Vector3.Zero; + private Vector3 lastPositionSentToAllClients = Vector3.Zero; private int lastTerseUpdateToAllClientsTick = Util.EnvironmentTickCount(); /// @@ -2404,14 +2405,27 @@ namespace OpenSim.Region.Framework.Scenes { int currentTick = Util.EnvironmentTickCount(); - // decrease update frequency when avatar is moving but velocity is not changing + // Decrease update frequency when avatar is moving but velocity is + // not changing. + // If there is a mismatch between distance travelled and expected + // distance based on last velocity sent and velocity hasnt changed, + // then send a new terse update + + float timeSinceLastUpdate = (currentTick - lastTerseUpdateToAllClientsTick) * 0.001f; + + Vector3 expectedPosition = lastPositionSentToAllClients + lastVelocitySentToAllClients * timeSinceLastUpdate; + + float absoluteDistanceError = (float)Math.Abs(Vector3.Distance(m_pos, expectedPosition)); + + if (m_velocity.Length() < 0.01f - || Vector3.Distance(lastVelocitySentToAllClients, m_velocity) > 0.01f - || currentTick - lastTerseUpdateToAllClientsTick > 1500) + || absoluteDistanceError > 0.25f // arbitrary distance error threshold + || Vector3.Distance(lastVelocitySentToAllClients, m_velocity) > 0.01f) { m_perfMonMS = currentTick; lastVelocitySentToAllClients = m_velocity; lastTerseUpdateToAllClientsTick = currentTick; + lastPositionSentToAllClients = m_pos; m_scene.ForEachClient(SendTerseUpdateToClient);