From cde3c20ba3f4f506fc69d3db54171f88223219aa Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Fri, 5 Mar 2010 17:01:31 -0800
Subject: * Fixed an order of operations bug in CheckForSignificantMovement()
that was causing a flood of child updates to neighbors on login * Removed an
unnecessary call to the presence service
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
(limited to 'OpenSim')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 465e916..4256be9 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2675,6 +2675,9 @@ namespace OpenSim.Region.Framework.Scenes
if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance ||
Util.GetDistanceTo(CameraPosition, m_lastChildAgentUpdateCamPosition) >= Scene.ChildReprioritizationDistance)
{
+ m_lastChildAgentUpdatePosition = AbsolutePosition;
+ m_lastChildAgentUpdateCamPosition = CameraPosition;
+
ChildAgentDataUpdate cadu = new ChildAgentDataUpdate();
cadu.ActiveGroupID = UUID.Zero.Guid;
cadu.AgentID = UUID.Guid;
@@ -2683,8 +2686,6 @@ namespace OpenSim.Region.Framework.Scenes
Vector3 tempCameraCenter = m_CameraCenter;
cadu.cameraPosition = tempCameraCenter;
cadu.drawdistance = m_DrawDistance;
- if (m_scene.Permissions.IsGod(new UUID(cadu.AgentID)))
- cadu.godlevel = m_godlevel;
cadu.GroupAccess = 0;
cadu.Position = AbsolutePosition;
cadu.regionHandle = m_rootRegionHandle;
@@ -2707,9 +2708,6 @@ namespace OpenSim.Region.Framework.Scenes
agentpos.CopyFrom(cadu);
m_scene.SendOutChildAgentUpdates(agentpos, this);
-
- m_lastChildAgentUpdatePosition = AbsolutePosition;
- m_lastChildAgentUpdateCamPosition = CameraPosition;
}
}
--
cgit v1.1
From 36afd0bfd1f80131a9f8dd72cc8b3eb71f060e02 Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Fri, 5 Mar 2010 17:04:20 -0800
Subject: * Cache packed throttle data to avoid repeated allocations in
CheckForSignificantMovement() * Removed a lock on "return m_neighbours.Count"
in GetInaccurateNeighborCount(). Dictionary<>.Count by itself does not
benefit from locking
---
.../Region/ClientStack/LindenUDP/LLUDPClient.cs | 35 +++++++++++++++-------
OpenSim/Region/Framework/Scenes/Scene.cs | 5 +---
2 files changed, 25 insertions(+), 15 deletions(-)
(limited to 'OpenSim')
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
index 55d9c9c..6232c48 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
@@ -144,6 +144,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// A reference to the LLUDPServer that is managing this client
private readonly LLUDPServer m_udpServer;
+ /// Caches packed throttle information
+ private byte[] m_packedThrottles;
+
private int m_defaultRTO = 3000;
private int m_maxRTO = 60000;
@@ -350,21 +353,31 @@ namespace OpenSim.Region.ClientStack.LindenUDP
bucket = m_throttleCategories[(int)ThrottleOutPacketType.Texture];
bucket.DripRate = texture;
bucket.MaxBurst = texture;
+
+ // Reset the packed throttles cached data
+ m_packedThrottles = null;
}
public byte[] GetThrottlesPacked()
{
- byte[] data = new byte[7 * 4];
- int i = 0;
-
- Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Resend].DripRate), 0, data, i, 4); i += 4;
- Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Land].DripRate), 0, data, i, 4); i += 4;
- Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Wind].DripRate), 0, data, i, 4); i += 4;
- Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Cloud].DripRate), 0, data, i, 4); i += 4;
- Buffer.BlockCopy(Utils.FloatToBytes((float)(m_throttleCategories[(int)ThrottleOutPacketType.Task].DripRate) +
- m_throttleCategories[(int)ThrottleOutPacketType.State].DripRate), 0, data, i, 4); i += 4;
- Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Texture].DripRate), 0, data, i, 4); i += 4;
- Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Asset].DripRate), 0, data, i, 4); i += 4;
+ byte[] data = m_packedThrottles;
+
+ if (data == null)
+ {
+ data = new byte[7 * 4];
+ int i = 0;
+
+ Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Resend].DripRate), 0, data, i, 4); i += 4;
+ Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Land].DripRate), 0, data, i, 4); i += 4;
+ Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Wind].DripRate), 0, data, i, 4); i += 4;
+ Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Cloud].DripRate), 0, data, i, 4); i += 4;
+ Buffer.BlockCopy(Utils.FloatToBytes((float)(m_throttleCategories[(int)ThrottleOutPacketType.Task].DripRate) +
+ m_throttleCategories[(int)ThrottleOutPacketType.State].DripRate), 0, data, i, 4); i += 4;
+ Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Texture].DripRate), 0, data, i, 4); i += 4;
+ Buffer.BlockCopy(Utils.FloatToBytes((float)m_throttleCategories[(int)ThrottleOutPacketType.Asset].DripRate), 0, data, i, 4); i += 4;
+
+ m_packedThrottles = data;
+ }
return data;
}
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index a880fe7..8f9663c 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1132,10 +1132,7 @@ namespace OpenSim.Region.Framework.Scenes
public int GetInaccurateNeighborCount()
{
- lock (m_neighbours)
- {
- return m_neighbours.Count;
- }
+ return m_neighbours.Count;
}
// This is the method that shuts down the scene.
--
cgit v1.1