diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index e81ff4b00f..6f0b177b14 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -346,15 +346,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
protected int m_terrainCheckerCount;
protected uint m_agentFOVCounter;
- // These numbers are guesses at a decent tradeoff between responsiveness
- // of the interest list and throughput. Lower is more responsive, higher
- // is better throughput
- protected int m_primTerseUpdatesPerPacket = 25;
- protected int m_primFullUpdatesPerPacket = 100;
- protected int m_avatarTerseUpdatesPerPacket = 10;
- /// Number of texture packets to put on the queue each time the
- /// OnQueueEmpty event is triggered for the texture category
- protected int m_textureSendLimit = 20;
protected IAssetService m_assetService;
private IHyperAssetService m_hyperAssets;
@@ -3333,7 +3324,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
lock (m_avatarTerseUpdates.SyncRoot)
{
- int count = Math.Min(m_avatarTerseUpdates.Count, m_avatarTerseUpdatesPerPacket);
+ int count = Math.Min(m_avatarTerseUpdates.Count, m_udpServer.AvatarTerseUpdatesPerPacket);
if (count == 0)
return;
@@ -3418,7 +3409,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
lock (m_primFullUpdates.SyncRoot)
{
- int count = Math.Min(m_primFullUpdates.Count, m_primFullUpdatesPerPacket);
+ int count = Math.Min(m_primFullUpdates.Count, m_udpServer.PrimFullUpdatesPerPacket);
if (count == 0)
return;
@@ -3462,7 +3453,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
lock (m_primTerseUpdates.SyncRoot)
{
- int count = Math.Min(m_primTerseUpdates.Count, m_primTerseUpdatesPerPacket);
+ int count = Math.Min(m_primTerseUpdates.Count, m_udpServer.PrimTerseUpdatesPerPacket);
if (count == 0)
return;
@@ -3585,7 +3576,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
void ProcessTextureRequests()
{
if (m_imageManager != null)
- m_imageManager.ProcessImageQueue(m_textureSendLimit);
+ m_imageManager.ProcessImageQueue(m_udpServer.TextureSendLimit);
}
public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID)
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index e9faf2ef89..232c9c9bdd 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -98,6 +98,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// The measured resolution of Environment.TickCount
public readonly float TickCountResolution;
+ /// Number of terse prim updates to put on the queue each time the
+ /// OnQueueEmpty event is triggered for updates
+ public readonly int PrimTerseUpdatesPerPacket;
+ /// Number of terse avatar updates to put on the queue each time the
+ /// OnQueueEmpty event is triggered for updates
+ public readonly int AvatarTerseUpdatesPerPacket;
+ /// Number of full prim updates to put on the queue each time the
+ /// OnQueueEmpty event is triggered for updates
+ public readonly int PrimFullUpdatesPerPacket;
+ /// Number of texture packets to put on the queue each time the
+ /// OnQueueEmpty event is triggered for textures
+ public readonly int TextureSendLimit;
/// Handlers for incoming packets
//PacketEventDictionary packetEvents = new PacketEventDictionary();
@@ -172,6 +184,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP
m_asyncPacketHandling = config.GetBoolean("async_packet_handling", false);
m_recvBufferSize = config.GetInt("client_socket_rcvbuf_size", 0);
sceneThrottleBps = config.GetInt("scene_throttle_max_bps", 0);
+
+ PrimTerseUpdatesPerPacket = config.GetInt("PrimTerseUpdatesPerPacket", 25);
+ AvatarTerseUpdatesPerPacket = config.GetInt("AvatarTerseUpdatesPerPacket", 10);
+ PrimFullUpdatesPerPacket = config.GetInt("PrimFullUpdatesPerPacket", 100);
+ TextureSendLimit = config.GetInt("TextureSendLimit", 20);
+ }
+ else
+ {
+ PrimTerseUpdatesPerPacket = 25;
+ AvatarTerseUpdatesPerPacket = 10;
+ PrimFullUpdatesPerPacket = 100;
+ TextureSendLimit = 20;
}
m_throttle = new TokenBucket(null, sceneThrottleBps, sceneThrottleBps);
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example
index 3dc746ea50..f426556544 100644
--- a/bin/OpenSim.ini.example
+++ b/bin/OpenSim.ini.example
@@ -355,8 +355,9 @@
; already separated from packet handling with a queue, so this will only
; affect whether networking internals such as packet decoding and
; acknowledgement accounting are done synchronously or asynchronously
- async_packet_handling = false
-
+ ;
+ ;async_packet_handling = false
+
; The client socket receive buffer size determines how many
; incoming requests we can process; the default on .NET is 8192
; which is about 2 4k-sized UDP datagrams. On mono this is
@@ -371,22 +372,26 @@
; by the system's settings for the maximum client receive buffer
; size (on linux systems you can set that with "sysctl -w
; net.core.rmem_max=X")
+ ;
;client_socket_rcvbuf_size = 8388608
; Maximum outbound bytes per second for a single scene. This can be used to
; throttle total outbound UDP traffic for a simulator. The default value is
; 0, meaning no throttling at the scene level. The example given here is
; 20 megabits
+ ;
;scene_throttle_max_bps = 2621440
; Maximum bits per second to send to any single client. This will override
; the user's viewer preference settings. The default value is 0, meaning no
; aggregate throttling on clients (only per-category throttling). The
; example given here is 1.5 megabits
+ ;
;client_throttle_max_bps = 196608
; Per-client bytes per second rates for the various throttle categories.
; These are default values that will be overriden by clients
+ ;
;resend_default = 12500
;land_default = 500
;wind_default = 500
@@ -399,6 +404,7 @@
; Per-client maximum burst rates in bytes per second for the various
; throttle categories. These are default values that will be overriden by
; clients
+ ;
;resend_limit = 18750
;land_limit = 29750
;wind_limit = 18750
@@ -407,6 +413,28 @@
;texture_limit = 55750
;asset_limit = 27500
;state_limit = 37000
+
+ ; Configures how ObjectUpdates are aggregated. These numbers
+ ; do not literally mean how many updates will be put in each
+ ; packet that goes over the wire, as packets are
+ ; automatically split on a 1400 byte boundary. These control
+ ; the balance between responsiveness of interest list updates
+ ; and total throughput. Higher numbers will ensure more full-
+ ; sized packets and faster sending of data, but more delay in
+ ; updating interest lists
+ ;
+ ;PrimTerseUpdatesPerPacket = 25
+ ;AvatarTerseUpdatesPerPacket = 10
+ ;PrimFullUpdatesPerPacket = 100
+
+ ; TextureSendLimit determines how many packets will be put on
+ ; the outgoing queue each cycle. Like the settings above, this
+ ; is a balance between responsiveness to priority updates and
+ ; total throughput. Higher numbers will give a better
+ ; throughput at the cost of reduced responsiveness to client
+ ; priority changes or transfer aborts
+ ;
+ ;TextureSendLimit = 20
[Chat]
; Controls whether the chat module is enabled. Default is true.
@@ -1365,36 +1393,6 @@
;RecycleDataBlocks = true;
-[LLClient]
- ; Resend packets markes as reliable until they are received
- ;
- ;ReliableIsImportant = false
-
- ; Maximum number of times to resend packets marked reliable
- ;
- ;MaxReliableResends = 3
-
- ; Configures how ObjectUpdates are compressed.
- ;
- ;TerseUpdatesPerPacket=10
- ;FullUpdatesPerPacket=14
- ;TerseUpdateRate=10
- ;FullUpdateRate=14
-
- ;PacketMTU = 1400
-
- ; TextureSendLimit determines how many different textures
- ; will be considered on each cycle. Textures are selected
- ; by priority. The old mechanism specified a value of 10 for
- ; this parameter.
- ;
- ;TextureSendLimit = 10
-
- ; TextureDataLimit determines how many packets will be sent for
- ; each of the selected textures. Default is 5.
- ;
- ;TextureDataLimit = 5
-
[InterestManagement]
; This section controls how state updates are prioritized for each client
; Valid values are Time, Distance, SimpleAngularDistance, and FrontBack