aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2010-06-08 15:07:57 +0100
committerJustin Clark-Casey (justincc)2010-06-08 15:07:57 +0100
commitb6076d7b337dc087807e56cdbe74ef47dc1b66b3 (patch)
tree7eb2f57ec5f4e62d36f69389c112402d76595ea1 /OpenSim/Region
parentAdd a call to SOG.ResumeScripts() after region crossing / teleport (diff)
downloadopensim-SC_OLD-b6076d7b337dc087807e56cdbe74ef47dc1b66b3.zip
opensim-SC_OLD-b6076d7b337dc087807e56cdbe74ef47dc1b66b3.tar.gz
opensim-SC_OLD-b6076d7b337dc087807e56cdbe74ef47dc1b66b3.tar.bz2
opensim-SC_OLD-b6076d7b337dc087807e56cdbe74ef47dc1b66b3.tar.xz
Reduce number of full updates sent on region crossing for attachments/huds to 1 from 3
This is one step towards reducing hud glitches on region crossing, since the viewer fails to display prims if it receives child full updates before the root prim full update This commit also introduces a mechanism in LLClientView to stop child attachment updates ever going out before the root one This is a very temporary mechanism and will be commented out when the next step of the fix (to give root prims higher udpate priority) is committed This code is a foreport from the equivalent changes in 0.6.9-post-fixes
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs43
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs42
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs10
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs3
4 files changed, 86 insertions, 12 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index a516a54..0e58986 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -331,6 +331,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
331 /// </value> 331 /// </value>
332 protected HashSet<uint> m_killRecord; 332 protected HashSet<uint> m_killRecord;
333 333
334 protected HashSet<uint> m_attachmentsSent;
335
334 private int m_moneyBalance; 336 private int m_moneyBalance;
335 private int m_animationSequenceNumber = 1; 337 private int m_animationSequenceNumber = 1;
336 private bool m_SendLogoutPacketWhenClosing = true; 338 private bool m_SendLogoutPacketWhenClosing = true;
@@ -427,6 +429,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
427 m_entityUpdates = new PriorityQueue(m_scene.Entities.Count); 429 m_entityUpdates = new PriorityQueue(m_scene.Entities.Count);
428 m_fullUpdateDataBlocksBuilder = new List<ObjectUpdatePacket.ObjectDataBlock>(); 430 m_fullUpdateDataBlocksBuilder = new List<ObjectUpdatePacket.ObjectDataBlock>();
429 m_killRecord = new HashSet<uint>(); 431 m_killRecord = new HashSet<uint>();
432 m_attachmentsSent = new HashSet<uint>();
430 433
431 m_assetService = m_scene.RequestModuleInterface<IAssetService>(); 434 m_assetService = m_scene.RequestModuleInterface<IAssetService>();
432 m_hyperAssets = m_scene.RequestModuleInterface<IHyperAssetService>(); 435 m_hyperAssets = m_scene.RequestModuleInterface<IHyperAssetService>();
@@ -3411,6 +3414,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3411 objupdate.ObjectData[0] = CreateAvatarUpdateBlock(presence); 3414 objupdate.ObjectData[0] = CreateAvatarUpdateBlock(presence);
3412 3415
3413 OutPacket(objupdate, ThrottleOutPacketType.Task); 3416 OutPacket(objupdate, ThrottleOutPacketType.Task);
3417
3418 // We need to record the avatar local id since the root prim of an attachment points to this.
3419 m_attachmentsSent.Add(avatar.LocalId);
3414 } 3420 }
3415 3421
3416 public void SendCoarseLocationUpdate(List<UUID> users, List<Vector3> CoarseLocations) 3422 public void SendCoarseLocationUpdate(List<UUID> users, List<Vector3> CoarseLocations)
@@ -3466,7 +3472,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3466 double priority = m_prioritizer.GetUpdatePriority(this, entity); 3472 double priority = m_prioritizer.GetUpdatePriority(this, entity);
3467 3473
3468 lock (m_entityUpdates.SyncRoot) 3474 lock (m_entityUpdates.SyncRoot)
3469 m_entityUpdates.Enqueue(priority, new EntityUpdate(entity, updateFlags), entity.LocalId); 3475 m_entityUpdates.Enqueue(priority, new EntityUpdate(entity, updateFlags), entity.LocalId);
3470 } 3476 }
3471 3477
3472 private void ProcessEntityUpdates(int maxUpdates) 3478 private void ProcessEntityUpdates(int maxUpdates)
@@ -3542,9 +3548,42 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3542 if (!canUseImproved && !canUseCompressed) 3548 if (!canUseImproved && !canUseCompressed)
3543 { 3549 {
3544 if (update.Entity is ScenePresence) 3550 if (update.Entity is ScenePresence)
3551 {
3545 objectUpdateBlocks.Value.Add(CreateAvatarUpdateBlock((ScenePresence)update.Entity)); 3552 objectUpdateBlocks.Value.Add(CreateAvatarUpdateBlock((ScenePresence)update.Entity));
3553 }
3546 else 3554 else
3547 objectUpdateBlocks.Value.Add(CreatePrimUpdateBlock((SceneObjectPart)update.Entity, this.m_agentId)); 3555 {
3556 if (update.Entity is SceneObjectPart && ((SceneObjectPart)update.Entity).IsAttachment)
3557 {
3558 SceneObjectPart sop = (SceneObjectPart)update.Entity;
3559 string text = sop.Text;
3560 if (text.IndexOf("\n") >= 0)
3561 text = text.Remove(text.IndexOf("\n"));
3562
3563 if (m_attachmentsSent.Contains(sop.ParentID))
3564 {
3565// m_log.DebugFormat(
3566// "[CLIENT]: Sending full info about attached prim {0} text {1}",
3567// sop.LocalId, text);
3568
3569 objectUpdateBlocks.Value.Add(CreatePrimUpdateBlock(sop, this.m_agentId));
3570
3571 m_attachmentsSent.Add(sop.LocalId);
3572 }
3573 else
3574 {
3575 m_log.DebugFormat(
3576 "[CLIENT]: Requeueing full update of prim {0} text {1} since we haven't sent its parent {2} yet",
3577 sop.LocalId, text, sop.ParentID);
3578
3579 m_entityUpdates.Enqueue(double.MaxValue, update, sop.LocalId);
3580 }
3581 }
3582 else
3583 {
3584 objectUpdateBlocks.Value.Add(CreatePrimUpdateBlock((SceneObjectPart)update.Entity, this.m_agentId));
3585 }
3586 }
3548 } 3587 }
3549 else if (!canUseImproved) 3588 else if (!canUseImproved)
3550 { 3589 {
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 2544359..4e90d09 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2066,8 +2066,34 @@ namespace OpenSim.Region.Framework.Scenes
2066 sceneObject.ScheduleGroupForFullUpdate(); 2066 sceneObject.ScheduleGroupForFullUpdate();
2067 2067
2068 return sceneObject; 2068 return sceneObject;
2069 }
2070
2071 /// <summary>
2072 /// Add an object into the scene that has come from storage
2073 /// </summary>
2074 ///
2075 /// <param name="sceneObject"></param>
2076 /// <param name="attachToBackup">
2077 /// If true, changes to the object will be reflected in its persisted data
2078 /// If false, the persisted data will not be changed even if the object in the scene is changed
2079 /// </param>
2080 /// <param name="alreadyPersisted">
2081 /// If true, we won't persist this object until it changes
2082 /// If false, we'll persist this object immediately
2083 /// </param>
2084 /// <param name="sendClientUpdates">
2085 /// If true, we send updates to the client to tell it about this object
2086 /// If false, we leave it up to the caller to do this
2087 /// </param>
2088 /// <returns>
2089 /// true if the object was added, false if an object with the same uuid was already in the scene
2090 /// </returns>
2091 public bool AddRestoredSceneObject(
2092 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted, bool sendClientUpdates)
2093 {
2094 return m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, sendClientUpdates);
2069 } 2095 }
2070 2096
2071 /// <summary> 2097 /// <summary>
2072 /// Add an object into the scene that has come from storage 2098 /// Add an object into the scene that has come from storage
2073 /// </summary> 2099 /// </summary>
@@ -2087,7 +2113,7 @@ namespace OpenSim.Region.Framework.Scenes
2087 public bool AddRestoredSceneObject( 2113 public bool AddRestoredSceneObject(
2088 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted) 2114 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted)
2089 { 2115 {
2090 return m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted); 2116 return AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, true);
2091 } 2117 }
2092 2118
2093 /// <summary> 2119 /// <summary>
@@ -2527,7 +2553,10 @@ namespace OpenSim.Region.Framework.Scenes
2527 sceneObject.RootPart.AddFlag(PrimFlags.TemporaryOnRez); 2553 sceneObject.RootPart.AddFlag(PrimFlags.TemporaryOnRez);
2528 sceneObject.RootPart.AddFlag(PrimFlags.Phantom); 2554 sceneObject.RootPart.AddFlag(PrimFlags.Phantom);
2529 2555
2530 AddRestoredSceneObject(sceneObject, false, false); 2556
2557 // Don't sent a full update here because this will cause full updates to be sent twice for
2558 // attachments on region crossings, resulting in viewer glitches.
2559 AddRestoredSceneObject(sceneObject, false, false, false);
2531 2560
2532 // Handle attachment special case 2561 // Handle attachment special case
2533 SceneObjectPart RootPrim = sceneObject.RootPart; 2562 SceneObjectPart RootPrim = sceneObject.RootPart;
@@ -2554,12 +2583,13 @@ namespace OpenSim.Region.Framework.Scenes
2554 m_log.DebugFormat( 2583 m_log.DebugFormat(
2555 "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); 2584 "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition);
2556 2585
2586 RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
2587
2557 if (AttachmentsModule != null) 2588 if (AttachmentsModule != null)
2558 AttachmentsModule.AttachObject( 2589 AttachmentsModule.AttachObject(
2559 sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false); 2590 sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false);
2560 2591
2561 RootPrim.RemFlag(PrimFlags.TemporaryOnRez); 2592 //grp.SendGroupFullUpdate();
2562 grp.SendGroupFullUpdate();
2563 } 2593 }
2564 else 2594 else
2565 { 2595 {
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index a02f614..5902080 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -222,11 +222,15 @@ namespace OpenSim.Region.Framework.Scenes
222 /// If true, we won't persist this object until it changes 222 /// If true, we won't persist this object until it changes
223 /// If false, we'll persist this object immediately 223 /// If false, we'll persist this object immediately
224 /// </param> 224 /// </param>
225 /// <param name="sendClientUpdates">
226 /// If true, we send updates to the client to tell it about this object
227 /// If false, we leave it up to the caller to do this
228 /// </param>
225 /// <returns> 229 /// <returns>
226 /// true if the object was added, false if an object with the same uuid was already in the scene 230 /// true if the object was added, false if an object with the same uuid was already in the scene
227 /// </returns> 231 /// </returns>
228 protected internal bool AddRestoredSceneObject( 232 protected internal bool AddRestoredSceneObject(
229 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted) 233 SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted, bool sendClientUpdates)
230 { 234 {
231 if (!alreadyPersisted) 235 if (!alreadyPersisted)
232 { 236 {
@@ -234,9 +238,9 @@ namespace OpenSim.Region.Framework.Scenes
234 sceneObject.HasGroupChanged = true; 238 sceneObject.HasGroupChanged = true;
235 } 239 }
236 240
237 return AddSceneObject(sceneObject, attachToBackup, true); 241 return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates);
238 } 242 }
239 243
240 /// <summary> 244 /// <summary>
241 /// Add a newly created object to the scene. This will both update the scene, and send information about the 245 /// Add a newly created object to the scene. This will both update the scene, and send information about the
242 /// new object to all clients interested in the scene. 246 /// new object to all clients interested in the scene.
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 837d3a2..78c2566 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -2012,7 +2012,8 @@ namespace OpenSim.Region.Framework.Scenes
2012 /// </summary> 2012 /// </summary>
2013 public void ScheduleGroupForFullUpdate() 2013 public void ScheduleGroupForFullUpdate()
2014 { 2014 {
2015// m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, UUID); 2015 if (IsAttachment)
2016 m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, LocalId);
2016 2017
2017 checkAtTargets(); 2018 checkAtTargets();
2018 RootPart.ScheduleFullUpdate(); 2019 RootPart.ScheduleFullUpdate();