aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ClientStack')
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs33
1 files changed, 30 insertions, 3 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 8b2440a..0dbce2f 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -327,7 +327,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
327 private PriorityQueue m_entityProps; 327 private PriorityQueue m_entityProps;
328 private Prioritizer m_prioritizer; 328 private Prioritizer m_prioritizer;
329 private bool m_disableFacelights = false; 329 private bool m_disableFacelights = false;
330 330 private volatile bool m_justEditedTerrain = false;
331 /// <value> 331 /// <value>
332 /// List used in construction of data blocks for an object update packet. This is to stop us having to 332 /// List used in construction of data blocks for an object update packet. This is to stop us having to
333 /// continually recreate it. 333 /// continually recreate it.
@@ -1239,9 +1239,32 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1239 LLHeightFieldMoronize(map); 1239 LLHeightFieldMoronize(map);
1240 1240
1241 LayerDataPacket layerpack = TerrainCompressor.CreateLandPacket(heightmap, patches); 1241 LayerDataPacket layerpack = TerrainCompressor.CreateLandPacket(heightmap, patches);
1242 layerpack.Header.Reliable = true; 1242
1243 // When a user edits the terrain, so much data is sent, the data queues up fast and presents a sub optimal editing experience.
1244 // To alleviate this issue, when the user edits the terrain, we start skipping the queues until they're done editing the terrain.
1245 // We also make them unreliable because it's extremely likely that multiple packets will be sent for a terrain patch area
1246 // invalidating previous packets for that area.
1243 1247
1244 OutPacket(layerpack, ThrottleOutPacketType.Land); 1248 // It's possible for an editing user to flood themselves with edited packets but the majority of use cases are such that only a
1249 // tiny percentage of users will be editing the terrain. Other, non-editing users will see the edits much slower.
1250
1251 // One last note on this topic, by the time users are going to be editing the terrain, it's extremely likely that the sim will
1252 // have rezzed already and therefore this is not likely going to cause any additional issues with lost packets, objects or terrain
1253 // patches.
1254
1255 // m_justEditedTerrain is volatile, so test once and duplicate two affected statements so we only have one cache miss.
1256 if (m_justEditedTerrain)
1257 {
1258 layerpack.Header.Reliable = false;
1259 OutPacket(layerpack,
1260 ThrottleOutPacketType.Unknown );
1261 }
1262 else
1263 {
1264 layerpack.Header.Reliable = true;
1265 OutPacket(layerpack,
1266 ThrottleOutPacketType.Land);
1267 }
1245 } 1268 }
1246 catch (Exception e) 1269 catch (Exception e)
1247 { 1270 {
@@ -6263,6 +6286,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
6263 //m_log.Info("[LAND]: LAND:" + modify.ToString()); 6286 //m_log.Info("[LAND]: LAND:" + modify.ToString());
6264 if (modify.ParcelData.Length > 0) 6287 if (modify.ParcelData.Length > 0)
6265 { 6288 {
6289 // Note: the ModifyTerrain event handler sends out updated packets before the end of this event. Therefore,
6290 // a simple boolean value should work and perhaps queue up just a few terrain patch packets at the end of the edit.
6291 m_justEditedTerrain = true; // Prevent terrain packet (Land layer) from being queued, make it unreliable
6266 if (OnModifyTerrain != null) 6292 if (OnModifyTerrain != null)
6267 { 6293 {
6268 for (int i = 0; i < modify.ParcelData.Length; i++) 6294 for (int i = 0; i < modify.ParcelData.Length; i++)
@@ -6278,6 +6304,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
6278 } 6304 }
6279 } 6305 }
6280 } 6306 }
6307 m_justEditedTerrain = false; // Queue terrain packet (Land layer) if necessary, make it reliable again
6281 } 6308 }
6282 6309
6283 return true; 6310 return true;