diff options
author | unknown | 2009-11-15 21:38:38 +0100 |
---|---|---|
committer | Melanie | 2009-11-15 19:40:58 +0000 |
commit | 28aa8010b2b47b73c6b867ff8f6284f98f12f37a (patch) | |
tree | 9a35f65f3550bfd03ccd6de5a8e79e6746bf4065 /OpenSim/Region | |
parent | Make GroupRootUpdate be a terse update. This method is not used by opensim (i... (diff) | |
download | opensim-SC_OLD-28aa8010b2b47b73c6b867ff8f6284f98f12f37a.zip opensim-SC_OLD-28aa8010b2b47b73c6b867ff8f6284f98f12f37a.tar.gz opensim-SC_OLD-28aa8010b2b47b73c6b867ff8f6284f98f12f37a.tar.bz2 opensim-SC_OLD-28aa8010b2b47b73c6b867ff8f6284f98f12f37a.tar.xz |
- Lower TIME_MS_TOLERANCE to 200ms - Allow m_updateFlag to be reset to 0 in the event of a terse update being rejected - Re-add a synchronous SendTo for certain types of packets
Diffstat (limited to 'OpenSim/Region')
4 files changed, 49 insertions, 15 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index c773c05..0b05ed9 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | |||
@@ -399,6 +399,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
399 | #region Queue or Send | 399 | #region Queue or Send |
400 | 400 | ||
401 | OutgoingPacket outgoingPacket = new OutgoingPacket(udpClient, buffer, category); | 401 | OutgoingPacket outgoingPacket = new OutgoingPacket(udpClient, buffer, category); |
402 | outgoingPacket.Type = type; | ||
402 | 403 | ||
403 | if (!outgoingPacket.Client.EnqueueOutgoing(outgoingPacket)) | 404 | if (!outgoingPacket.Client.EnqueueOutgoing(outgoingPacket)) |
404 | SendPacketFinal(outgoingPacket); | 405 | SendPacketFinal(outgoingPacket); |
@@ -510,6 +511,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
510 | byte flags = buffer.Data[0]; | 511 | byte flags = buffer.Data[0]; |
511 | bool isResend = (flags & Helpers.MSG_RESENT) != 0; | 512 | bool isResend = (flags & Helpers.MSG_RESENT) != 0; |
512 | bool isReliable = (flags & Helpers.MSG_RELIABLE) != 0; | 513 | bool isReliable = (flags & Helpers.MSG_RELIABLE) != 0; |
514 | bool sendSynchronous = false; | ||
513 | LLUDPClient udpClient = outgoingPacket.Client; | 515 | LLUDPClient udpClient = outgoingPacket.Client; |
514 | 516 | ||
515 | if (!udpClient.IsConnected) | 517 | if (!udpClient.IsConnected) |
@@ -565,9 +567,27 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
565 | if (isReliable) | 567 | if (isReliable) |
566 | Interlocked.Add(ref udpClient.UnackedBytes, outgoingPacket.Buffer.DataLength); | 568 | Interlocked.Add(ref udpClient.UnackedBytes, outgoingPacket.Buffer.DataLength); |
567 | 569 | ||
568 | // Put the UDP payload on the wire | 570 | //Some packet types need to be sent synchonously. |
569 | AsyncBeginSend(buffer); | 571 | //Sorry, i know it's not optimal, but until the LL client |
572 | //manages packets correctly and re-orders them as required, this is necessary. | ||
573 | |||
574 | if (outgoingPacket.Type == PacketType.ImprovedTerseObjectUpdate | ||
575 | || outgoingPacket.Type == PacketType.ChatFromSimulator | ||
576 | || outgoingPacket.Type == PacketType.ObjectUpdate | ||
577 | || outgoingPacket.Type == PacketType.LayerData) | ||
578 | { | ||
579 | sendSynchronous = true; | ||
580 | } | ||
570 | 581 | ||
582 | // Put the UDP payload on the wire | ||
583 | if (sendSynchronous == true) | ||
584 | { | ||
585 | SyncBeginSend(buffer); | ||
586 | } | ||
587 | else | ||
588 | { | ||
589 | AsyncBeginSend(buffer); | ||
590 | } | ||
571 | // Keep track of when this packet was sent out (right now) | 591 | // Keep track of when this packet was sent out (right now) |
572 | outgoingPacket.TickCount = Environment.TickCount & Int32.MaxValue; | 592 | outgoingPacket.TickCount = Environment.TickCount & Int32.MaxValue; |
573 | } | 593 | } |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/OpenSimUDPBase.cs b/OpenSim/Region/ClientStack/LindenUDP/OpenSimUDPBase.cs index d2779ba..63579ac 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/OpenSimUDPBase.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/OpenSimUDPBase.cs | |||
@@ -246,6 +246,24 @@ namespace OpenMetaverse | |||
246 | } | 246 | } |
247 | } | 247 | } |
248 | 248 | ||
249 | public void SyncBeginSend(UDPPacketBuffer buf) | ||
250 | { | ||
251 | if (!m_shutdownFlag) | ||
252 | { | ||
253 | try | ||
254 | { | ||
255 | m_udpSocket.SendTo( | ||
256 | buf.Data, | ||
257 | 0, | ||
258 | buf.DataLength, | ||
259 | SocketFlags.None, | ||
260 | buf.RemoteEndPoint); | ||
261 | } | ||
262 | catch (SocketException) { } | ||
263 | catch (ObjectDisposedException) { } | ||
264 | } | ||
265 | } | ||
266 | |||
249 | public void AsyncBeginSend(UDPPacketBuffer buf) | 267 | public void AsyncBeginSend(UDPPacketBuffer buf) |
250 | { | 268 | { |
251 | if (!m_shutdownFlag) | 269 | if (!m_shutdownFlag) |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs b/OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs index 1a1a1cb..7dc42d3 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs | |||
@@ -28,6 +28,7 @@ | |||
28 | using System; | 28 | using System; |
29 | using OpenSim.Framework; | 29 | using OpenSim.Framework; |
30 | using OpenMetaverse; | 30 | using OpenMetaverse; |
31 | using OpenMetaverse.Packets; | ||
31 | 32 | ||
32 | namespace OpenSim.Region.ClientStack.LindenUDP | 33 | namespace OpenSim.Region.ClientStack.LindenUDP |
33 | { | 34 | { |
@@ -52,7 +53,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
52 | public int TickCount; | 53 | public int TickCount; |
53 | /// <summary>Category this packet belongs to</summary> | 54 | /// <summary>Category this packet belongs to</summary> |
54 | public ThrottleOutPacketType Category; | 55 | public ThrottleOutPacketType Category; |
55 | 56 | /// <summary>The type of packet so its delivery method can be determined</summary> | |
57 | public PacketType Type; | ||
56 | /// <summary> | 58 | /// <summary> |
57 | /// Default constructor | 59 | /// Default constructor |
58 | /// </summary> | 60 | /// </summary> |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 73d0984..c0fd437 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -1064,14 +1064,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1064 | } | 1064 | } |
1065 | } | 1065 | } |
1066 | 1066 | ||
1067 | /// <summary> | ||
1068 | /// Clear all pending updates of parts to clients | ||
1069 | /// </summary> | ||
1070 | private void ClearUpdateSchedule() | ||
1071 | { | ||
1072 | m_updateFlag = 0; | ||
1073 | } | ||
1074 | |||
1075 | private void SendObjectPropertiesToClient(UUID AgentID) | 1067 | private void SendObjectPropertiesToClient(UUID AgentID) |
1076 | { | 1068 | { |
1077 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); | 1069 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); |
@@ -2387,8 +2379,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2387 | { | 2379 | { |
2388 | const float ROTATION_TOLERANCE = 0.01f; | 2380 | const float ROTATION_TOLERANCE = 0.01f; |
2389 | const float VELOCITY_TOLERANCE = 0.001f; | 2381 | const float VELOCITY_TOLERANCE = 0.001f; |
2390 | const float POSITION_TOLERANCE = 0.05f; | 2382 | const float POSITION_TOLERANCE = 0.05f; // I don't like this, but I suppose it's necessary |
2391 | const int TIME_MS_TOLERANCE = 3000; | 2383 | const int TIME_MS_TOLERANCE = 200; //llSetPos has a 200ms delay. This should NOT be 3 seconds. |
2392 | 2384 | ||
2393 | if (m_updateFlag == 1) | 2385 | if (m_updateFlag == 1) |
2394 | { | 2386 | { |
@@ -2401,7 +2393,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2401 | Environment.TickCount - m_lastTerseSent > TIME_MS_TOLERANCE) | 2393 | Environment.TickCount - m_lastTerseSent > TIME_MS_TOLERANCE) |
2402 | { | 2394 | { |
2403 | AddTerseUpdateToAllAvatars(); | 2395 | AddTerseUpdateToAllAvatars(); |
2404 | ClearUpdateSchedule(); | 2396 | |
2405 | 2397 | ||
2406 | // This causes the Scene to 'poll' physical objects every couple of frames | 2398 | // This causes the Scene to 'poll' physical objects every couple of frames |
2407 | // bad, so it's been replaced by an event driven method. | 2399 | // bad, so it's been replaced by an event driven method. |
@@ -2419,13 +2411,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
2419 | m_lastAngularVelocity = AngularVelocity; | 2411 | m_lastAngularVelocity = AngularVelocity; |
2420 | m_lastTerseSent = Environment.TickCount; | 2412 | m_lastTerseSent = Environment.TickCount; |
2421 | } | 2413 | } |
2414 | //Moved this outside of the if clause so updates don't get blocked.. *sigh* | ||
2415 | m_updateFlag = 0; //Why were we calling a function to do this? Inefficient! *screams* | ||
2422 | } | 2416 | } |
2423 | else | 2417 | else |
2424 | { | 2418 | { |
2425 | if (m_updateFlag == 2) // is a new prim, just created/reloaded or has major changes | 2419 | if (m_updateFlag == 2) // is a new prim, just created/reloaded or has major changes |
2426 | { | 2420 | { |
2427 | AddFullUpdateToAllAvatars(); | 2421 | AddFullUpdateToAllAvatars(); |
2428 | ClearUpdateSchedule(); | 2422 | m_updateFlag = 0; //Same here |
2429 | } | 2423 | } |
2430 | } | 2424 | } |
2431 | } | 2425 | } |