From 588361e2a2398b963871762c2b5485c6a086cf47 Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Fri, 23 Oct 2009 01:02:36 -0700
Subject: Experimental change to use an immutable array for iterating
ScenePresences, avoiding locking and copying the list each time it is
accessed
---
OpenSim/Region/Framework/Scenes/Scene.cs | 25 ++--
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 160 +++++++++++----------
OpenSim/Region/Framework/Scenes/SceneManager.cs | 53 +++----
.../Region/Framework/Scenes/SceneObjectGroup.cs | 4 +-
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 121 ++++++++--------
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 21 +--
6 files changed, 198 insertions(+), 186 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 4b87f92..d5e3445 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -253,7 +253,7 @@ namespace OpenSim.Region.Framework.Scenes
protected int m_fps = 10;
protected int m_frame = 0;
protected float m_timespan = 0.089f;
- protected DateTime m_lastupdate = DateTime.Now;
+ protected DateTime m_lastupdate = DateTime.UtcNow;
private int m_update_physics = 1;
private int m_update_entitymovement = 1;
@@ -1014,7 +1014,7 @@ namespace OpenSim.Region.Framework.Scenes
//#endif
maintc = Environment.TickCount;
- TimeSpan SinceLastFrame = DateTime.Now - m_lastupdate;
+ TimeSpan SinceLastFrame = DateTime.UtcNow - m_lastupdate;
float physicsFPS = 0;
frameMS = Environment.TickCount;
@@ -1137,7 +1137,7 @@ namespace OpenSim.Region.Framework.Scenes
}
m_timedilation = tmpval;
- m_lastupdate = DateTime.Now;
+ m_lastupdate = DateTime.UtcNow;
}
maintc = Environment.TickCount - maintc;
maintc = (int)(m_timespan * 1000) - maintc;
@@ -3496,9 +3496,7 @@ namespace OpenSim.Region.Framework.Scenes
public virtual void AgentCrossing(UUID agentID, Vector3 position, bool isFlying)
{
ScenePresence presence;
-
- lock (m_sceneGraph.ScenePresences)
- m_sceneGraph.ScenePresences.TryGetValue(agentID, out presence);
+ m_sceneGraph.TryGetAvatar(agentID, out presence);
if (presence != null)
{
@@ -3709,8 +3707,7 @@ namespace OpenSim.Region.Framework.Scenes
Vector3 lookAt, uint teleportFlags)
{
ScenePresence sp;
- lock (m_sceneGraph.ScenePresences)
- m_sceneGraph.ScenePresences.TryGetValue(remoteClient.AgentId, out sp);
+ m_sceneGraph.TryGetAvatar(remoteClient.AgentId, out sp);
if (sp != null)
{
@@ -4112,7 +4109,7 @@ namespace OpenSim.Region.Framework.Scenes
/// This list is a new object, so it can be iterated over without locking.
///
///
- public List GetScenePresences()
+ public ScenePresence[] GetScenePresences()
{
return m_sceneGraph.GetScenePresences();
}
@@ -4159,15 +4156,13 @@ namespace OpenSim.Region.Framework.Scenes
public void ForEachScenePresence(Action action)
{
// We don't want to try to send messages if there are no avatars.
- if (m_sceneGraph != null && m_sceneGraph.ScenePresences != null)
+ if (m_sceneGraph != null)
{
try
{
- List presenceList = GetScenePresences();
- foreach (ScenePresence presence in presenceList)
- {
- action(presence);
- }
+ ScenePresence[] presences = GetScenePresences();
+ for (int i = 0; i < presences.Length; i++)
+ action(presences[i]);
}
catch (Exception e)
{
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index deee6c3..db055f9 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -66,7 +66,9 @@ namespace OpenSim.Region.Framework.Scenes
#region Fields
- protected internal Dictionary ScenePresences = new Dictionary();
+ protected Dictionary m_scenePresences = new Dictionary();
+ protected ScenePresence[] m_scenePresenceArray = new ScenePresence[0];
+
// SceneObjects is not currently populated or used.
//public Dictionary SceneObjects;
protected internal EntityManager Entities = new EntityManager();
@@ -126,10 +128,12 @@ namespace OpenSim.Region.Framework.Scenes
protected internal void Close()
{
- lock (ScenePresences)
+ lock (m_scenePresences)
{
- ScenePresences.Clear();
+ m_scenePresences.Clear();
+ m_scenePresenceArray = new ScenePresence[0];
}
+
lock (m_dictionary_lock)
{
SceneObjectGroupsByFullID.Clear();
@@ -157,11 +161,9 @@ namespace OpenSim.Region.Framework.Scenes
protected internal void UpdatePresences()
{
- List updateScenePresences = GetScenePresences();
- foreach (ScenePresence pres in updateScenePresences)
- {
- pres.Update();
- }
+ ScenePresence[] updateScenePresences = GetScenePresences();
+ for (int i = 0; i < updateScenePresences.Length; i++)
+ updateScenePresences[i].Update();
}
protected internal float UpdatePhysics(double elapsed)
@@ -190,15 +192,9 @@ namespace OpenSim.Region.Framework.Scenes
protected internal void UpdateScenePresenceMovement()
{
- List moveEntities = GetScenePresences();
-
- foreach (EntityBase entity in moveEntities)
- {
- //cfk. This throws occaisional exceptions on a heavily used region
- //and I added this null check to try to preclude the exception.
- if (entity != null)
- entity.UpdateMovement();
- }
+ ScenePresence[] moveEntities = GetScenePresences();
+ for (int i = 0; i < moveEntities.Length; i++)
+ moveEntities[i].UpdateMovement();
}
#endregion
@@ -645,9 +641,34 @@ namespace OpenSim.Region.Framework.Scenes
Entities[presence.UUID] = presence;
- lock (ScenePresences)
+ lock (m_scenePresences)
{
- ScenePresences[presence.UUID] = presence;
+ if (!m_scenePresences.ContainsKey(presence.UUID))
+ {
+ m_scenePresences.Add(presence.UUID, presence);
+
+ // Create a new array of ScenePresence references
+ int oldLength = m_scenePresenceArray.Length;
+ ScenePresence[] newArray = new ScenePresence[oldLength + 1];
+ Array.Copy(m_scenePresenceArray, newArray, oldLength);
+ newArray[oldLength] = presence;
+ m_scenePresenceArray = newArray;
+ }
+ else
+ {
+ m_scenePresences[presence.UUID] = presence;
+
+ // Do a linear search through the array of ScenePresence references
+ // and update the modified entry
+ for (int i = 0; i < m_scenePresenceArray.Length; i++)
+ {
+ if (m_scenePresenceArray[i].UUID == presence.UUID)
+ {
+ m_scenePresenceArray[i] = presence;
+ break;
+ }
+ }
+ }
}
}
@@ -663,16 +684,30 @@ namespace OpenSim.Region.Framework.Scenes
agentID);
}
- lock (ScenePresences)
+ lock (m_scenePresences)
{
- if (!ScenePresences.Remove(agentID))
+ if (m_scenePresences.Remove(agentID))
+ {
+ // Copy all of the elements from the previous array
+ // into the new array except the removed element
+ int oldLength = m_scenePresenceArray.Length;
+ ScenePresence[] newArray = new ScenePresence[oldLength - 1];
+ int j = 0;
+ for (int i = 0; i < m_scenePresenceArray.Length; i++)
+ {
+ ScenePresence presence = m_scenePresenceArray[i];
+ if (presence.UUID != agentID)
+ {
+ newArray[j] = presence;
+ ++j;
+ }
+ }
+ m_scenePresenceArray = newArray;
+ }
+ else
{
m_log.WarnFormat("[SCENE] Tried to remove non-existent scene presence with agent ID {0} from scene ScenePresences list", agentID);
}
-// else
-// {
-// m_log.InfoFormat("[SCENE] Removed scene presence {0} from scene presences list", agentID);
-// }
}
}
@@ -704,20 +739,21 @@ namespace OpenSim.Region.Framework.Scenes
public void RecalculateStats()
{
- List SPList = GetScenePresences();
+ ScenePresence[] presences = GetScenePresences();
int rootcount = 0;
int childcount = 0;
- foreach (ScenePresence user in SPList)
+ for (int i = 0; i < presences.Length; i++)
{
+ ScenePresence user = presences[i];
if (user.IsChildAgent)
- childcount++;
+ ++childcount;
else
- rootcount++;
+ ++rootcount;
}
+
m_numRootAgents = rootcount;
m_numChildAgents = childcount;
-
}
public int GetChildAgentCount()
@@ -767,12 +803,9 @@ namespace OpenSim.Region.Framework.Scenes
/// locking is required to iterate over it.
///
///
- protected internal List GetScenePresences()
+ protected internal ScenePresence[] GetScenePresences()
{
- lock (ScenePresences)
- {
- return new List(ScenePresences.Values);
- }
+ return m_scenePresenceArray;
}
protected internal List GetAvatars()
@@ -817,14 +850,13 @@ namespace OpenSim.Region.Framework.Scenes
// No locking of scene presences here since we're passing back a list...
List result = new List();
- List ScenePresencesList = GetScenePresences();
+ ScenePresence[] scenePresences = GetScenePresences();
- foreach (ScenePresence avatar in ScenePresencesList)
+ for (int i = 0; i < scenePresences.Length; i++)
{
+ ScenePresence avatar = scenePresences[i];
if (filter(avatar))
- {
result.Add(avatar);
- }
}
return result;
@@ -839,9 +871,9 @@ namespace OpenSim.Region.Framework.Scenes
{
ScenePresence sp;
- lock (ScenePresences)
+ lock (m_scenePresences)
{
- ScenePresences.TryGetValue(agentID, out sp);
+ m_scenePresences.TryGetValue(agentID, out sp);
}
return sp;
@@ -1000,48 +1032,24 @@ namespace OpenSim.Region.Framework.Scenes
protected internal bool TryGetAvatar(UUID avatarId, out ScenePresence avatar)
{
- ScenePresence presence;
-
- lock (ScenePresences)
- {
- if (ScenePresences.TryGetValue(avatarId, out presence))
- {
- avatar = presence;
- return true;
-
- //if (!presence.IsChildAgent)
- //{
- // avatar = presence;
- // return true;
- //}
- //else
- //{
- // m_log.WarnFormat(
- // "[INNER SCENE]: Requested avatar {0} could not be found in scene {1} since it is only registered as a child agent!",
- // avatarId, m_parentScene.RegionInfo.RegionName);
- //}
- }
- }
-
- avatar = null;
- return false;
+ lock (m_scenePresences)
+ return m_scenePresences.TryGetValue(avatarId, out avatar);
}
protected internal bool TryGetAvatarByName(string avatarName, out ScenePresence avatar)
{
- lock (ScenePresences)
+ ScenePresence[] presences = GetScenePresences();
+
+ for (int i = 0; i < presences.Length; i++)
{
- foreach (ScenePresence presence in ScenePresences.Values)
+ ScenePresence presence = presences[i];
+
+ if (!presence.IsChildAgent)
{
- if (!presence.IsChildAgent)
+ if (String.Compare(avatarName, presence.ControllingClient.Name, true) == 0)
{
- string name = presence.ControllingClient.Name;
-
- if (String.Compare(avatarName, name, true) == 0)
- {
- avatar = presence;
- return true;
- }
+ avatar = presence;
+ return true;
}
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneManager.cs b/OpenSim/Region/Framework/Scenes/SceneManager.cs
index 3097929..dfaa7ea 100644
--- a/OpenSim/Region/Framework/Scenes/SceneManager.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneManager.cs
@@ -411,41 +411,46 @@ namespace OpenSim.Region.Framework.Scenes
///
public void SetDebugPacketLevelOnCurrentScene(int newDebug)
{
- ForEachCurrentScene(delegate(Scene scene)
- {
- List scenePresences = scene.GetScenePresences();
+ ForEachCurrentScene(
+ delegate(Scene scene)
+ {
+ ScenePresence[] scenePresences = scene.GetScenePresences();
+
+ for (int i = 0; i < scenePresences.Length; i++)
+ {
+ ScenePresence scenePresence = scenePresences[i];
- foreach (ScenePresence scenePresence in scenePresences)
- {
- if (!scenePresence.IsChildAgent)
- {
- m_log.ErrorFormat("Packet debug for {0} {1} set to {2}",
- scenePresence.Firstname,
- scenePresence.Lastname,
- newDebug);
+ if (!scenePresence.IsChildAgent)
+ {
+ m_log.ErrorFormat("Packet debug for {0} {1} set to {2}",
+ scenePresence.Firstname,
+ scenePresence.Lastname,
+ newDebug);
- scenePresence.ControllingClient.SetDebugPacketLevel(newDebug);
- }
- }
- });
+ scenePresence.ControllingClient.SetDebugPacketLevel(newDebug);
+ }
+ }
+ }
+ );
}
public List GetCurrentSceneAvatars()
{
List avatars = new List();
- ForEachCurrentScene(delegate(Scene scene)
- {
- List scenePresences = scene.GetScenePresences();
-
- foreach (ScenePresence scenePresence in scenePresences)
+ ForEachCurrentScene(
+ delegate(Scene scene)
{
- if (!scenePresence.IsChildAgent)
+ ScenePresence[] scenePresences = scene.GetScenePresences();
+
+ for (int i = 0; i < scenePresences.Length; i++)
{
- avatars.Add(scenePresence);
+ ScenePresence scenePresence = scenePresences[i];
+ if (!scenePresence.IsChildAgent)
+ avatars.Add(scenePresence);
}
}
- });
+ );
return avatars;
}
@@ -456,7 +461,7 @@ namespace OpenSim.Region.Framework.Scenes
ForEachCurrentScene(delegate(Scene scene)
{
- List scenePresences = scene.GetScenePresences();
+ ScenePresence[] scenePresences = scene.GetScenePresences();
presences.AddRange(scenePresences);
});
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 69b3ded..4f19761 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1182,8 +1182,8 @@ namespace OpenSim.Region.Framework.Scenes
{
// part.Inventory.RemoveScriptInstances();
- List avatars = Scene.GetScenePresences();
- for (int i = 0; i < avatars.Count; i++)
+ ScenePresence[] avatars = Scene.GetScenePresences();
+ for (int i = 0; i < avatars.Length; i++)
{
if (avatars[i].ParentID == LocalId)
{
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 32171a0..7193002 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -1077,8 +1077,8 @@ if (m_shape != null) {
private void SendObjectPropertiesToClient(UUID AgentID)
{
- List avatars = m_parentGroup.Scene.GetScenePresences();
- for (int i = 0; i < avatars.Count; i++)
+ ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences();
+ for (int i = 0; i < avatars.Length; i++)
{
// Ugly reference :(
if (avatars[i].UUID == AgentID)
@@ -1140,8 +1140,8 @@ if (m_shape != null) {
///
public void AddFullUpdateToAllAvatars()
{
- List avatars = m_parentGroup.Scene.GetScenePresences();
- for (int i = 0; i < avatars.Count; i++)
+ ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences();
+ for (int i = 0; i < avatars.Length; i++)
{
avatars[i].SceneViewer.QueuePartForUpdate(this);
}
@@ -1165,8 +1165,8 @@ if (m_shape != null) {
/// Terse updates
public void AddTerseUpdateToAllAvatars()
{
- List avatars = m_parentGroup.Scene.GetScenePresences();
- for (int i = 0; i < avatars.Count; i++)
+ ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences();
+ for (int i = 0; i < avatars.Length; i++)
{
avatars[i].SceneViewer.QueuePartForUpdate(this);
}
@@ -1894,24 +1894,24 @@ if (m_shape != null) {
}
else
{
- List avlist = m_parentGroup.Scene.GetScenePresences();
- if (avlist != null)
+ ScenePresence[] avlist = m_parentGroup.Scene.GetScenePresences();
+
+ for (int i = 0; i < avlist.Length; i++)
{
- foreach (ScenePresence av in avlist)
+ ScenePresence av = avlist[i];
+
+ if (av.LocalId == localId)
{
- if (av.LocalId == localId)
- {
- DetectedObject detobj = new DetectedObject();
- detobj.keyUUID = av.UUID;
- detobj.nameStr = av.ControllingClient.Name;
- detobj.ownerUUID = av.UUID;
- detobj.posVector = av.AbsolutePosition;
- detobj.rotQuat = av.Rotation;
- detobj.velVector = av.Velocity;
- detobj.colliderType = 0;
- detobj.groupUUID = av.ControllingClient.ActiveGroupId;
- colliding.Add(detobj);
- }
+ DetectedObject detobj = new DetectedObject();
+ detobj.keyUUID = av.UUID;
+ detobj.nameStr = av.ControllingClient.Name;
+ detobj.ownerUUID = av.UUID;
+ detobj.posVector = av.AbsolutePosition;
+ detobj.rotQuat = av.Rotation;
+ detobj.velVector = av.Velocity;
+ detobj.colliderType = 0;
+ detobj.groupUUID = av.ControllingClient.ActiveGroupId;
+ colliding.Add(detobj);
}
}
}
@@ -1965,26 +1965,25 @@ if (m_shape != null) {
}
else
{
- List avlist = m_parentGroup.Scene.GetScenePresences();
- if (avlist != null)
+ ScenePresence[] avlist = m_parentGroup.Scene.GetScenePresences();
+
+ for (int i = 0; i < avlist.Length; i++)
{
- foreach (ScenePresence av in avlist)
+ ScenePresence av = avlist[i];
+
+ if (av.LocalId == localId)
{
- if (av.LocalId == localId)
- {
- DetectedObject detobj = new DetectedObject();
- detobj.keyUUID = av.UUID;
- detobj.nameStr = av.Name;
- detobj.ownerUUID = av.UUID;
- detobj.posVector = av.AbsolutePosition;
- detobj.rotQuat = av.Rotation;
- detobj.velVector = av.Velocity;
- detobj.colliderType = 0;
- detobj.groupUUID = av.ControllingClient.ActiveGroupId;
- colliding.Add(detobj);
- }
+ DetectedObject detobj = new DetectedObject();
+ detobj.keyUUID = av.UUID;
+ detobj.nameStr = av.Name;
+ detobj.ownerUUID = av.UUID;
+ detobj.posVector = av.AbsolutePosition;
+ detobj.rotQuat = av.Rotation;
+ detobj.velVector = av.Velocity;
+ detobj.colliderType = 0;
+ detobj.groupUUID = av.ControllingClient.ActiveGroupId;
+ colliding.Add(detobj);
}
-
}
}
}
@@ -2035,24 +2034,24 @@ if (m_shape != null) {
}
else
{
- List avlist = m_parentGroup.Scene.GetScenePresences();
- if (avlist != null)
+ ScenePresence[] avlist = m_parentGroup.Scene.GetScenePresences();
+
+ for (int i = 0; i < avlist.Length; i++)
{
- foreach (ScenePresence av in avlist)
+ ScenePresence av = avlist[i];
+
+ if (av.LocalId == localId)
{
- if (av.LocalId == localId)
- {
- DetectedObject detobj = new DetectedObject();
- detobj.keyUUID = av.UUID;
- detobj.nameStr = av.Name;
- detobj.ownerUUID = av.UUID;
- detobj.posVector = av.AbsolutePosition;
- detobj.rotQuat = av.Rotation;
- detobj.velVector = av.Velocity;
- detobj.colliderType = 0;
- detobj.groupUUID = av.ControllingClient.ActiveGroupId;
- colliding.Add(detobj);
- }
+ DetectedObject detobj = new DetectedObject();
+ detobj.keyUUID = av.UUID;
+ detobj.nameStr = av.Name;
+ detobj.ownerUUID = av.UUID;
+ detobj.posVector = av.AbsolutePosition;
+ detobj.rotQuat = av.Rotation;
+ detobj.velVector = av.Velocity;
+ detobj.colliderType = 0;
+ detobj.groupUUID = av.ControllingClient.ActiveGroupId;
+ colliding.Add(detobj);
}
}
}
@@ -2312,8 +2311,8 @@ if (m_shape != null) {
///
public void SendFullUpdateToAllClients()
{
- List avatars = m_parentGroup.Scene.GetScenePresences();
- for (int i = 0; i < avatars.Count; i++)
+ ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences();
+ for (int i = 0; i < avatars.Length; i++)
{
// Ugly reference :(
m_parentGroup.SendPartFullUpdate(avatars[i].ControllingClient, this,
@@ -2323,8 +2322,8 @@ if (m_shape != null) {
public void SendFullUpdateToAllClientsExcept(UUID agentID)
{
- List avatars = m_parentGroup.Scene.GetScenePresences();
- for (int i = 0; i < avatars.Count; i++)
+ ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences();
+ for (int i = 0; i < avatars.Length; i++)
{
// Ugly reference :(
if (avatars[i].UUID != agentID)
@@ -2467,8 +2466,8 @@ if (m_shape != null) {
///
public void SendTerseUpdateToAllClients()
{
- List avatars = m_parentGroup.Scene.GetScenePresences();
- for (int i = 0; i < avatars.Count; i++)
+ ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences();
+ for (int i = 0; i < avatars.Length; i++)
{
SendTerseUpdateToClient(avatars[i].ControllingClient);
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index ccfffe7..77706ac 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -869,14 +869,16 @@ namespace OpenSim.Region.Framework.Scenes
m_isChildAgent = false;
- List AnimAgents = m_scene.GetScenePresences();
- foreach (ScenePresence p in AnimAgents)
+ ScenePresence[] animAgents = m_scene.GetScenePresences();
+ for (int i = 0; i < animAgents.Length; i++)
{
- if (p != this)
- p.SendAnimPackToClient(ControllingClient);
+ ScenePresence presence = animAgents[i];
+
+ if (presence != this)
+ presence.SendAnimPackToClient(ControllingClient);
}
- m_scene.EventManager.TriggerOnMakeRootAgent(this);
+ m_scene.EventManager.TriggerOnMakeRootAgent(this);
}
///
@@ -2533,9 +2535,12 @@ namespace OpenSim.Region.Framework.Scenes
{
m_perfMonMS = Environment.TickCount;
- List avatars = m_scene.GetScenePresences();
- foreach (ScenePresence avatar in avatars)
+ ScenePresence[] avatars = m_scene.GetScenePresences();
+
+ for (int i = 0; i < avatars.Length; i++)
{
+ ScenePresence avatar = avatars[i];
+
// only send if this is the root (children are only "listening posts" in a foreign region)
if (!IsChildAgent)
{
@@ -2553,7 +2558,7 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- m_scene.StatsReporter.AddAgentUpdates(avatars.Count);
+ m_scene.StatsReporter.AddAgentUpdates(avatars.Length);
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
//SendAnimPack();
--
cgit v1.1