From 7d033187d8fd49d9a38531061c38783e81d69f5b Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Wed, 5 Oct 2011 22:08:56 +0100 Subject: Make reported sim fps more accurate, in line with frame time ms Also remove some unused fields and improve naming on others. --- OpenSim/Region/Framework/Scenes/Scene.cs | 26 +++++++++++++------ OpenSim/Region/Framework/Scenes/SceneGraph.cs | 5 ++++ .../Region/Framework/Scenes/SimStatsReporter.cs | 29 ++++++++++------------ 3 files changed, 36 insertions(+), 24 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 29a54e8..e4ebcff 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -137,8 +137,6 @@ namespace OpenSim.Region.Framework.Scenes protected IDialogModule m_dialogModule; protected IEntityTransferModule m_teleportModule; protected ICapabilitiesModule m_capsModule; - // Central Update Loop - protected int m_fps = 10; /// /// Current scene frame number @@ -149,8 +147,20 @@ namespace OpenSim.Region.Framework.Scenes protected set; } - protected float m_timespan = 0.089f; - protected DateTime m_lastupdate = DateTime.UtcNow; + /// + /// The minimum length of time in seconds that will be taken for a scene frame. If the frame takes less time then we + /// will sleep for the remaining period. + /// + /// + /// One can tweak this number to experiment. One current effect of reducing it is to make avatar animations + /// occur too quickly (viewer 1) or with even more slide (viewer 2). + /// + protected float m_minFrameTimespan = 0.089f; + + /// + /// The time of the last frame update. + /// + protected DateTime m_lastFrameUpdate = DateTime.UtcNow; // TODO: Possibly stop other classes being able to manipulate this directly. private SceneGraph m_sceneGraph; @@ -1211,7 +1221,7 @@ namespace OpenSim.Region.Framework.Scenes public override void Update() { - TimeSpan SinceLastFrame = DateTime.UtcNow - m_lastupdate; + TimeSpan SinceLastFrame = DateTime.UtcNow - m_lastFrameUpdate; float physicsFPS = 0f; int maintc = Util.EnvironmentTickCount(); @@ -1263,7 +1273,7 @@ namespace OpenSim.Region.Framework.Scenes if (Frame % m_update_physics == 0) { if (m_physics_enabled) - physicsFPS = m_sceneGraph.UpdatePhysics(Math.Max(SinceLastFrame.TotalSeconds, m_timespan)); + physicsFPS = m_sceneGraph.UpdatePhysics(Math.Max(SinceLastFrame.TotalSeconds, m_minFrameTimespan)); if (SynchronizeScene != null) SynchronizeScene(this); } @@ -1379,11 +1389,11 @@ namespace OpenSim.Region.Framework.Scenes } finally { - m_lastupdate = DateTime.UtcNow; + m_lastFrameUpdate = DateTime.UtcNow; } maintc = Util.EnvironmentTickCountSubtract(maintc); - maintc = (int)(m_timespan * 1000) - maintc; + maintc = (int)(m_minFrameTimespan * 1000) - maintc; if (maintc > 0) Thread.Sleep(maintc); diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 36c5c52..11c2a78 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -174,6 +174,11 @@ namespace OpenSim.Region.Framework.Scenes }); } + /// + /// Perform a physics frame update. + /// + /// + /// protected internal float UpdatePhysics(double elapsed) { lock (m_syncRoot) diff --git a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs index 87dcdee..2d92ed8 100644 --- a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs +++ b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs @@ -37,6 +37,9 @@ namespace OpenSim.Region.Framework.Scenes { public class SimStatsReporter { +// private static readonly log4net.ILog m_log +// = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + public delegate void SendStatResult(SimStats stats); public delegate void YourStatsAreWrong(); @@ -165,18 +168,9 @@ namespace OpenSim.Region.Framework.Scenes #region various statistic googly moogly - // Our FPS is actually 10fps, so multiplying by 5 to get the amount that people expect there - // 0-50 is pretty close to 0-45 - float simfps = (int) ((m_fps * 5)); // save the reported value so there is something available for llGetRegionFPS - lastReportedSimFPS = (float)simfps / statsUpdateFactor; - - //if (simfps > 45) - //simfps = simfps - (simfps - 45); - //if (simfps < 0) - //simfps = 0; + lastReportedSimFPS = (float)m_fps / statsUpdateFactor; - // float physfps = ((m_pfps / 1000)); //if (physfps > 600) @@ -197,7 +191,7 @@ namespace OpenSim.Region.Framework.Scenes // 'statsUpdateFactor' is how often stats packets are sent in seconds. Used below to change // values to X-per-second values. - for (int i = 0; i<21;i++) + for (int i = 0; i < 21; i++) { sb[i] = new SimStatsPacket.StatBlock(); } @@ -206,7 +200,7 @@ namespace OpenSim.Region.Framework.Scenes sb[0].StatValue = (Single.IsNaN(m_timeDilation)) ? 0.1f : m_timeDilation ; //((((m_timeDilation + (0.10f * statsUpdateFactor)) /10) / statsUpdateFactor)); sb[1].StatID = (uint) Stats.SimFPS; - sb[1].StatValue = simfps/statsUpdateFactor; + sb[1].StatValue = m_fps/statsUpdateFactor; sb[2].StatID = (uint) Stats.PhysicsFPS; sb[2].StatValue = physfps / statsUpdateFactor; @@ -272,7 +266,8 @@ namespace OpenSim.Region.Framework.Scenes SimStats simStats = new SimStats( - ReportingRegion.RegionLocX, ReportingRegion.RegionLocY, regionFlags, (uint)m_objectCapacity, rb, sb, m_scene.RegionInfo.originRegionID); + ReportingRegion.RegionLocX, ReportingRegion.RegionLocY, regionFlags, (uint)m_objectCapacity, + rb, sb, m_scene.RegionInfo.originRegionID); handlerSendStatResult = OnSendStatsResult; if (handlerSendStatResult != null) @@ -395,30 +390,32 @@ namespace OpenSim.Region.Framework.Scenes { m_frameMS += ms; } + public void addNetMS(int ms) { m_netMS += ms; } + public void addAgentMS(int ms) { m_agentMS += ms; } + public void addPhysicsMS(int ms) { m_physicsMS += ms; } + public void addImageMS(int ms) { m_imageMS += ms; } + public void addOtherMS(int ms) { m_otherMS += ms; } -// private static readonly log4net.ILog m_log -// = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); - public void AddPendingDownloads(int count) { m_pendingDownloads += count; -- cgit v1.1