diff options
author | dahlia | 2011-04-26 16:22:44 -0700 |
---|---|---|
committer | dahlia | 2011-04-26 16:22:44 -0700 |
commit | 16f6f55f2d203f9ef40fba85860bb9dbd416bd0f (patch) | |
tree | 9e009bd66fb934ee47e292e8e871911df0ca723c /OpenSim/Region/Framework | |
parent | Add back the high prioritization for other avatars in the (diff) | |
download | opensim-SC_OLD-16f6f55f2d203f9ef40fba85860bb9dbd416bd0f.zip opensim-SC_OLD-16f6f55f2d203f9ef40fba85860bb9dbd416bd0f.tar.gz opensim-SC_OLD-16f6f55f2d203f9ef40fba85860bb9dbd416bd0f.tar.bz2 opensim-SC_OLD-16f6f55f2d203f9ef40fba85860bb9dbd416bd0f.tar.xz |
network traffic reduction - decrease update frequency for moving avatars when velocity is unchanged
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index ef0eb89..e4413a9 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -2340,12 +2340,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
2340 | 2340 | ||
2341 | #region Update Client(s) | 2341 | #region Update Client(s) |
2342 | 2342 | ||
2343 | |||
2343 | /// <summary> | 2344 | /// <summary> |
2344 | /// Sends a location update to the client connected to this scenePresence | 2345 | /// Sends a location update to the client connected to this scenePresence |
2345 | /// </summary> | 2346 | /// </summary> |
2346 | /// <param name="remoteClient"></param> | 2347 | /// <param name="remoteClient"></param> |
2347 | public void SendTerseUpdateToClient(IClientAPI remoteClient) | 2348 | public void SendTerseUpdateToClient(IClientAPI remoteClient) |
2348 | { | 2349 | { |
2350 | |||
2349 | // If the client is inactive, it's getting its updates from another | 2351 | // If the client is inactive, it's getting its updates from another |
2350 | // server. | 2352 | // server. |
2351 | if (remoteClient.IsActive) | 2353 | if (remoteClient.IsActive) |
@@ -2358,8 +2360,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2358 | //m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity); | 2360 | //m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity); |
2359 | 2361 | ||
2360 | remoteClient.SendPrimUpdate( | 2362 | remoteClient.SendPrimUpdate( |
2361 | this, | 2363 | this, |
2362 | PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | 2364 | PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity |
2363 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity); | 2365 | | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity); |
2364 | 2366 | ||
2365 | m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); | 2367 | m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); |
@@ -2367,16 +2369,31 @@ namespace OpenSim.Region.Framework.Scenes | |||
2367 | } | 2369 | } |
2368 | } | 2370 | } |
2369 | 2371 | ||
2372 | |||
2373 | // vars to support reduced update frequency when velocity is unchanged | ||
2374 | private Vector3 lastVelocitySentToAllClients = Vector3.Zero; | ||
2375 | private int lastTerseUpdateToAllClientsTick = Util.EnvironmentTickCount(); | ||
2376 | |||
2370 | /// <summary> | 2377 | /// <summary> |
2371 | /// Send a location/velocity/accelleration update to all agents in scene | 2378 | /// Send a location/velocity/accelleration update to all agents in scene |
2372 | /// </summary> | 2379 | /// </summary> |
2373 | public void SendTerseUpdateToAllClients() | 2380 | public void SendTerseUpdateToAllClients() |
2374 | { | 2381 | { |
2375 | m_perfMonMS = Util.EnvironmentTickCount(); | 2382 | int currentTick = Util.EnvironmentTickCount(); |
2376 | |||
2377 | m_scene.ForEachClient(SendTerseUpdateToClient); | ||
2378 | 2383 | ||
2379 | m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); | 2384 | // decrease update frequency when avatar is moving but velocity is not changing |
2385 | if (m_velocity.Length() < 0.01f | ||
2386 | || Vector3.Distance(lastVelocitySentToAllClients, m_velocity) > 0.01f | ||
2387 | || currentTick - lastTerseUpdateToAllClientsTick > 1500) | ||
2388 | { | ||
2389 | m_perfMonMS = currentTick; | ||
2390 | lastVelocitySentToAllClients = m_velocity; | ||
2391 | lastTerseUpdateToAllClientsTick = currentTick; | ||
2392 | |||
2393 | m_scene.ForEachClient(SendTerseUpdateToClient); | ||
2394 | |||
2395 | m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); | ||
2396 | } | ||
2380 | } | 2397 | } |
2381 | 2398 | ||
2382 | public void SendCoarseLocations(List<Vector3> coarseLocations, List<UUID> avatarUUIDs) | 2399 | public void SendCoarseLocations(List<Vector3> coarseLocations, List<UUID> avatarUUIDs) |
@@ -3268,10 +3285,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3268 | 3285 | ||
3269 | m_updateflag = true; | 3286 | m_updateflag = true; |
3270 | 3287 | ||
3271 | // The magic constant 0.95f seems to make walking feel less jerky, | 3288 | Velocity = force; |
3272 | // probably because it hackishly accounts for the overall latency of | ||
3273 | // these Velocity updates -- Diva | ||
3274 | Velocity = force * .95F; | ||
3275 | 3289 | ||
3276 | m_forceToApply = null; | 3290 | m_forceToApply = null; |
3277 | } | 3291 | } |