From 804e87861b95f08590cff8a84a4b9955f1750452 Mon Sep 17 00:00:00 2001 From: MW Date: Thu, 6 Sep 2007 14:15:16 +0000 Subject: [PATCH] added experimental method of trying to relieve missing prim problem (by adding a limit of the number of prim update packets sent in each update loop). --- OpenSim/Region/Environment/Scenes/Scene.cs | 26 +++++--- .../Environment/Scenes/SceneObjectGroup.cs | 16 +++++ .../Environment/Scenes/SceneObjectPart.cs | 34 ++++++++++- .../Environment/Scenes/ScenePresence.cs | 60 ++++++++++++++++++- 4 files changed, 123 insertions(+), 13 deletions(-) diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 4e87032f29..4151074189 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -928,13 +928,14 @@ namespace OpenSim.Region.Environment.Scenes } } - public void SendAllSceneObjectsToClient(IClientAPI client) + public void SendAllSceneObjectsToClient(ScenePresence presence) { foreach (EntityBase ent in Entities.Values) { if (ent is SceneObjectGroup) { - ((SceneObjectGroup)ent).SendFullUpdateToClient(client); + // ((SceneObjectGroup)ent).SendFullUpdateToClient(client); + ((SceneObjectGroup)ent).ScheduleFullUpdateToAvatar(presence); } } } @@ -1229,6 +1230,17 @@ namespace OpenSim.Region.Environment.Scenes } #endregion + private void forceClientUpdate() + { + foreach (EntityBase ent in this.Entities.Values) + { + if (ent is SceneObjectGroup) + { + ((SceneObjectGroup)ent).ScheduleGroupForFullUpdate(); + } + } + } + public void ProcessConsoleCmd(string command, string[] cmdparams) { switch (command) @@ -1243,12 +1255,14 @@ namespace OpenSim.Region.Environment.Scenes MainLog.Instance.Error("show users - show info about connected users in the current region."); MainLog.Instance.Error("shutdown - disconnect all clients and shutdown."); break; + case "show": if (cmdparams.Length > 0) { Show(cmdparams[0]); } break; + case "save-xml": if (cmdparams.Length > 0) { @@ -1277,13 +1291,7 @@ namespace OpenSim.Region.Environment.Scenes case "force-update": Console.WriteLine("Updating all clients"); - foreach(EntityBase ent in this.Entities.Values) - { - if (ent is SceneObjectGroup) - { - ((SceneObjectGroup)ent).ScheduleGroupForFullUpdate(); - } - } + this.forceClientUpdate(); break; case "backup": diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 1869a63701..b202f3c665 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs @@ -347,6 +347,22 @@ namespace OpenSim.Region.Environment.Scenes } } + public void ScheduleFullUpdateToAvatar(ScenePresence presence) + { + foreach (SceneObjectPart part in this.m_parts.Values) + { + part.AddFullUpdateToAvatar(presence); + } + } + + public void ScheduleTerseUpdateToAvatar(ScenePresence presence) + { + foreach (SceneObjectPart part in this.m_parts.Values) + { + part.AddTerseUpdateToAvatar(presence); + } + } + /// /// /// diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index 65a995a575..dec017e4e4 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs @@ -391,14 +391,14 @@ namespace OpenSim.Region.Environment.Scenes { if (m_updateFlag == 1) //some change has been made so update the clients { - SendTerseUpdateToAllClients(); + AddTerseUpdateToAllAvatars(); ClearUpdateSchedule(); } else { if (m_updateFlag == 2) // is a new prim, just created/reloaded or has major changes { - SendFullUpdateToAllClients(); + AddFullUpdateToAllAvatars(); ClearUpdateSchedule(); } } @@ -603,6 +603,20 @@ namespace OpenSim.Region.Environment.Scenes #endregion #region Client Update Methods + public void AddFullUpdateToAllAvatars() + { + List avatars = this.m_parentGroup.RequestSceneAvatars(); + for (int i = 0; i < avatars.Count; i++) + { + avatars[i].AddFullPart(this); + } + } + + public void AddFullUpdateToAvatar(ScenePresence presence) + { + presence.AddFullPart(this); + } + /// /// /// @@ -649,6 +663,22 @@ namespace OpenSim.Region.Environment.Scenes m_text, ParentID, this.m_particleSystem, lRot); } + /// Terse updates + + public void AddTerseUpdateToAllAvatars() + { + List avatars = this.m_parentGroup.RequestSceneAvatars(); + for (int i = 0; i < avatars.Count; i++) + { + avatars[i].AddTersePart(this); + } + } + + public void AddTerseUpdateToAvatar(ScenePresence presence) + { + presence.AddTersePart(this); + } + /// /// /// diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs index e094ac6852..285c691dfe 100644 --- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs @@ -88,6 +88,12 @@ namespace OpenSim.Region.Environment.Scenes public delegate void SignificantClientMovement(IClientAPI remote_client); public event SignificantClientMovement OnSignificantClientMovement; + // private Queue m_fullGroupUpdates = new Queue(); + // private Queue m_terseGroupUpdates = new Queue(); + + private Queue m_fullPartUpdates = new Queue(); + private Queue m_teserPartUpdates = new Queue(); + #region Properties /// /// @@ -193,6 +199,54 @@ namespace OpenSim.Region.Environment.Scenes } #endregion + public void AddTersePart(SceneObjectPart part) + { + m_teserPartUpdates.Enqueue(part); + } + + public void AddFullPart(SceneObjectPart part) + { + m_fullPartUpdates.Enqueue(part); + } + + public void SendPrimUpdates() + { + if (m_teserPartUpdates.Count > 0) + { + bool terse = true; + int terseCount = 0; + + while (terse) + { + SceneObjectPart part = m_teserPartUpdates.Dequeue(); + part.SendTerseUpdate(this.ControllingClient); + terseCount++; + + if ((m_teserPartUpdates.Count < 1) |(terseCount > 30)) + { + terse = false; + } + } + } + if (m_fullPartUpdates.Count > 0) + { + bool full = true; + int fullCount = 0; + + while (full) + { + SceneObjectPart part = m_fullPartUpdates.Dequeue(); + part.SendFullUpdate(this.ControllingClient); + fullCount++; + if ((m_fullPartUpdates.Count < 1) | (fullCount > 40)) + { + full = false; + } + + } + } + } + #region Status Methods /// /// Not Used, most likely can be deleted @@ -221,7 +275,7 @@ namespace OpenSim.Region.Environment.Scenes this._physActor.Flying = isFlying; this.newAvatar = true; this.childAgent = false; - this.m_scene.SendAllSceneObjectsToClient(this.ControllingClient); + this.m_scene.SendAllSceneObjectsToClient(this); } protected void MakeChildAgent() @@ -399,6 +453,8 @@ namespace OpenSim.Region.Environment.Scenes /// public override void Update() { + this.SendPrimUpdates(); + if (this.childAgent == false) { if (this.newForce) @@ -500,7 +556,7 @@ namespace OpenSim.Region.Environment.Scenes //this.SendFullUpdateToALLClients(); //this.SendArrearanceToAllOtherAgents(); - this.m_scene.SendAllSceneObjectsToClient(this.ControllingClient); + this.m_scene.SendAllSceneObjectsToClient(this); this.ControllingClient.SendViewerTime(this.m_scene.TimePhase); //Please don't remove the following code (at least not yet), just leave it commented out