diff options
author | Justin Clark-Casey (justincc) | 2012-10-17 23:54:05 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-10-17 23:54:05 +0100 |
commit | 3ec2923022dbc3e0b5411b17c6495dab6d641f0b (patch) | |
tree | 0aca3759da3f2ee6ec7b12f7d24a65238df9f09b | |
parent | Explicitly return only the incoming AgentUpdate packet as this is the only on... (diff) | |
download | opensim-SC-3ec2923022dbc3e0b5411b17c6495dab6d641f0b.zip opensim-SC-3ec2923022dbc3e0b5411b17c6495dab6d641f0b.tar.gz opensim-SC-3ec2923022dbc3e0b5411b17c6495dab6d641f0b.tar.bz2 opensim-SC-3ec2923022dbc3e0b5411b17c6495dab6d641f0b.tar.xz |
Reuse the same AgentUpdateArgs object for each AgentUpdate UDP packet (of which there are 10 a second) rather than constructing a new one every time.
We can do this because AgentUpdate packets are handled synchronously.
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 109 |
1 files changed, 68 insertions, 41 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 1e93b84..65daca0 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | |||
@@ -92,8 +92,23 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
92 | public event ObjectDeselect OnObjectDetach; | 92 | public event ObjectDeselect OnObjectDetach; |
93 | public event ObjectDrop OnObjectDrop; | 93 | public event ObjectDrop OnObjectDrop; |
94 | public event Action<IClientAPI, bool> OnCompleteMovementToRegion; | 94 | public event Action<IClientAPI, bool> OnCompleteMovementToRegion; |
95 | |||
96 | /// <summary> | ||
97 | /// Called when an AgentUpdate message is received and before OnAgentUpdate. | ||
98 | /// </summary> | ||
99 | /// <remarks> | ||
100 | /// Listeners must not retain a reference to AgentUpdateArgs since this object is reused for subsequent AgentUpdates. | ||
101 | /// </remarks> | ||
95 | public event UpdateAgent OnPreAgentUpdate; | 102 | public event UpdateAgent OnPreAgentUpdate; |
103 | |||
104 | /// <summary> | ||
105 | /// Called when an AgentUpdate message is received and after OnPreAgentUpdate. | ||
106 | /// </summary> | ||
107 | /// <remarks> | ||
108 | /// Listeners must not retain a reference to AgentUpdateArgs since this object is reused for subsequent AgentUpdates. | ||
109 | /// </remarks> | ||
96 | public event UpdateAgent OnAgentUpdate; | 110 | public event UpdateAgent OnAgentUpdate; |
111 | |||
97 | public event AgentRequestSit OnAgentRequestSit; | 112 | public event AgentRequestSit OnAgentRequestSit; |
98 | public event AgentSit OnAgentSit; | 113 | public event AgentSit OnAgentSit; |
99 | public event AvatarPickerRequest OnAvatarPickerRequest; | 114 | public event AvatarPickerRequest OnAvatarPickerRequest; |
@@ -347,7 +362,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
347 | private int m_moneyBalance; | 362 | private int m_moneyBalance; |
348 | private int m_animationSequenceNumber = 1; | 363 | private int m_animationSequenceNumber = 1; |
349 | private bool m_SendLogoutPacketWhenClosing = true; | 364 | private bool m_SendLogoutPacketWhenClosing = true; |
350 | private AgentUpdateArgs lastarg; | 365 | |
366 | /// <summary> | ||
367 | /// We retain a single AgentUpdateArgs so that we can constantly reuse it rather than construct a new one for | ||
368 | /// every single incoming AgentUpdate. Every client sends 10 AgentUpdate UDP messages per second, even if it | ||
369 | /// is doing absolutely nothing. | ||
370 | /// </summary> | ||
371 | /// <remarks> | ||
372 | /// This does mean that agent updates must be processed synchronously, at least for each client, and called methods | ||
373 | /// cannot retain a reference to it outside of that method. | ||
374 | /// </remarks> | ||
375 | private AgentUpdateArgs m_lastAgentUpdateArgs; | ||
351 | 376 | ||
352 | protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>(); | 377 | protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>(); |
353 | protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers | 378 | protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers |
@@ -5198,7 +5223,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5198 | protected virtual void RegisterLocalPacketHandlers() | 5223 | protected virtual void RegisterLocalPacketHandlers() |
5199 | { | 5224 | { |
5200 | AddLocalPacketHandler(PacketType.LogoutRequest, HandleLogout); | 5225 | AddLocalPacketHandler(PacketType.LogoutRequest, HandleLogout); |
5226 | |||
5227 | // If AgentUpdate is ever handled asynchronously, then we will also need to construct a new AgentUpdateArgs | ||
5228 | // for each AgentUpdate packet. | ||
5201 | AddLocalPacketHandler(PacketType.AgentUpdate, HandleAgentUpdate, false); | 5229 | AddLocalPacketHandler(PacketType.AgentUpdate, HandleAgentUpdate, false); |
5230 | |||
5202 | AddLocalPacketHandler(PacketType.ViewerEffect, HandleViewerEffect, false); | 5231 | AddLocalPacketHandler(PacketType.ViewerEffect, HandleViewerEffect, false); |
5203 | AddLocalPacketHandler(PacketType.AgentCachedTexture, HandleAgentTextureCached, false); | 5232 | AddLocalPacketHandler(PacketType.AgentCachedTexture, HandleAgentTextureCached, false); |
5204 | AddLocalPacketHandler(PacketType.MultipleObjectUpdate, HandleMultipleObjUpdate, false); | 5233 | AddLocalPacketHandler(PacketType.MultipleObjectUpdate, HandleMultipleObjUpdate, false); |
@@ -5429,73 +5458,71 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5429 | { | 5458 | { |
5430 | if (OnAgentUpdate != null) | 5459 | if (OnAgentUpdate != null) |
5431 | { | 5460 | { |
5432 | bool update = false; | 5461 | AgentUpdatePacket agentUpdate = (AgentUpdatePacket)packet; |
5433 | AgentUpdatePacket agenUpdate = (AgentUpdatePacket)packet; | ||
5434 | 5462 | ||
5435 | #region Packet Session and User Check | 5463 | #region Packet Session and User Check |
5436 | if (agenUpdate.AgentData.SessionID != SessionId || agenUpdate.AgentData.AgentID != AgentId) | 5464 | if (agentUpdate.AgentData.SessionID != SessionId || agentUpdate.AgentData.AgentID != AgentId) |
5437 | { | 5465 | { |
5438 | PacketPool.Instance.ReturnPacket(packet); | 5466 | PacketPool.Instance.ReturnPacket(packet); |
5439 | return false; | 5467 | return false; |
5440 | } | 5468 | } |
5441 | #endregion | 5469 | #endregion |
5442 | 5470 | ||
5443 | AgentUpdatePacket.AgentDataBlock x = agenUpdate.AgentData; | 5471 | bool update = false; |
5444 | 5472 | AgentUpdatePacket.AgentDataBlock x = agentUpdate.AgentData; | |
5445 | // We can only check when we have something to check | ||
5446 | // against. | ||
5447 | 5473 | ||
5448 | if (lastarg != null) | 5474 | if (m_lastAgentUpdateArgs != null) |
5449 | { | 5475 | { |
5476 | // These should be ordered from most-likely to | ||
5477 | // least likely to change. I've made an initial | ||
5478 | // guess at that. | ||
5450 | update = | 5479 | update = |
5451 | ( | 5480 | ( |
5452 | (x.BodyRotation != lastarg.BodyRotation) || | 5481 | (x.BodyRotation != m_lastAgentUpdateArgs.BodyRotation) || |
5453 | (x.CameraAtAxis != lastarg.CameraAtAxis) || | 5482 | (x.CameraAtAxis != m_lastAgentUpdateArgs.CameraAtAxis) || |
5454 | (x.CameraCenter != lastarg.CameraCenter) || | 5483 | (x.CameraCenter != m_lastAgentUpdateArgs.CameraCenter) || |
5455 | (x.CameraLeftAxis != lastarg.CameraLeftAxis) || | 5484 | (x.CameraLeftAxis != m_lastAgentUpdateArgs.CameraLeftAxis) || |
5456 | (x.CameraUpAxis != lastarg.CameraUpAxis) || | 5485 | (x.CameraUpAxis != m_lastAgentUpdateArgs.CameraUpAxis) || |
5457 | (x.ControlFlags != lastarg.ControlFlags) || | 5486 | (x.ControlFlags != m_lastAgentUpdateArgs.ControlFlags) || |
5458 | (x.Far != lastarg.Far) || | 5487 | (x.Far != m_lastAgentUpdateArgs.Far) || |
5459 | (x.Flags != lastarg.Flags) || | 5488 | (x.Flags != m_lastAgentUpdateArgs.Flags) || |
5460 | (x.State != lastarg.State) || | 5489 | (x.State != m_lastAgentUpdateArgs.State) || |
5461 | (x.HeadRotation != lastarg.HeadRotation) || | 5490 | (x.HeadRotation != m_lastAgentUpdateArgs.HeadRotation) || |
5462 | (x.SessionID != lastarg.SessionID) || | 5491 | (x.SessionID != m_lastAgentUpdateArgs.SessionID) || |
5463 | (x.AgentID != lastarg.AgentID) | 5492 | (x.AgentID != m_lastAgentUpdateArgs.AgentID) |
5464 | ); | 5493 | ); |
5465 | } | 5494 | } |
5466 | else | 5495 | else |
5467 | { | 5496 | { |
5497 | m_lastAgentUpdateArgs = new AgentUpdateArgs(); | ||
5468 | update = true; | 5498 | update = true; |
5469 | } | 5499 | } |
5470 | 5500 | ||
5471 | // These should be ordered from most-likely to | ||
5472 | // least likely to change. I've made an initial | ||
5473 | // guess at that. | ||
5474 | |||
5475 | if (update) | 5501 | if (update) |
5476 | { | 5502 | { |
5477 | // m_log.DebugFormat("[LLCLIENTVIEW]: Triggered AgentUpdate for {0}", sener.Name); | 5503 | // m_log.DebugFormat("[LLCLIENTVIEW]: Triggered AgentUpdate for {0}", sener.Name); |
5478 | 5504 | ||
5479 | AgentUpdateArgs arg = new AgentUpdateArgs(); | 5505 | m_lastAgentUpdateArgs.AgentID = x.AgentID; |
5480 | arg.AgentID = x.AgentID; | 5506 | m_lastAgentUpdateArgs.BodyRotation = x.BodyRotation; |
5481 | arg.BodyRotation = x.BodyRotation; | 5507 | m_lastAgentUpdateArgs.CameraAtAxis = x.CameraAtAxis; |
5482 | arg.CameraAtAxis = x.CameraAtAxis; | 5508 | m_lastAgentUpdateArgs.CameraCenter = x.CameraCenter; |
5483 | arg.CameraCenter = x.CameraCenter; | 5509 | m_lastAgentUpdateArgs.CameraLeftAxis = x.CameraLeftAxis; |
5484 | arg.CameraLeftAxis = x.CameraLeftAxis; | 5510 | m_lastAgentUpdateArgs.CameraUpAxis = x.CameraUpAxis; |
5485 | arg.CameraUpAxis = x.CameraUpAxis; | 5511 | m_lastAgentUpdateArgs.ControlFlags = x.ControlFlags; |
5486 | arg.ControlFlags = x.ControlFlags; | 5512 | m_lastAgentUpdateArgs.Far = x.Far; |
5487 | arg.Far = x.Far; | 5513 | m_lastAgentUpdateArgs.Flags = x.Flags; |
5488 | arg.Flags = x.Flags; | 5514 | m_lastAgentUpdateArgs.HeadRotation = x.HeadRotation; |
5489 | arg.HeadRotation = x.HeadRotation; | 5515 | m_lastAgentUpdateArgs.SessionID = x.SessionID; |
5490 | arg.SessionID = x.SessionID; | 5516 | m_lastAgentUpdateArgs.State = x.State; |
5491 | arg.State = x.State; | 5517 | |
5492 | UpdateAgent handlerAgentUpdate = OnAgentUpdate; | 5518 | UpdateAgent handlerAgentUpdate = OnAgentUpdate; |
5493 | UpdateAgent handlerPreAgentUpdate = OnPreAgentUpdate; | 5519 | UpdateAgent handlerPreAgentUpdate = OnPreAgentUpdate; |
5494 | lastarg = arg; // save this set of arguments for nexttime | 5520 | |
5495 | if (handlerPreAgentUpdate != null) | 5521 | if (handlerPreAgentUpdate != null) |
5496 | OnPreAgentUpdate(this, arg); | 5522 | OnPreAgentUpdate(this, m_lastAgentUpdateArgs); |
5523 | |||
5497 | if (handlerAgentUpdate != null) | 5524 | if (handlerAgentUpdate != null) |
5498 | OnAgentUpdate(this, arg); | 5525 | OnAgentUpdate(this, m_lastAgentUpdateArgs); |
5499 | 5526 | ||
5500 | handlerAgentUpdate = null; | 5527 | handlerAgentUpdate = null; |
5501 | handlerPreAgentUpdate = null; | 5528 | handlerPreAgentUpdate = null; |