From 3674257095f0c511b1f5810fdc034c2d49bb73a8 Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Thu, 7 Feb 2008 08:15:38 +0000 Subject: * This update contains a bucket-full of network optimizations. * ParcelProperties are sent only when needed instead of on any movement * Terse Updates and other temporary data packets are marked unreliable * After a certain amount of users, the sim actually sends updates on things less * Experimental * Tested to 68 avatar with pCampBot (And it's surprising what actually causes the most lag.. the text chat!) --- OpenSim/Framework/ClientManager.cs | 1 + OpenSim/Region/ClientStack/ClientView.cs | 13 +++++++++--- .../Environment/LandManagement/LandManager.cs | 13 ++++++++++-- OpenSim/Region/Environment/Scenes/Scene.cs | 23 +++++++++++++++++++++- OpenSim/Region/Environment/Scenes/ScenePresence.cs | 3 ++- .../Region/Environment/Scenes/SimStatsReporter.cs | 7 +++++++ 6 files changed, 53 insertions(+), 7 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Framework/ClientManager.cs b/OpenSim/Framework/ClientManager.cs index 62ff203..6843dce 100644 --- a/OpenSim/Framework/ClientManager.cs +++ b/OpenSim/Framework/ClientManager.cs @@ -164,6 +164,7 @@ namespace OpenSim.Framework { packet.AgentData.AgentID = LocalClients[i].AgentId; packet.AgentData.SessionID = LocalClients[i].SessionId; + packet.Header.Reliable = false; LocalClients[i].OutPacket(packet, ThrottleOutPacketType.Task); } diff --git a/OpenSim/Region/ClientStack/ClientView.cs b/OpenSim/Region/ClientStack/ClientView.cs index aeac1b2..363688f 100644 --- a/OpenSim/Region/ClientStack/ClientView.cs +++ b/OpenSim/Region/ClientStack/ClientView.cs @@ -957,6 +957,7 @@ namespace OpenSim.Region.ClientStack kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1]; kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock(); kill.ObjectData[0].ID = localID; + kill.Header.Reliable = false; OutPacket(kill, ThrottleOutPacketType.Task); } @@ -1378,6 +1379,7 @@ namespace OpenSim.Region.ClientStack viewertime.TimeInfo.SunDirection = sunPos; viewertime.TimeInfo.SunAngVelocity = sunVel; viewertime.TimeInfo.UsecSinceStart = (ulong)Util.UnixTimeSinceEpoch(); + viewertime.Header.Reliable = false; OutPacket(viewertime, ThrottleOutPacketType.Task); } @@ -1426,6 +1428,7 @@ namespace OpenSim.Region.ClientStack } viewertime.TimeInfo.SunAngVelocity = new LLVector3(0, 0.0f, 10.0f); viewertime.TimeInfo.UsecSinceStart = (ulong)Util.UnixTimeSinceEpoch(); + viewertime.Header.Reliable = false; OutPacket(viewertime, ThrottleOutPacketType.Task); } @@ -1521,7 +1524,7 @@ namespace OpenSim.Region.ClientStack ani.AnimationList[i].AnimID = animations[i]; ani.AnimationList[i].AnimSequenceID = seqs[i]; } - + ani.Header.Reliable = false; OutPacket(ani, ThrottleOutPacketType.Task); } @@ -1580,6 +1583,9 @@ namespace OpenSim.Region.ClientStack terse.RegionData.TimeDilation = timeDilation; terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; terse.ObjectData[0] = terseBlock; + + terse.Header.Reliable = false; + OutPacket(terse, ThrottleOutPacketType.Task); } @@ -1604,6 +1610,7 @@ namespace OpenSim.Region.ClientStack ib.You = -1; ib.Prey = -1; loc.Index = ib; + loc.Header.Reliable = false; OutPacket(loc, ThrottleOutPacketType.Task); } @@ -1706,7 +1713,7 @@ namespace OpenSim.Region.ClientStack terse.RegionData.TimeDilation = timeDilation; terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; terse.ObjectData[0] = CreatePrimImprovedBlock(localID, position, rotation, velocity, rotationalvelocity); - + terse.Header.Reliable = false; OutPacket(terse, ThrottleOutPacketType.Task); } @@ -1719,7 +1726,7 @@ namespace OpenSim.Region.ClientStack terse.RegionData.TimeDilation = timeDilation; terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; terse.ObjectData[0] = CreatePrimImprovedBlock(localID, position, rotation, velocity, rotationalvelocity); - + terse.Header.Reliable = false; OutPacket(terse, ThrottleOutPacketType.Task); } diff --git a/OpenSim/Region/Environment/LandManagement/LandManager.cs b/OpenSim/Region/Environment/LandManagement/LandManager.cs index 09fa09b..dd13fc0 100644 --- a/OpenSim/Region/Environment/LandManagement/LandManager.cs +++ b/OpenSim/Region/Environment/LandManagement/LandManager.cs @@ -718,23 +718,32 @@ namespace OpenSim.Region.Environment.LandManagement } } - public void sendLandUpdate(ScenePresence avatar) + public void sendLandUpdate(ScenePresence avatar, bool force) { Land over = getLandObject((int) Math.Min(255, Math.Max(0, Math.Round(avatar.AbsolutePosition.X))), (int) Math.Min(255, Math.Max(0, Math.Round(avatar.AbsolutePosition.Y)))); if (over != null) { - over.sendLandUpdateToClient(avatar.ControllingClient); + if (force) + { + over.sendLandUpdateToClient(avatar.ControllingClient); + } + if (avatar.currentParcelUUID != over.landData.globalID) { + over.sendLandUpdateToClient(avatar.ControllingClient); avatar.currentParcelUUID = over.landData.globalID; m_scene.EventManager.TriggerAvatarEnteringNewParcel(avatar, over.landData.localID, m_scene.RegionInfo.RegionID); } } } + public void sendLandUpdate(ScenePresence avatar) + { + sendLandUpdate(avatar, false); + } public void handleSignificantClientMovement(IClientAPI remote_client) { ScenePresence clientAvatar = m_scene.GetScenePresence(remote_client.AgentId); diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 6b891fd..a62e6c6 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -626,7 +626,28 @@ namespace OpenSim.Region.Environment.Scenes // Aquire a lock so only one update call happens at once updateLock.WaitOne(); float physicsFPS = 0; - + int agentsInScene = m_innerScene.GetRootAgentCount() + m_innerScene.GetChildAgentCount(); + + if (agentsInScene > 21) + { + if (m_update_entities == 1) + { + m_update_avatars = 5; + m_update_entities = 5; + m_statsReporter.SetUpdateMS(6000); + } + } + else + { + if (m_update_entities == 5) + { + m_update_avatars = 1; + m_update_entities = 1; + m_statsReporter.SetUpdateMS(3000); + } + } + + frameMS = System.Environment.TickCount; try { diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs index 4062ef6..374586c 100644 --- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs @@ -77,6 +77,7 @@ namespace OpenSim.Region.Environment.Scenes private bool m_newForce = false; private bool m_newCoarseLocations = true; private bool m_gotAllObjectsInScene = false; + // Default AV Height private float m_avHeight = 127.0f; @@ -354,7 +355,7 @@ namespace OpenSim.Region.Environment.Scenes RegisterToEvents(); SetDirectionVectors(); - m_scene.LandManager.sendLandUpdate(this); + m_scene.LandManager.sendLandUpdate(this, true); } public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, byte[] visualParams, diff --git a/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs b/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs index f2cefb5..3e1fec2 100644 --- a/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs +++ b/OpenSim/Region/Environment/Scenes/SimStatsReporter.cs @@ -124,6 +124,13 @@ namespace OpenSim.Region.Environment.Scenes m_report.Enabled = true; } + public void SetUpdateMS(int ms) + { + statsUpdatesEveryMS = ms; + statsUpdateFactor = (float)(statsUpdatesEveryMS / 1000); + m_report.Interval = statsUpdatesEveryMS; + } + private void statsHeartBeat(object sender, EventArgs e) { m_report.Enabled = false; -- cgit v1.1