Experimental change to use an immutable array for iterating ScenePresences, avoiding locking and copying the list each time it is accessed

0.6.8-post-fixes
John Hurliman 2009-10-23 01:02:36 -07:00
parent 96d53f11e5
commit 588361e2a2
13 changed files with 312 additions and 288 deletions

View File

@ -4434,6 +4434,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
protected virtual void RegisterLocalPacketHandlers()
{
AddLocalPacketHandler(PacketType.LogoutRequest, Logout);
AddLocalPacketHandler(PacketType.AgentUpdate, HandleAgentUpdate);
AddLocalPacketHandler(PacketType.ViewerEffect, HandleViewerEffect);
AddLocalPacketHandler(PacketType.AgentCachedTexture, AgentTextureCached);
AddLocalPacketHandler(PacketType.MultipleObjectUpdate, MultipleObjUpdate);
@ -4446,6 +4447,75 @@ namespace OpenSim.Region.ClientStack.LindenUDP
#region Packet Handlers
private bool HandleAgentUpdate(IClientAPI sener, Packet Pack)
{
if (OnAgentUpdate != null)
{
bool update = false;
AgentUpdatePacket agenUpdate = (AgentUpdatePacket)Pack;
#region Packet Session and User Check
if (agenUpdate.AgentData.SessionID != SessionId || agenUpdate.AgentData.AgentID != AgentId)
return false;
#endregion
AgentUpdatePacket.AgentDataBlock x = agenUpdate.AgentData;
// We can only check when we have something to check
// against.
if (lastarg != null)
{
update =
(
(x.BodyRotation != lastarg.BodyRotation) ||
(x.CameraAtAxis != lastarg.CameraAtAxis) ||
(x.CameraCenter != lastarg.CameraCenter) ||
(x.CameraLeftAxis != lastarg.CameraLeftAxis) ||
(x.CameraUpAxis != lastarg.CameraUpAxis) ||
(x.ControlFlags != lastarg.ControlFlags) ||
(x.Far != lastarg.Far) ||
(x.Flags != lastarg.Flags) ||
(x.State != lastarg.State) ||
(x.HeadRotation != lastarg.HeadRotation) ||
(x.SessionID != lastarg.SessionID) ||
(x.AgentID != lastarg.AgentID)
);
}
else
update = true;
// These should be ordered from most-likely to
// least likely to change. I've made an initial
// guess at that.
if (update)
{
AgentUpdateArgs arg = new AgentUpdateArgs();
arg.AgentID = x.AgentID;
arg.BodyRotation = x.BodyRotation;
arg.CameraAtAxis = x.CameraAtAxis;
arg.CameraCenter = x.CameraCenter;
arg.CameraLeftAxis = x.CameraLeftAxis;
arg.CameraUpAxis = x.CameraUpAxis;
arg.ControlFlags = x.ControlFlags;
arg.Far = x.Far;
arg.Flags = x.Flags;
arg.HeadRotation = x.HeadRotation;
arg.SessionID = x.SessionID;
arg.State = x.State;
UpdateAgent handlerAgentUpdate = OnAgentUpdate;
lastarg = arg; // save this set of arguments for nexttime
if (handlerAgentUpdate != null)
OnAgentUpdate(this, arg);
handlerAgentUpdate = null;
}
}
return true;
}
private bool HandleMoneyTransferRequest(IClientAPI sender, Packet Pack)
{
MoneyTransferRequestPacket money = (MoneyTransferRequestPacket)Pack;
@ -5631,77 +5701,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
break;
case PacketType.AgentUpdate:
if (OnAgentUpdate != null)
{
bool update = false;
AgentUpdatePacket agenUpdate = (AgentUpdatePacket)Pack;
#region Packet Session and User Check
if (m_checkPackets)
{
if (agenUpdate.AgentData.SessionID != SessionId ||
agenUpdate.AgentData.AgentID != AgentId)
break;
}
#endregion
AgentUpdatePacket.AgentDataBlock x = agenUpdate.AgentData;
// We can only check when we have something to check
// against.
if (lastarg != null)
{
update =
(
(x.BodyRotation != lastarg.BodyRotation) ||
(x.CameraAtAxis != lastarg.CameraAtAxis) ||
(x.CameraCenter != lastarg.CameraCenter) ||
(x.CameraLeftAxis != lastarg.CameraLeftAxis) ||
(x.CameraUpAxis != lastarg.CameraUpAxis) ||
(x.ControlFlags != lastarg.ControlFlags) ||
(x.Far != lastarg.Far) ||
(x.Flags != lastarg.Flags) ||
(x.State != lastarg.State) ||
(x.HeadRotation != lastarg.HeadRotation) ||
(x.SessionID != lastarg.SessionID) ||
(x.AgentID != lastarg.AgentID)
);
}
else
update = true;
// These should be ordered from most-likely to
// least likely to change. I've made an initial
// guess at that.
if (update)
{
AgentUpdateArgs arg = new AgentUpdateArgs();
arg.AgentID = x.AgentID;
arg.BodyRotation = x.BodyRotation;
arg.CameraAtAxis = x.CameraAtAxis;
arg.CameraCenter = x.CameraCenter;
arg.CameraLeftAxis = x.CameraLeftAxis;
arg.CameraUpAxis = x.CameraUpAxis;
arg.ControlFlags = x.ControlFlags;
arg.Far = x.Far;
arg.Flags = x.Flags;
arg.HeadRotation = x.HeadRotation;
arg.SessionID = x.SessionID;
arg.State = x.State;
UpdateAgent handlerAgentUpdate = OnAgentUpdate;
lastarg = arg; // save this set of arguments for nexttime
if (handlerAgentUpdate != null)
OnAgentUpdate(this, arg);
handlerAgentUpdate = null;
}
}
break;
case PacketType.AgentAnimation:
AgentAnimationPacket AgentAni = (AgentAnimationPacket)Pack;

View File

@ -96,12 +96,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Combat.CombatModule
else
{
bool foundResult = false;
string resultstring = "";
List<ScenePresence> allav = DeadAvatar.Scene.GetScenePresences();
string resultstring = String.Empty;
ScenePresence[] allav = DeadAvatar.Scene.GetScenePresences();
try
{
foreach (ScenePresence av in allav)
for (int i = 0; i < allav.Length; i++)
{
ScenePresence av = allav[i];
if (av.LocalId == killerObjectLocalID)
{
av.ControllingClient.SendAlertMessage("You fragged " + DeadAvatar.Firstname + " " + DeadAvatar.Lastname);

View File

@ -85,10 +85,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog
public void SendAlertToUser(string firstName, string lastName, string message, bool modal)
{
List<ScenePresence> presenceList = m_scene.GetScenePresences();
ScenePresence[] presenceList = m_scene.GetScenePresences();
foreach (ScenePresence presence in presenceList)
for (int i = 0; i < presenceList.Length; i++)
{
ScenePresence presence = presenceList[i];
if (presence.Firstname == firstName && presence.Lastname == lastName)
{
presence.ControllingClient.SendAgentAlertMessage(message, modal);
@ -99,10 +101,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog
public void SendGeneralAlert(string message)
{
List<ScenePresence> presenceList = m_scene.GetScenePresences();
ScenePresence[] presenceList = m_scene.GetScenePresences();
foreach (ScenePresence presence in presenceList)
for (int i = 0; i < presenceList.Length; i++)
{
ScenePresence presence = presenceList[i];
if (!presence.IsChildAgent)
presence.ControllingClient.SendAlertMessage(message);
}
@ -150,10 +154,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog
public void SendNotificationToUsersInRegion(
UUID fromAvatarID, string fromAvatarName, string message)
{
List<ScenePresence> presenceList = m_scene.GetScenePresences();
ScenePresence[] presences = m_scene.GetScenePresences();
foreach (ScenePresence presence in presenceList)
for (int i = 0; i < presences.Length; i++)
{
ScenePresence presence = presences[i];
if (!presence.IsChildAgent)
presence.ControllingClient.SendBlueBoxMessage(fromAvatarID, fromAvatarName, message);
}

View File

@ -414,9 +414,12 @@ namespace OpenSim.Region.CoreModules.World.Estate
private void handleEstateTeleportAllUsersHomeRequest(IClientAPI remover_client, UUID invoice, UUID senderID)
{
// Get a fresh list that will not change as people get teleported away
List<ScenePresence> prescences = m_scene.GetScenePresences();
foreach (ScenePresence p in prescences)
ScenePresence[] presences = m_scene.GetScenePresences();
for (int i = 0; i < presences.Length; i++)
{
ScenePresence p = presences[i];
if (p.UUID != senderID)
{
// make sure they are still there, we could be working down a long list

View File

@ -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.
/// </summary>
/// <returns></returns>
public List<ScenePresence> GetScenePresences()
public ScenePresence[] GetScenePresences()
{
return m_sceneGraph.GetScenePresences();
}
@ -4159,15 +4156,13 @@ namespace OpenSim.Region.Framework.Scenes
public void ForEachScenePresence(Action<ScenePresence> 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<ScenePresence> 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)
{

View File

@ -66,7 +66,9 @@ namespace OpenSim.Region.Framework.Scenes
#region Fields
protected internal Dictionary<UUID, ScenePresence> ScenePresences = new Dictionary<UUID, ScenePresence>();
protected Dictionary<UUID, ScenePresence> m_scenePresences = new Dictionary<UUID, ScenePresence>();
protected ScenePresence[] m_scenePresenceArray = new ScenePresence[0];
// SceneObjects is not currently populated or used.
//public Dictionary<UUID, SceneObjectGroup> 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<ScenePresence> 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<ScenePresence> 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<ScenePresence> 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.
/// </summary>
/// <returns></returns>
protected internal List<ScenePresence> GetScenePresences()
protected internal ScenePresence[] GetScenePresences()
{
lock (ScenePresences)
{
return new List<ScenePresence>(ScenePresences.Values);
}
return m_scenePresenceArray;
}
protected internal List<ScenePresence> GetAvatars()
@ -817,14 +850,13 @@ namespace OpenSim.Region.Framework.Scenes
// No locking of scene presences here since we're passing back a list...
List<ScenePresence> result = new List<ScenePresence>();
List<ScenePresence> 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)
{
foreach (ScenePresence presence in ScenePresences.Values)
{
if (!presence.IsChildAgent)
{
string name = presence.ControllingClient.Name;
ScenePresence[] presences = GetScenePresences();
if (String.Compare(avatarName, name, true) == 0)
{
avatar = presence;
return true;
}
for (int i = 0; i < presences.Length; i++)
{
ScenePresence presence = presences[i];
if (!presence.IsChildAgent)
{
if (String.Compare(avatarName, presence.ControllingClient.Name, true) == 0)
{
avatar = presence;
return true;
}
}
}

View File

@ -411,41 +411,46 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="newDebug"></param>
public void SetDebugPacketLevelOnCurrentScene(int newDebug)
{
ForEachCurrentScene(delegate(Scene scene)
{
List<ScenePresence> scenePresences = scene.GetScenePresences();
ForEachCurrentScene(
delegate(Scene scene)
{
ScenePresence[] scenePresences = scene.GetScenePresences();
foreach (ScenePresence scenePresence in scenePresences)
{
if (!scenePresence.IsChildAgent)
{
m_log.ErrorFormat("Packet debug for {0} {1} set to {2}",
scenePresence.Firstname,
scenePresence.Lastname,
newDebug);
for (int i = 0; i < scenePresences.Length; i++)
{
ScenePresence scenePresence = scenePresences[i];
scenePresence.ControllingClient.SetDebugPacketLevel(newDebug);
}
}
});
if (!scenePresence.IsChildAgent)
{
m_log.ErrorFormat("Packet debug for {0} {1} set to {2}",
scenePresence.Firstname,
scenePresence.Lastname,
newDebug);
scenePresence.ControllingClient.SetDebugPacketLevel(newDebug);
}
}
}
);
}
public List<ScenePresence> GetCurrentSceneAvatars()
{
List<ScenePresence> avatars = new List<ScenePresence>();
ForEachCurrentScene(delegate(Scene scene)
{
List<ScenePresence> 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<ScenePresence> scenePresences = scene.GetScenePresences();
ScenePresence[] scenePresences = scene.GetScenePresences();
presences.AddRange(scenePresences);
});

View File

@ -1182,8 +1182,8 @@ namespace OpenSim.Region.Framework.Scenes
{
// part.Inventory.RemoveScriptInstances();
List<ScenePresence> 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)
{

View File

@ -1077,8 +1077,8 @@ if (m_shape != null) {
private void SendObjectPropertiesToClient(UUID AgentID)
{
List<ScenePresence> 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) {
/// </summary>
public void AddFullUpdateToAllAvatars()
{
List<ScenePresence> 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<ScenePresence> 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<ScenePresence> 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<ScenePresence> 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)
{
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);
}
}
ScenePresence av = avlist[i];
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);
}
}
}
}
@ -2035,24 +2034,24 @@ if (m_shape != null) {
}
else
{
List<ScenePresence> 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) {
/// </summary>
public void SendFullUpdateToAllClients()
{
List<ScenePresence> 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<ScenePresence> 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) {
/// </summary>
public void SendTerseUpdateToAllClients()
{
List<ScenePresence> 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);
}

View File

@ -869,14 +869,16 @@ namespace OpenSim.Region.Framework.Scenes
m_isChildAgent = false;
List<ScenePresence> 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);
}
m_scene.EventManager.TriggerOnMakeRootAgent(this);
ScenePresence presence = animAgents[i];
if (presence != this)
presence.SendAnimPackToClient(ControllingClient);
}
m_scene.EventManager.TriggerOnMakeRootAgent(this);
}
/// <summary>
@ -2533,9 +2535,12 @@ namespace OpenSim.Region.Framework.Scenes
{
m_perfMonMS = Environment.TickCount;
List<ScenePresence> 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();

View File

@ -7227,13 +7227,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public LSL_Integer llGetNumberOfPrims()
{
m_host.AddScriptLPS(1);
List<ScenePresence> presences = World.GetScenePresences();
if (presences.Count == 0)
ScenePresence[] presences = World.GetScenePresences();
if (presences.Length == 0)
return 0;
int avatarCount = 0;
foreach (ScenePresence presence in presences)
for (int i = 0; i < presences.Length; i++)
{
ScenePresence presence = presences[i];
if (!presence.IsChildAgent && presence.ParentID != 0)
{
if (m_host.ParentGroup.HasChildPrim(presence.ParentID))

View File

@ -404,7 +404,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
private List<SensedEntity> doAgentSensor(SenseRepeatClass ts)
{
List<ScenePresence> Presences;
List<ScenePresence> presences;
List<SensedEntity> sensedEntities = new List<SensedEntity>();
// If this is an avatar sense by key try to get them directly
@ -414,16 +414,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
ScenePresence p = m_CmdManager.m_ScriptEngine.World.GetScenePresence(ts.keyID);
if (p == null)
return sensedEntities;
Presences = new List<ScenePresence>();
Presences.Add(p);
presences = new List<ScenePresence>();
presences.Add(p);
}
else
{
Presences = m_CmdManager.m_ScriptEngine.World.GetScenePresences();
presences = new List<ScenePresence>(m_CmdManager.m_ScriptEngine.World.GetScenePresences());
}
// If nobody about quit fast
if (Presences.Count == 0)
if (presences.Count == 0)
return sensedEntities;
SceneObjectPart SensePoint = ts.host;
@ -440,8 +440,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
Vector3 toRegionPos;
double dis;
foreach (ScenePresence presence in Presences)
for (int i = 0; i < presences.Count; i++)
{
ScenePresence presence = presences[i];
bool keep = true;
if (presence.IsDeleted)

View File

@ -68,11 +68,11 @@ namespace OpenSim.Region.UserStatistics
HTMLUtil.OL_O(ref output, "");
foreach (Scene scene in all_scenes)
{
List<ScenePresence> avatarInScene = scene.GetScenePresences();
ScenePresence[] avatarInScene = scene.GetScenePresences();
HTMLUtil.LI_O(ref output, "");
HTMLUtil.LI_O(ref output, String.Empty);
output.Append(scene.RegionInfo.RegionName);
HTMLUtil.OL_O(ref output, "");
HTMLUtil.OL_O(ref output, String.Empty);
foreach (ScenePresence av in avatarInScene)
{
Dictionary<string,string> queues = new Dictionary<string, string>();
@ -81,7 +81,7 @@ namespace OpenSim.Region.UserStatistics
IStatsCollector isClient = (IStatsCollector) av.ControllingClient;
queues = decodeQueueReport(isClient.Report());
}
HTMLUtil.LI_O(ref output, "");
HTMLUtil.LI_O(ref output, String.Empty);
output.Append(av.Name);
output.Append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
output.Append((av.IsChildAgent ? "Child" : "Root"));
@ -96,12 +96,12 @@ namespace OpenSim.Region.UserStatistics
(int) av.AbsolutePosition.Z));
}
Dictionary<string, int> throttles = DecodeClientThrottles(av.ControllingClient.GetThrottlesPacked(1));
HTMLUtil.UL_O(ref output, "");
HTMLUtil.UL_O(ref output, String.Empty);
foreach (string throttlename in throttles.Keys)
{
HTMLUtil.LI_O(ref output, "");
HTMLUtil.LI_O(ref output, String.Empty);
output.Append(throttlename);
output.Append(":");
output.Append(throttles[throttlename].ToString());