aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs152
1 files changed, 123 insertions, 29 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index cda4d49..2884268 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -80,6 +80,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
80 private List<ObjectUpdatePacket.ObjectDataBlock> m_primFullUpdates = 80 private List<ObjectUpdatePacket.ObjectDataBlock> m_primFullUpdates =
81 new List<ObjectUpdatePacket.ObjectDataBlock>(); 81 new List<ObjectUpdatePacket.ObjectDataBlock>();
82 82
83 private Timer m_textureRequestTimer;
84
83 private bool m_clientBlocked; 85 private bool m_clientBlocked;
84 86
85 private int m_probesWithNoIngressPackets; 87 private int m_probesWithNoIngressPackets;
@@ -140,6 +142,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
140 protected int m_primTerseUpdateRate = 10; 142 protected int m_primTerseUpdateRate = 10;
141 protected int m_primFullUpdateRate = 14; 143 protected int m_primFullUpdateRate = 14;
142 144
145 protected int m_textureRequestRate = 100;
146 protected int m_textureSendLimit = 10;
147 protected int m_textureDataLimit = 5;
148
143 protected int m_packetMTU = 1400; 149 protected int m_packetMTU = 1400;
144 150
145 protected IAssetService m_assetService; 151 protected IAssetService m_assetService;
@@ -344,6 +350,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
344 350
345 private readonly IGroupsModule m_GroupsModule; 351 private readonly IGroupsModule m_GroupsModule;
346 352
353 private AgentUpdateArgs lastarg = null;
354
347 //private TerrainUnacked handlerUnackedTerrain = null; 355 //private TerrainUnacked handlerUnackedTerrain = null;
348 356
349 //** 357 //**
@@ -544,6 +552,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
544 m_primFullUpdateRate = clientConfig.GetInt("FullUpdateRate", 552 m_primFullUpdateRate = clientConfig.GetInt("FullUpdateRate",
545 m_primFullUpdateRate); 553 m_primFullUpdateRate);
546 554
555 m_textureRequestRate = clientConfig.GetInt("TextureRequestRate",
556 m_textureRequestRate);
557
558 m_textureSendLimit = clientConfig.GetInt("TextureSendLimit",
559 m_textureSendLimit);
560
561 m_textureDataLimit = clientConfig.GetInt("TextureDataLimit",
562 m_textureDataLimit);
563
547 m_packetMTU = clientConfig.GetInt("PacketMTU", 1400); 564 m_packetMTU = clientConfig.GetInt("PacketMTU", 1400);
548 } 565 }
549 } 566 }
@@ -577,6 +594,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
577 m_avatarTerseUpdateTimer.Stop(); 594 m_avatarTerseUpdateTimer.Stop();
578 m_primTerseUpdateTimer.Stop(); 595 m_primTerseUpdateTimer.Stop();
579 m_primFullUpdateTimer.Stop(); 596 m_primFullUpdateTimer.Stop();
597 m_textureRequestTimer.Stop();
580 598
581 // This is just to give the client a reasonable chance of 599 // This is just to give the client a reasonable chance of
582 // flushing out all it's packets. There should probably 600 // flushing out all it's packets. There should probably
@@ -660,6 +678,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
660 m_avatarTerseUpdateTimer.Stop(); 678 m_avatarTerseUpdateTimer.Stop();
661 m_primTerseUpdateTimer.Stop(); 679 m_primTerseUpdateTimer.Stop();
662 m_primFullUpdateTimer.Stop(); 680 m_primFullUpdateTimer.Stop();
681 m_textureRequestTimer.Stop();
663 } 682 }
664 683
665 public void Restart() 684 public void Restart()
@@ -682,6 +701,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
682 m_primFullUpdateTimer = new Timer(m_primFullUpdateRate); 701 m_primFullUpdateTimer = new Timer(m_primFullUpdateRate);
683 m_primFullUpdateTimer.Elapsed += new ElapsedEventHandler(ProcessPrimFullUpdates); 702 m_primFullUpdateTimer.Elapsed += new ElapsedEventHandler(ProcessPrimFullUpdates);
684 m_primFullUpdateTimer.AutoReset = false; 703 m_primFullUpdateTimer.AutoReset = false;
704
705 m_textureRequestTimer = new Timer(m_textureRequestRate);
706 m_textureRequestTimer.Elapsed += new ElapsedEventHandler(ProcessTextureRequests);
707 m_textureRequestTimer.AutoReset = false;
708
685 } 709 }
686 710
687 public void Terminate() 711 public void Terminate()
@@ -914,6 +938,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
914 m_primFullUpdateTimer = new Timer(m_primFullUpdateRate); 938 m_primFullUpdateTimer = new Timer(m_primFullUpdateRate);
915 m_primFullUpdateTimer.Elapsed += new ElapsedEventHandler(ProcessPrimFullUpdates); 939 m_primFullUpdateTimer.Elapsed += new ElapsedEventHandler(ProcessPrimFullUpdates);
916 m_primFullUpdateTimer.AutoReset = false; 940 m_primFullUpdateTimer.AutoReset = false;
941
942 m_textureRequestTimer = new Timer(m_textureRequestRate);
943 m_textureRequestTimer.Elapsed += new ElapsedEventHandler(ProcessTextureRequests);
944 m_textureRequestTimer.AutoReset = false;
945
917 m_scene.AddNewClient(this); 946 m_scene.AddNewClient(this);
918 947
919 RefreshGroupMembership(); 948 RefreshGroupMembership();
@@ -985,6 +1014,26 @@ namespace OpenSim.Region.ClientStack.LindenUDP
985 } 1014 }
986 } 1015 }
987 1016
1017 protected virtual void TextureRequestHandler()
1018 {
1019 m_log.DebugFormat("[TRH] Thread started");
1020 while (m_imageManager != null)
1021 {
1022 try
1023 {
1024 while (m_imageManager != null)
1025 {
1026 }
1027 }
1028 catch (Exception e)
1029 {
1030 m_log.WarnFormat("[TRH] Exception in handler loop: {0}", e.Message);
1031 m_log.Debug(e);
1032 }
1033 }
1034 m_log.DebugFormat("[TRH] Thread terminated");
1035 }
1036
988 # endregion 1037 # endregion
989 1038
990 // Previously ClientView.API partial class 1039 // Previously ClientView.API partial class
@@ -3032,6 +3081,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3032 } 3081 }
3033 } 3082 }
3034 3083
3084 // Unlike the other timers, this one is only started after
3085 // the first request is seen.
3086
3087 void ProcessTextureRequests(object sender, ElapsedEventArgs e)
3088 {
3089 if (m_imageManager != null)
3090 {
3091 if (m_imageManager.ProcessImageQueue(m_textureSendLimit,
3092 m_textureDataLimit))
3093 {
3094 m_textureRequestTimer.Start();
3095 }
3096 }
3097 }
3098
3035 void ProcessPrimFullUpdates(object sender, ElapsedEventArgs e) 3099 void ProcessPrimFullUpdates(object sender, ElapsedEventArgs e)
3036 { 3100 {
3037 lock (m_primFullUpdates) 3101 lock (m_primFullUpdates)
@@ -3237,7 +3301,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3237 ushort numParts, UUID ImageUUID, uint ImageSize, byte[] ImageData, byte imageCodec) 3301 ushort numParts, UUID ImageUUID, uint ImageSize, byte[] ImageData, byte imageCodec)
3238 { 3302 {
3239 ImageDataPacket im = new ImageDataPacket(); 3303 ImageDataPacket im = new ImageDataPacket();
3240 im.Header.Reliable = true; 3304 im.Header.Reliable = false;
3241 im.ImageID.Packets = numParts; 3305 im.ImageID.Packets = numParts;
3242 im.ImageID.ID = ImageUUID; 3306 im.ImageID.ID = ImageUUID;
3243 3307
@@ -3253,7 +3317,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3253 public void SendImageNextPart(ushort partNumber, UUID imageUuid, byte[] imageData) 3317 public void SendImageNextPart(ushort partNumber, UUID imageUuid, byte[] imageData)
3254 { 3318 {
3255 ImagePacketPacket im = new ImagePacketPacket(); 3319 ImagePacketPacket im = new ImagePacketPacket();
3256 im.Header.Reliable = true; 3320 im.Header.Reliable = false;
3257 im.ImageID.Packet = partNumber; 3321 im.ImageID.Packet = partNumber;
3258 im.ImageID.ID = imageUuid; 3322 im.ImageID.ID = imageUuid;
3259 im.ImageData.Data = imageData; 3323 im.ImageData.Data = imageData;
@@ -4727,14 +4791,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4727 /// <param name="Pack">OpenMetaverse.packet</param> 4791 /// <param name="Pack">OpenMetaverse.packet</param>
4728 public void ProcessInPacket(Packet Pack) 4792 public void ProcessInPacket(Packet Pack)
4729 { 4793 {
4730 // check if we've got a local packet handler for this packet.type. See RegisterLocalPacketHandlers() 4794
4731 if (ProcessPacketMethod(Pack)) 4795 if (ProcessPacketMethod(Pack))
4732 { 4796 {
4733 //there is a handler registered that handled this packet type
4734
4735 // in the end, we dereference this, so we have to check if it's null
4736 if (m_imageManager != null)
4737 m_imageManager.ProcessImageQueue(5);
4738 return; 4797 return;
4739 } 4798 }
4740 4799
@@ -5303,6 +5362,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5303 case PacketType.AgentUpdate: 5362 case PacketType.AgentUpdate:
5304 if (OnAgentUpdate != null) 5363 if (OnAgentUpdate != null)
5305 { 5364 {
5365 bool update = false;
5306 AgentUpdatePacket agenUpdate = (AgentUpdatePacket)Pack; 5366 AgentUpdatePacket agenUpdate = (AgentUpdatePacket)Pack;
5307 5367
5308 #region Packet Session and User Check 5368 #region Packet Session and User Check
@@ -5315,26 +5375,58 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5315 #endregion 5375 #endregion
5316 5376
5317 AgentUpdatePacket.AgentDataBlock x = agenUpdate.AgentData; 5377 AgentUpdatePacket.AgentDataBlock x = agenUpdate.AgentData;
5318 AgentUpdateArgs arg = new AgentUpdateArgs();
5319 arg.AgentID = x.AgentID;
5320 arg.BodyRotation = x.BodyRotation;
5321 arg.CameraAtAxis = x.CameraAtAxis;
5322 arg.CameraCenter = x.CameraCenter;
5323 arg.CameraLeftAxis = x.CameraLeftAxis;
5324 arg.CameraUpAxis = x.CameraUpAxis;
5325 arg.ControlFlags = x.ControlFlags;
5326 arg.Far = x.Far;
5327 arg.Flags = x.Flags;
5328 arg.HeadRotation = x.HeadRotation;
5329 arg.SessionID = x.SessionID;
5330 arg.State = x.State;
5331 5378
5332 handlerAgentUpdate = OnAgentUpdate; 5379 // We can only check when we have something to check
5333 if (handlerAgentUpdate != null) 5380 // against.
5334 OnAgentUpdate(this, arg); 5381
5382 if (lastarg != null)
5383 {
5384 update =
5385 (
5386 (x.BodyRotation != lastarg.BodyRotation) ||
5387 (x.CameraAtAxis != lastarg.CameraAtAxis) ||
5388 (x.CameraCenter != lastarg.CameraCenter) ||
5389 (x.CameraLeftAxis != lastarg.CameraLeftAxis) ||
5390 (x.CameraUpAxis != lastarg.CameraUpAxis) ||
5391 (x.ControlFlags != lastarg.ControlFlags) ||
5392 (x.Far != lastarg.Far) ||
5393 (x.Flags != lastarg.Flags) ||
5394 (x.State != lastarg.State) ||
5395 (x.HeadRotation != lastarg.HeadRotation) ||
5396 (x.SessionID != lastarg.SessionID) ||
5397 (x.AgentID != lastarg.AgentID)
5398 );
5399 }
5400 else
5401 update = true;
5402
5403 // These should be ordered from most-likely to
5404 // least likely to change. I've made an initial
5405 // guess at that.
5406
5407 if (update)
5408 {
5409 AgentUpdateArgs arg = new AgentUpdateArgs();
5410 arg.AgentID = x.AgentID;
5411 arg.BodyRotation = x.BodyRotation;
5412 arg.CameraAtAxis = x.CameraAtAxis;
5413 arg.CameraCenter = x.CameraCenter;
5414 arg.CameraLeftAxis = x.CameraLeftAxis;
5415 arg.CameraUpAxis = x.CameraUpAxis;
5416 arg.ControlFlags = x.ControlFlags;
5417 arg.Far = x.Far;
5418 arg.Flags = x.Flags;
5419 arg.HeadRotation = x.HeadRotation;
5420 arg.SessionID = x.SessionID;
5421 arg.State = x.State;
5422 handlerAgentUpdate = OnAgentUpdate;
5423 lastarg = arg; // save this set of arguments for nexttime
5424 if (handlerAgentUpdate != null)
5425 OnAgentUpdate(this, arg);
5426
5427 handlerAgentUpdate = null;
5428 }
5335 5429
5336 handlerAgentUpdate = null;
5337 //agenUpdate.AgentData.ControlFlags, agenUpdate.AgentData.BodyRotationa);
5338 } 5430 }
5339 break; 5431 break;
5340 5432
@@ -6392,10 +6484,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
6392 6484
6393 // in the end, we null this, so we have to check if it's null 6485 // in the end, we null this, so we have to check if it's null
6394 if (m_imageManager != null) 6486 if (m_imageManager != null)
6487 {
6395 m_imageManager.EnqueueReq(args); 6488 m_imageManager.EnqueueReq(args);
6489 m_textureRequestTimer.Start();
6490 }
6396 } 6491 }
6397 } 6492 }
6398 break; 6493 break;
6494
6399 case PacketType.TransferRequest: 6495 case PacketType.TransferRequest:
6400 //m_log.Debug("ClientView.ProcessPackets.cs:ProcessInPacket() - Got transfer request"); 6496 //m_log.Debug("ClientView.ProcessPackets.cs:ProcessInPacket() - Got transfer request");
6401 6497
@@ -9502,10 +9598,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
9502 #endregion 9598 #endregion
9503 } 9599 }
9504 9600
9505 // in the end, we dereference this, so we have to check if it's null
9506 if (m_imageManager != null)
9507 m_imageManager.ProcessImageQueue(10);
9508 PacketPool.Instance.ReturnPacket(Pack); 9601 PacketPool.Instance.ReturnPacket(Pack);
9602
9509 } 9603 }
9510 9604
9511 private static PrimitiveBaseShape GetShapeFromAddPacket(ObjectAddPacket addPacket) 9605 private static PrimitiveBaseShape GetShapeFromAddPacket(ObjectAddPacket addPacket)