diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index 34ec42031a..da893b69e7 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -577,11 +577,13 @@ namespace OpenSim.Framework { public ISceneEntity Entity; public PrimUpdateFlags Flags; + public float TimeDilation; - public EntityUpdate(ISceneEntity entity, PrimUpdateFlags flags) + public EntityUpdate(ISceneEntity entity, PrimUpdateFlags flags, float timedilation) { Entity = entity; Flags = flags; + TimeDilation = timedilation; } } diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 6a6bd12fea..56f8880a54 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -3591,7 +3591,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP double priority = m_prioritizer.GetUpdatePriority(this, entity); lock (m_entityUpdates.SyncRoot) - m_entityUpdates.Enqueue(priority, new EntityUpdate(entity, updateFlags), entity.LocalId); + m_entityUpdates.Enqueue(priority, new EntityUpdate(entity, updateFlags, m_scene.TimeDilation), entity.LocalId); } private void ProcessEntityUpdates(int maxUpdates) @@ -3604,6 +3604,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (maxUpdates <= 0) maxUpdates = Int32.MaxValue; int updatesThisCall = 0; + float avgTimeDilation = 0; + EntityUpdate update; while (updatesThisCall < maxUpdates) { @@ -3611,6 +3613,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (!m_entityUpdates.TryDequeue(out update)) break; + avgTimeDilation += update.TimeDilation; + avgTimeDilation *= 0.5f; + if (update.Entity is SceneObjectPart) { SceneObjectPart part = (SceneObjectPart)update.Entity; @@ -3790,8 +3795,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP #region Packet Sending const float TIME_DILATION = 1.0f; - ushort timeDilation = Utils.FloatToUInt16(TIME_DILATION, 0.0f, 1.0f); - + ushort timeDilation = Utils.FloatToUInt16(avgTimeDilation, 0.0f, 1.0f); + if (terseAgentUpdateBlocks.IsValueCreated) { List blocks = terseAgentUpdateBlocks.Value; @@ -3830,7 +3835,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle; packet.RegionData.TimeDilation = timeDilation; packet.ObjectData = new ObjectUpdateCompressedPacket.ObjectDataBlock[blocks.Count]; - + for (int i = 0; i < blocks.Count; i++) packet.ObjectData[i] = blocks[i]; diff --git a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs index c5a6e628bd..4f9e32b7f7 100644 --- a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs +++ b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs @@ -105,12 +105,11 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer } } - // This should not be here - //if (Requests.ContainsKey(fileName)) - //{ - // RequestXfer(Requests[fileName].remoteClient, Requests[fileName].xferID, fileName); - // Requests.Remove(fileName); - //} + if (Requests.ContainsKey(fileName)) + { + RequestXfer(Requests[fileName].remoteClient, Requests[fileName].xferID, fileName); + Requests.Remove(fileName); + } return true; } diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index 7fd59a0ebf..eb97f41e3c 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs @@ -287,6 +287,9 @@ namespace OpenSim.Region.Physics.OdePlugin private OdePrim cp1; private OdeCharacter cc2; private OdePrim cp2; + private int tickCountFrameRun; + + private int latertickcount=0; //private int cStartStop = 0; //private string cDictKey = ""; @@ -3123,6 +3126,22 @@ namespace OpenSim.Region.Physics.OdePlugin } d.WorldExportDIF(world, fname, physics_logging_append_existing_logfile, prefix); } + latertickcount = Util.EnvironmentTickCount() - tickCountFrameRun; + + // OpenSimulator above does 10 fps. 10 fps = means that the main thread loop and physics + // has a max of 100 ms to run theoretically. + // If the main loop stalls, it calls Simulate later which makes the tick count ms larger. + // If Physics stalls, it takes longer which makes the tick count ms larger. + + if (latertickcount < 100) + m_timeDilation = 1.0f; + else + { + m_timeDilation = 100f / latertickcount; + //m_timeDilation = Math.Min((Math.Max(100 - (Util.EnvironmentTickCount() - tickCountFrameRun), 1) / 100f), 1.0f); + } + + tickCountFrameRun = Util.EnvironmentTickCount(); } return fps;