delay terrain sending if land queue is 2 busy

avinationmerge
UbitUmarov 2015-08-22 04:08:30 +01:00
parent 17082da0da
commit e3d82ad706
7 changed files with 48 additions and 2 deletions

View File

@ -1143,6 +1143,8 @@ namespace OpenSim.Framework
void SendGenericMessage(string method, UUID invoice, List<string> message);
void SendGenericMessage(string method, UUID invoice, List<byte[]> message);
bool CanSendLayerData();
void SendLayerData(float[] map);
void SendLayerData(int px, int py, float[] map);

View File

@ -1199,6 +1199,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP
OutPacket(GATRP, ThrottleOutPacketType.Task);
}
public virtual bool CanSendLayerData()
{
int n = m_udpClient.GetCatBytesInSendQueue(ThrottleOutPacketType.Land);
if ( n > 100000)
return false;
return true;
}
/// <summary>
/// Send the region heightmap to the client
/// This method is only called when not doing intellegent terrain patch sending and
@ -9151,7 +9160,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if ((locX >= m_scene.RegionInfo.WorldLocX)
&& (locX < (m_scene.RegionInfo.WorldLocX + m_scene.RegionInfo.RegionSizeX))
&& (locY >= m_scene.RegionInfo.WorldLocY)
&& (locY < (m_scene.RegionInfo.WorldLocY + m_scene.RegionInfo.RegionSizeY)) )
&& (locY < (m_scene.RegionInfo.WorldLocY + m_scene.RegionInfo.RegionSizeY)))
{
tpLocReq.Info.RegionHandle = m_scene.RegionInfo.RegionHandle;
tpLocReq.Info.Position.X += locX - m_scene.RegionInfo.WorldLocX;

View File

@ -475,6 +475,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP
return data;
}
public int GetCatBytesInSendQueue(ThrottleOutPacketType cat)
{
;
int icat = (int)cat;
if (icat > 0 && icat < THROTTLE_CATEGORY_COUNT)
{
TokenBucket bucket = m_throttleCategories[icat];
return m_packetOutboxes[icat].Count;
}
else
return 0;
}
public int GetCatBytesCanSend(ThrottleOutPacketType cat, int timeMS)
{
int icat = (int)cat;

View File

@ -229,11 +229,11 @@ namespace OpenSim.Region.CoreModules.World.Terrain
}
m_scene.RegisterModuleInterface<ITerrainModule>(this);
m_scene.EventManager.OnFrame += EventManager_OnFrame;
m_scene.EventManager.OnNewClient += EventManager_OnNewClient;
m_scene.EventManager.OnClientClosed += EventManager_OnClientClosed;
m_scene.EventManager.OnPluginConsole += EventManager_OnPluginConsole;
m_scene.EventManager.OnTerrainTick += EventManager_OnTerrainTick;
m_scene.EventManager.OnFrame += EventManager_OnFrame;
}
InstallDefaultEffects();
@ -767,6 +767,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
/// </summary>
private void EventManager_OnFrame()
{
// this needs fixing
TerrainData terrData = m_channel.GetTerrainData();
bool shouldTaint = false;
@ -792,6 +793,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain
m_scene.EventManager.TriggerTerrainTainted();
m_tainted = true;
}
}
/// <summary>
@ -993,6 +995,10 @@ namespace OpenSim.Region.CoreModules.World.Terrain
{
foreach (PatchUpdates pups in m_perClientPatchUpdates.Values)
{
// throught acording to land queue free to send bytes
if (!pups.Presence.ControllingClient.CanSendLayerData())
continue;
if (pups.HasUpdates())
{
// There is something that could be sent to this client.

View File

@ -997,6 +997,11 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
}
public virtual bool CanSendLayerData()
{
return false;
}
public void SendLayerData(float[] map)
{

View File

@ -671,6 +671,11 @@ namespace OpenSim.Region.OptionalModules.World.NPC
}
public virtual bool CanSendLayerData()
{
return false;
}
public virtual void SendLayerData(float[] map)
{
}

View File

@ -590,6 +590,11 @@ namespace OpenSim.Tests.Common.Mock
}
public virtual bool CanSendLayerData()
{
return false;
}
public virtual void SendLayerData(float[] map)
{
}