diff options
Diffstat (limited to 'OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs')
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 101 |
1 files changed, 17 insertions, 84 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 630b6e6..383eac0 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -347,10 +347,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
347 | protected Dictionary<UUID,ulong> m_groupPowers = new Dictionary<UUID, ulong>(); | 347 | protected Dictionary<UUID,ulong> m_groupPowers = new Dictionary<UUID, ulong>(); |
348 | protected int m_terrainCheckerCount; | 348 | protected int m_terrainCheckerCount; |
349 | 349 | ||
350 | // LL uses these limits, apparently. Compressed terse would be 23, but we don't have that yet | 350 | // These numbers are guesses at a decent tradeoff between responsiveness |
351 | protected int m_primTerseUpdatesPerPacket = 10; | 351 | // of the interest list and throughput. Lower is more responsive, higher |
352 | protected int m_primFullUpdatesPerPacket = 14; | 352 | // is better throughput |
353 | protected int m_avatarTerseUpdatesPerPacket = 5; | 353 | protected int m_primTerseUpdatesPerPacket = 25; |
354 | protected int m_primFullUpdatesPerPacket = 100; | ||
355 | protected int m_avatarTerseUpdatesPerPacket = 10; | ||
354 | /// <summary>Number of texture packets to put on the queue each time the | 356 | /// <summary>Number of texture packets to put on the queue each time the |
355 | /// OnQueueEmpty event is triggered for the texture category</summary> | 357 | /// OnQueueEmpty event is triggered for the texture category</summary> |
356 | protected int m_textureSendLimit = 20; | 358 | protected int m_textureSendLimit = 20; |
@@ -3415,33 +3417,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3415 | terse.RegionData.TimeDilation = | 3417 | terse.RegionData.TimeDilation = |
3416 | (ushort)(Scene.TimeDilation * ushort.MaxValue); | 3418 | (ushort)(Scene.TimeDilation * ushort.MaxValue); |
3417 | 3419 | ||
3418 | int max = m_avatarTerseUpdatesPerPacket; | 3420 | int count = Math.Min(m_avatarTerseUpdates.Count, m_avatarTerseUpdatesPerPacket); |
3419 | if (max > m_avatarTerseUpdates.Count) | ||
3420 | max = m_avatarTerseUpdates.Count; | ||
3421 | |||
3422 | int count = 0; | ||
3423 | int size = 0; | ||
3424 | |||
3425 | byte[] zerobuffer = new byte[1024]; | ||
3426 | byte[] blockbuffer = new byte[1024]; | ||
3427 | |||
3428 | Queue<ImprovedTerseObjectUpdatePacket.ObjectDataBlock> updates = new Queue<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>(); | ||
3429 | |||
3430 | for (count = 0 ; count < max ; count++) | ||
3431 | { | ||
3432 | int length = 0; | ||
3433 | m_avatarTerseUpdates.Peek().ToBytes(blockbuffer, ref length); | ||
3434 | length = Helpers.ZeroEncode(blockbuffer, length, zerobuffer); | ||
3435 | if (size + length > Packet.MTU) | ||
3436 | break; | ||
3437 | size += length; | ||
3438 | updates.Enqueue(m_avatarTerseUpdates.Dequeue()); | ||
3439 | } | ||
3440 | 3421 | ||
3441 | terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[count]; | 3422 | terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[count]; |
3442 | 3423 | for (int i = 0; i < count; i++) | |
3443 | for (int i = 0 ; i < count ; i++) | 3424 | terse.ObjectData[i] = m_avatarTerseUpdates.Dequeue(); |
3444 | terse.ObjectData[i] = updates.Dequeue(); | ||
3445 | 3425 | ||
3446 | terse.Header.Reliable = false; | 3426 | terse.Header.Reliable = false; |
3447 | terse.Header.Zerocoded = true; | 3427 | terse.Header.Zerocoded = true; |
@@ -3656,34 +3636,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3656 | outPacket.RegionData.TimeDilation = | 3636 | outPacket.RegionData.TimeDilation = |
3657 | (ushort)(Scene.TimeDilation * ushort.MaxValue); | 3637 | (ushort)(Scene.TimeDilation * ushort.MaxValue); |
3658 | 3638 | ||
3659 | int max = m_primFullUpdates.Count; | 3639 | int count = Math.Min(m_primFullUpdates.Count, m_primFullUpdatesPerPacket); |
3660 | if (max > m_primFullUpdatesPerPacket) | ||
3661 | max = m_primFullUpdatesPerPacket; | ||
3662 | |||
3663 | int count = 0; | ||
3664 | int size = 0; | ||
3665 | 3640 | ||
3666 | byte[] zerobuffer = new byte[1024]; | 3641 | outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[count]; |
3667 | byte[] blockbuffer = new byte[1024]; | 3642 | for (int i = 0; i < count; i++) |
3668 | 3643 | outPacket.ObjectData[i] = m_primFullUpdates.Dequeue(); | |
3669 | Queue<ObjectUpdatePacket.ObjectDataBlock> updates = new Queue<ObjectUpdatePacket.ObjectDataBlock>(); | ||
3670 | |||
3671 | for (count = 0 ; count < max ; count++) | ||
3672 | { | ||
3673 | int length = 0; | ||
3674 | m_primFullUpdates.Peek().ToBytes(blockbuffer, ref length); | ||
3675 | length = Helpers.ZeroEncode(blockbuffer, length, zerobuffer); | ||
3676 | if (size + length > Packet.MTU) | ||
3677 | break; | ||
3678 | size += length; | ||
3679 | updates.Enqueue(m_primFullUpdates.Dequeue()); | ||
3680 | } | ||
3681 | |||
3682 | outPacket.ObjectData = | ||
3683 | new ObjectUpdatePacket.ObjectDataBlock[count]; | ||
3684 | |||
3685 | for (int index = 0 ; index < count ; index++) | ||
3686 | outPacket.ObjectData[index] = updates.Dequeue(); | ||
3687 | 3644 | ||
3688 | outPacket.Header.Zerocoded = true; | 3645 | outPacket.Header.Zerocoded = true; |
3689 | OutPacket(outPacket, ThrottleOutPacketType.State); | 3646 | OutPacket(outPacket, ThrottleOutPacketType.State); |
@@ -3733,35 +3690,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3733 | outPacket.RegionData.TimeDilation = | 3690 | outPacket.RegionData.TimeDilation = |
3734 | (ushort)(Scene.TimeDilation * ushort.MaxValue); | 3691 | (ushort)(Scene.TimeDilation * ushort.MaxValue); |
3735 | 3692 | ||
3736 | int max = m_primTerseUpdates.Count; | 3693 | int count = Math.Min(m_primTerseUpdates.Count, m_primTerseUpdatesPerPacket); |
3737 | if (max > m_primTerseUpdatesPerPacket) | ||
3738 | max = m_primTerseUpdatesPerPacket; | ||
3739 | |||
3740 | int count = 0; | ||
3741 | int size = 0; | ||
3742 | |||
3743 | byte[] zerobuffer = new byte[1024]; | ||
3744 | byte[] blockbuffer = new byte[1024]; | ||
3745 | |||
3746 | Queue<ImprovedTerseObjectUpdatePacket.ObjectDataBlock> updates = new Queue<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>(); | ||
3747 | |||
3748 | for (count = 0 ; count < max ; count++) | ||
3749 | { | ||
3750 | int length = 0; | ||
3751 | m_primTerseUpdates.Peek().ToBytes(blockbuffer, ref length); | ||
3752 | length = Helpers.ZeroEncode(blockbuffer, length, zerobuffer); | ||
3753 | if (size + length > Packet.MTU) | ||
3754 | break; | ||
3755 | size += length; | ||
3756 | updates.Enqueue(m_primTerseUpdates.Dequeue()); | ||
3757 | } | ||
3758 | |||
3759 | outPacket.ObjectData = | ||
3760 | new ImprovedTerseObjectUpdatePacket. | ||
3761 | ObjectDataBlock[count]; | ||
3762 | 3694 | ||
3763 | for (int index = 0 ; index < count ; index++) | 3695 | outPacket.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[count]; |
3764 | outPacket.ObjectData[index] = updates.Dequeue(); | 3696 | for (int i = 0; i < count; i++) |
3697 | outPacket.ObjectData[i] = m_primTerseUpdates.Dequeue(); | ||
3765 | 3698 | ||
3766 | outPacket.Header.Reliable = false; | 3699 | outPacket.Header.Reliable = false; |
3767 | outPacket.Header.Zerocoded = true; | 3700 | outPacket.Header.Zerocoded = true; |