From 878b67b333320070f643dfdd11e0a9c6ff453543 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 00:26:11 +0100 Subject: [PATCH 01/17] Fix OdeScene.GetTopColliders() to return the top 25 colliders rather than the first 25 that had non-zero collision scores. Also zeros collisions scores on all prims after report collection, not just the top 25. As before, this collision scores are only reset after a report is requested, which may give unrealistic numbers on the first request. So to see more realistic scores, ignore the first report and then refresh the request after a couple of seconds or so. --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 32 ++++++++------------ 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index fa659453c1..25b3266f2b 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -30,20 +30,21 @@ using System; using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; using System.Reflection; using System.Runtime.InteropServices; using System.Threading; -using System.IO; -using System.Diagnostics; using log4net; using Nini.Config; using Ode.NET; +using OpenMetaverse; #if USE_DRAWSTUFF using Drawstuff.NET; #endif using OpenSim.Framework; using OpenSim.Region.Physics.Manager; -using OpenMetaverse; namespace OpenSim.Region.Physics.OdePlugin { @@ -3868,26 +3869,19 @@ namespace OpenSim.Region.Physics.OdePlugin public override Dictionary GetTopColliders() { - Dictionary returncolliders = new Dictionary(); - int cnt = 0; + Dictionary topColliders; + lock (_prims) { - foreach (OdePrim prm in _prims) - { - if (prm.CollisionScore > 0) - { - returncolliders.Add(prm.LocalID, prm.CollisionScore); - cnt++; - prm.CollisionScore = 0f; - if (cnt > 25) - { - break; - } - } - } + List orderedPrims = new List(_prims); + orderedPrims.OrderByDescending(p => p.CollisionScore).Take(25); + topColliders = orderedPrims.ToDictionary(p => p.LocalID, p => p.CollisionScore); + + foreach (OdePrim p in _prims) + p.CollisionScore = 0; } - return returncolliders; + return topColliders; } public override bool SupportsRayCast() From 93fa9e89918f41db01229c61a228724d380552ac Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 00:56:13 +0100 Subject: [PATCH 02/17] Add ODE avatar and prim collision numbers if extra stats collection is enabled. --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 39 +++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 25b3266f2b..864cdc23d1 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -147,6 +147,16 @@ namespace OpenSim.Region.Physics.OdePlugin /// public const string ODENativeCollisionFrameMsStatName = "ODENativeCollisionFrameMS"; + /// + /// Stat name for the number of avatar collisions with another entity. + /// + public const string ODEAvatarCollisionsStatName = "ODEAvatarCollisions"; + + /// + /// Stat name for the number of prim collisions with another entity. + /// + public const string ODEPrimCollisionsStatName = "ODEPrimCollisions"; + /// /// Used to hold tick numbers for stat collection purposes. /// @@ -157,6 +167,12 @@ namespace OpenSim.Region.Physics.OdePlugin /// private bool m_inCollisionTiming; + /// + /// A temporary holder for the number of avatar collisions in a frame, so we can work out how many object + /// collisions occured using the _perloopcontact if stats collection is enabled. + /// + private int m_tempAvatarCollisionsThisFrame; + /// /// Used in calculating physics frame time dilation /// @@ -473,7 +489,7 @@ namespace OpenSim.Region.Physics.OdePlugin // Initialize the mesh plugin public override void Initialise(IMesher meshmerizer, IConfigSource config) { - m_stats[ODENativeCollisionFrameMsStatName] = 0; + InitializeExtraStats(); mesher = meshmerizer; m_config = config; @@ -1455,7 +1471,7 @@ namespace OpenSim.Region.Physics.OdePlugin break; } } - //m_log.DebugFormat("[Collsion]: Depth {0}", Math.Abs(contact.depth - contactGeom.depth)); + //m_log.DebugFormat("[Collision]: Depth {0}", Math.Abs(contact.depth - contactGeom.depth)); //m_log.DebugFormat("[Collision]: <{0},{1},{2}>", Math.Abs(contactGeom.normal.X - contact.normal.X), Math.Abs(contactGeom.normal.Y - contact.normal.Y), Math.Abs(contactGeom.normal.Z - contact.normal.Z)); } } @@ -1693,8 +1709,11 @@ namespace OpenSim.Region.Physics.OdePlugin //} } -// if (framecount % 55 == 0) -// m_log.DebugFormat("Processed {0} collisions", _perloopContact.Count); + if (CollectStats) + { + m_tempAvatarCollisionsThisFrame = _perloopContact.Count; + m_stats[ODEAvatarCollisionsStatName] += m_tempAvatarCollisionsThisFrame; + } List removeprims = null; foreach (OdePrim chr in _activeprims) @@ -1728,6 +1747,9 @@ namespace OpenSim.Region.Physics.OdePlugin } } + if (CollectStats) + m_stats[ODEPrimCollisionsStatName] += _perloopContact.Count - m_tempAvatarCollisionsThisFrame; + if (removeprims != null) { foreach (OdePrim chr in removeprims) @@ -4063,10 +4085,17 @@ namespace OpenSim.Region.Physics.OdePlugin { returnStats = new Dictionary(m_stats); - m_stats[ODENativeCollisionFrameMsStatName] = 0; + InitializeExtraStats(); } return returnStats; } + + private void InitializeExtraStats() + { + m_stats[ODENativeCollisionFrameMsStatName] = 0; + m_stats[ODEAvatarCollisionsStatName] = 0; + m_stats[ODEPrimCollisionsStatName] = 0; + } } } \ No newline at end of file From 8301f7b17f8e524d2412f927530da95f711bd6ac Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 00:57:55 +0100 Subject: [PATCH 03/17] minor: comment out currently unused OdeScene.sCollisionData --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 864cdc23d1..ace0ba515f 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -55,15 +55,15 @@ namespace OpenSim.Region.Physics.OdePlugin End = 2 } - public struct sCollisionData - { - public uint ColliderLocalId; - public uint CollidedWithLocalId; - public int NumberOfCollisions; - public int CollisionType; - public int StatusIndicator; - public int lastframe; - } +// public struct sCollisionData +// { +// public uint ColliderLocalId; +// public uint CollidedWithLocalId; +// public int NumberOfCollisions; +// public int CollisionType; +// public int StatusIndicator; +// public int lastframe; +// } [Flags] public enum CollisionCategories : int From e1f8d2adb0dc1dffad8caf47611217b1f7f14f47 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 01:12:30 +0100 Subject: [PATCH 04/17] Stop adding an unnecessary duplicate _perloopcontact if the avatar is standing on a prim. This has already been added earlier on in the method. --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index ace0ba515f..55c7e5a571 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -1229,14 +1229,12 @@ namespace OpenSim.Region.Physics.OdePlugin { _perloopContact.Add(curContact); - // If we're colliding against terrain if (name1 == "Terrain" || name2 == "Terrain") { - // If we're moving if ((p2.PhysicsActorType == (int) ActorTypes.Agent) && (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) { - // Use the movement terrain contact + // Avatar is moving on terrain, use the movement terrain contact AvatarMovementTerrainContact.geom = curContact; if (m_global_contactcount < maxContactsbeforedeath) @@ -1249,7 +1247,7 @@ namespace OpenSim.Region.Physics.OdePlugin { if (p2.PhysicsActorType == (int)ActorTypes.Agent) { - // Use the non moving terrain contact + // Avatar is standing on terrain, use the non moving terrain contact TerrainContact.geom = curContact; if (m_global_contactcount < maxContactsbeforedeath) @@ -1344,13 +1342,11 @@ namespace OpenSim.Region.Physics.OdePlugin } else { - // we're colliding with prim or avatar - // check if we're moving if ((p2.PhysicsActorType == (int)ActorTypes.Agent)) { if ((Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) { - // Use the Movement prim contact + // Avatar is moving on a prim, use the Movement prim contact AvatarMovementprimContact.geom = curContact; if (m_global_contactcount < maxContactsbeforedeath) @@ -1361,9 +1357,8 @@ namespace OpenSim.Region.Physics.OdePlugin } else { - // Use the non movement contact + // Avatar is standing still on a prim, use the non movement contact contact.geom = curContact; - _perloopContact.Add(curContact); if (m_global_contactcount < maxContactsbeforedeath) { From c33c8db8256225b5ec09c0767c8b65341964d678 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 01:15:27 +0100 Subject: [PATCH 05/17] Rename new collision stats to 'contacts' - there are/can be multiple contacts per collision and this is what is actually being measured. --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 55c7e5a571..32dac22bfb 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -150,12 +150,12 @@ namespace OpenSim.Region.Physics.OdePlugin /// /// Stat name for the number of avatar collisions with another entity. /// - public const string ODEAvatarCollisionsStatName = "ODEAvatarCollisions"; + public const string ODEAvatarContactsStatsName = "ODEAvatarContacts"; /// /// Stat name for the number of prim collisions with another entity. /// - public const string ODEPrimCollisionsStatName = "ODEPrimCollisions"; + public const string ODEPrimContactsStatName = "ODEPrimContacts"; /// /// Used to hold tick numbers for stat collection purposes. @@ -1707,7 +1707,7 @@ namespace OpenSim.Region.Physics.OdePlugin if (CollectStats) { m_tempAvatarCollisionsThisFrame = _perloopContact.Count; - m_stats[ODEAvatarCollisionsStatName] += m_tempAvatarCollisionsThisFrame; + m_stats[ODEAvatarContactsStatsName] += m_tempAvatarCollisionsThisFrame; } List removeprims = null; @@ -1743,7 +1743,7 @@ namespace OpenSim.Region.Physics.OdePlugin } if (CollectStats) - m_stats[ODEPrimCollisionsStatName] += _perloopContact.Count - m_tempAvatarCollisionsThisFrame; + m_stats[ODEPrimContactsStatName] += _perloopContact.Count - m_tempAvatarCollisionsThisFrame; if (removeprims != null) { @@ -4089,8 +4089,8 @@ namespace OpenSim.Region.Physics.OdePlugin private void InitializeExtraStats() { m_stats[ODENativeCollisionFrameMsStatName] = 0; - m_stats[ODEAvatarCollisionsStatName] = 0; - m_stats[ODEPrimCollisionsStatName] = 0; + m_stats[ODEAvatarContactsStatsName] = 0; + m_stats[ODEPrimContactsStatName] = 0; } } } \ No newline at end of file From 8333b928fa3353304358ed55293b52478a39ab6e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 01:27:19 +0100 Subject: [PATCH 06/17] Break down native ODE collision frame time stat into native space collision and geom collision stats --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 26 +++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 32dac22bfb..d4c0b85e4a 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -147,6 +147,16 @@ namespace OpenSim.Region.Physics.OdePlugin /// public const string ODENativeCollisionFrameMsStatName = "ODENativeCollisionFrameMS"; + /// + /// Stat name for recording the number of milliseconds that ODE spends in native space collision code. + /// + public const string ODENativeSpaceCollisionFrameMsStatName = "ODENativeSpaceCollisionFrameMS"; + + /// + /// Stat name for recording the number of milliseconds that ODE spends in native geom collision code. + /// + public const string ODENativeGeomCollisionFrameMsStatName = "ODENativeGeomCollisionFrameMS"; + /// /// Stat name for the number of avatar collisions with another entity. /// @@ -843,7 +853,7 @@ namespace OpenSim.Region.Physics.OdePlugin // We do this outside the lock so that any waiting threads aren't held up, though the effect is probably // negligable if (CollectStats) - m_stats[ODENativeCollisionFrameMsStatName] + m_stats[ODENativeGeomCollisionFrameMsStatName] += Util.EnvironmentTickCountSubtract(m_nativeCollisionTickRecorder); return count; @@ -867,7 +877,7 @@ namespace OpenSim.Region.Physics.OdePlugin if (CollectStats && m_inCollisionTiming) { - m_stats[ODENativeCollisionFrameMsStatName] + m_stats[ODENativeSpaceCollisionFrameMsStatName] += Util.EnvironmentTickCountSubtract(m_nativeCollisionTickRecorder); m_inCollisionTiming = false; } @@ -883,7 +893,7 @@ namespace OpenSim.Region.Physics.OdePlugin { if (CollectStats && m_inCollisionTiming) { - m_stats[ODENativeCollisionFrameMsStatName] + m_stats[ODENativeSpaceCollisionFrameMsStatName] += Util.EnvironmentTickCountSubtract(m_nativeCollisionTickRecorder); m_inCollisionTiming = false; } @@ -4079,6 +4089,10 @@ namespace OpenSim.Region.Physics.OdePlugin lock (OdeLock) { returnStats = new Dictionary(m_stats); + + returnStats[ODENativeCollisionFrameMsStatName] + = returnStats[ODENativeSpaceCollisionFrameMsStatName] + + returnStats[ODENativeGeomCollisionFrameMsStatName]; InitializeExtraStats(); } @@ -4088,7 +4102,11 @@ namespace OpenSim.Region.Physics.OdePlugin private void InitializeExtraStats() { - m_stats[ODENativeCollisionFrameMsStatName] = 0; + // No need to zero since this is calculated by addition + // m_stats[ODENativeCollisionFrameMsStatName] = 0; + + m_stats[ODENativeSpaceCollisionFrameMsStatName] = 0; + m_stats[ODENativeGeomCollisionFrameMsStatName] = 0; m_stats[ODEAvatarContactsStatsName] = 0; m_stats[ODEPrimContactsStatName] = 0; } From f2c8c7a7b8cd6a3d3cbbaafa2ba266658b7d0998 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 01:37:19 +0100 Subject: [PATCH 07/17] Add total ODE frame time optional stat, as a sanity check on the main scene physics stat --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 28 +++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index d4c0b85e4a..ab03696472 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -142,6 +142,14 @@ namespace OpenSim.Region.Physics.OdePlugin /// private Dictionary m_stats = new Dictionary(); + /// + /// Stat name for the total time spent in ODE frame processing. + /// + /// + /// A sanity check for the main scene loop physics time. + /// + public const string ODETotalFrameMsStatName = "ODETotalFrameMS"; + /// /// Stat name for recording the number of milliseconds that ODE spends in native collision code. /// @@ -170,7 +178,7 @@ namespace OpenSim.Region.Physics.OdePlugin /// /// Used to hold tick numbers for stat collection purposes. /// - private int m_nativeCollisionTickRecorder; + private int m_nativeCollisionStartTick; /// /// A messy way to tell if we need to avoid adding a collision time because this was already done in the callback. @@ -845,7 +853,7 @@ namespace OpenSim.Region.Physics.OdePlugin { // We do this inside the lock so that we don't count any delay in acquiring it if (CollectStats) - m_nativeCollisionTickRecorder = Util.EnvironmentTickCount(); + m_nativeCollisionStartTick = Util.EnvironmentTickCount(); count = d.Collide(geom1, geom2, maxContacts, contactsArray, contactGeomSize); } @@ -854,7 +862,7 @@ namespace OpenSim.Region.Physics.OdePlugin // negligable if (CollectStats) m_stats[ODENativeGeomCollisionFrameMsStatName] - += Util.EnvironmentTickCountSubtract(m_nativeCollisionTickRecorder); + += Util.EnvironmentTickCountSubtract(m_nativeCollisionStartTick); return count; } @@ -870,7 +878,7 @@ namespace OpenSim.Region.Physics.OdePlugin if (CollectStats) { m_inCollisionTiming = true; - m_nativeCollisionTickRecorder = Util.EnvironmentTickCount(); + m_nativeCollisionStartTick = Util.EnvironmentTickCount(); } d.SpaceCollide2(space1, space2, data, nearCallback); @@ -878,7 +886,7 @@ namespace OpenSim.Region.Physics.OdePlugin if (CollectStats && m_inCollisionTiming) { m_stats[ODENativeSpaceCollisionFrameMsStatName] - += Util.EnvironmentTickCountSubtract(m_nativeCollisionTickRecorder); + += Util.EnvironmentTickCountSubtract(m_nativeCollisionStartTick); m_inCollisionTiming = false; } } @@ -894,7 +902,7 @@ namespace OpenSim.Region.Physics.OdePlugin if (CollectStats && m_inCollisionTiming) { m_stats[ODENativeSpaceCollisionFrameMsStatName] - += Util.EnvironmentTickCountSubtract(m_nativeCollisionTickRecorder); + += Util.EnvironmentTickCountSubtract(m_nativeCollisionStartTick); m_inCollisionTiming = false; } @@ -2822,6 +2830,8 @@ namespace OpenSim.Region.Physics.OdePlugin /// The number of frames simulated over that period. public override float Simulate(float timeStep) { + int startFrameTick = Util.EnvironmentTickCount(); + if (framecount >= int.MaxValue) framecount = 0; @@ -3087,6 +3097,9 @@ namespace OpenSim.Region.Physics.OdePlugin tickCountFrameRun = Util.EnvironmentTickCount(); } + if (CollectStats) + m_stats[ODETotalFrameMsStatName] += Util.EnvironmentTickCount() - startFrameTick; + return fps; } @@ -4089,7 +4102,7 @@ namespace OpenSim.Region.Physics.OdePlugin lock (OdeLock) { returnStats = new Dictionary(m_stats); - + returnStats[ODENativeCollisionFrameMsStatName] = returnStats[ODENativeSpaceCollisionFrameMsStatName] + returnStats[ODENativeGeomCollisionFrameMsStatName]; @@ -4105,6 +4118,7 @@ namespace OpenSim.Region.Physics.OdePlugin // No need to zero since this is calculated by addition // m_stats[ODENativeCollisionFrameMsStatName] = 0; + m_stats[ODETotalFrameMsStatName] = 0; m_stats[ODENativeSpaceCollisionFrameMsStatName] = 0; m_stats[ODENativeGeomCollisionFrameMsStatName] = 0; m_stats[ODEAvatarContactsStatsName] = 0; From 5cc9b820e5b0a9490e6499ee5151c5e698c3e110 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 01:58:28 +0100 Subject: [PATCH 08/17] Add option native step frame ms stat --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 30 ++++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index ab03696472..04c4722b37 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -150,6 +150,11 @@ namespace OpenSim.Region.Physics.OdePlugin /// public const string ODETotalFrameMsStatName = "ODETotalFrameMS"; + /// + /// The amount of time spent in native code that actually steps through the simulation. + /// + public const string ODENativeStepFrameMsStatName = "ODENativeStepFrameMS"; + /// /// Stat name for recording the number of milliseconds that ODE spends in native collision code. /// @@ -2821,23 +2826,23 @@ namespace OpenSim.Region.Physics.OdePlugin /// /// This is our main simulate loop + /// + /// /// It's thread locked by a Mutex in the scene. /// It holds Collisions, it instructs ODE to step through the physical reactions /// It moves the objects around in memory /// It calls the methods that report back to the object owners.. (scenepresence, SceneObjectGroup) - /// + /// /// /// The number of frames simulated over that period. public override float Simulate(float timeStep) { - int startFrameTick = Util.EnvironmentTickCount(); + int startFrameTick = CollectStats ? Util.EnvironmentTickCount() : 0; + int quickStepTick = 0; if (framecount >= int.MaxValue) framecount = 0; - //if (m_worldOffset != Vector3.Zero) - // return 0; - framecount++; float fps = 0; @@ -2845,7 +2850,7 @@ namespace OpenSim.Region.Physics.OdePlugin float timeLeft = timeStep; //m_log.Info(timeStep.ToString()); -// step_time += timeStep; +// step_time += timeSte // // // If We're loaded down by something else, // // or debugging with the Visual Studio project on pause @@ -3007,9 +3012,15 @@ namespace OpenSim.Region.Physics.OdePlugin // "[PHYSICS]: Collision contacts to process this frame = {0}", m_global_contactcount); m_global_contactcount = 0; - + + if (CollectStats) + quickStepTick = Util.EnvironmentTickCount(); + d.WorldQuickStep(world, ODE_STEPSIZE); + if (CollectStats) + m_stats[ODENativeStepFrameMsStatName] += Util.EnvironmentTickCountSubtract(quickStepTick); + d.JointGroupEmpty(contactgroup); } catch (Exception e) @@ -3077,7 +3088,7 @@ namespace OpenSim.Region.Physics.OdePlugin d.WorldExportDIF(world, fname, physics_logging_append_existing_logfile, prefix); } - latertickcount = Util.EnvironmentTickCount() - tickCountFrameRun; + latertickcount = Util.EnvironmentTickCountSubtract(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. @@ -3098,7 +3109,7 @@ namespace OpenSim.Region.Physics.OdePlugin } if (CollectStats) - m_stats[ODETotalFrameMsStatName] += Util.EnvironmentTickCount() - startFrameTick; + m_stats[ODETotalFrameMsStatName] += Util.EnvironmentTickCountSubtract(startFrameTick); return fps; } @@ -4119,6 +4130,7 @@ namespace OpenSim.Region.Physics.OdePlugin // m_stats[ODENativeCollisionFrameMsStatName] = 0; m_stats[ODETotalFrameMsStatName] = 0; + m_stats[ODENativeStepFrameMsStatName] = 0; m_stats[ODENativeSpaceCollisionFrameMsStatName] = 0; m_stats[ODENativeGeomCollisionFrameMsStatName] = 0; m_stats[ODEAvatarContactsStatsName] = 0; From 5f44be99ef63f2f5ef7bcf73f61c29318d657e59 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 02:25:42 +0100 Subject: [PATCH 09/17] Add avatar and prim update milliseconds per frame optional stats --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 38 ++++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 04c4722b37..f1fa38eeee 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -151,25 +151,35 @@ namespace OpenSim.Region.Physics.OdePlugin public const string ODETotalFrameMsStatName = "ODETotalFrameMS"; /// - /// The amount of time spent in native code that actually steps through the simulation. + /// Stat name for the amount of time spent in native code that actually steps through the simulation. /// public const string ODENativeStepFrameMsStatName = "ODENativeStepFrameMS"; /// - /// Stat name for recording the number of milliseconds that ODE spends in native collision code. + /// Stat name for the number of milliseconds that ODE spends in native collision code. /// public const string ODENativeCollisionFrameMsStatName = "ODENativeCollisionFrameMS"; /// - /// Stat name for recording the number of milliseconds that ODE spends in native space collision code. + /// Stat name for the number of milliseconds that ODE spends in native space collision code. /// public const string ODENativeSpaceCollisionFrameMsStatName = "ODENativeSpaceCollisionFrameMS"; /// - /// Stat name for recording the number of milliseconds that ODE spends in native geom collision code. + /// Stat name for the number of milliseconds that ODE spends in native geom collision code. /// public const string ODENativeGeomCollisionFrameMsStatName = "ODENativeGeomCollisionFrameMS"; + /// + /// Stat name for the milliseconds spent updating avatar position and velocity + /// + public const string ODEAvatarUpdateFrameMsStatName = "ODEAvatarUpdateFrameMS"; + + /// + /// Stat name for the milliseconds spent updating prim position and velocity + /// + public const string ODEPrimUpdateFrameMsStatName = "ODEPrimUpdateFrameMS"; + /// /// Stat name for the number of avatar collisions with another entity. /// @@ -2838,7 +2848,7 @@ namespace OpenSim.Region.Physics.OdePlugin public override float Simulate(float timeStep) { int startFrameTick = CollectStats ? Util.EnvironmentTickCount() : 0; - int quickStepTick = 0; + int tempTick = 0;; if (framecount >= int.MaxValue) framecount = 0; @@ -3014,12 +3024,12 @@ namespace OpenSim.Region.Physics.OdePlugin m_global_contactcount = 0; if (CollectStats) - quickStepTick = Util.EnvironmentTickCount(); + tempTick = Util.EnvironmentTickCount(); d.WorldQuickStep(world, ODE_STEPSIZE); if (CollectStats) - m_stats[ODENativeStepFrameMsStatName] += Util.EnvironmentTickCountSubtract(quickStepTick); + m_stats[ODENativeStepFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick); d.JointGroupEmpty(contactgroup); } @@ -3031,6 +3041,9 @@ namespace OpenSim.Region.Physics.OdePlugin timeLeft -= ODE_STEPSIZE; } + if (CollectStats) + tempTick = Util.EnvironmentTickCount(); + foreach (OdeCharacter actor in _characters) { if (actor.bad) @@ -3054,6 +3067,12 @@ namespace OpenSim.Region.Physics.OdePlugin defects.Clear(); } + if (CollectStats) + { + m_stats[ODEAvatarUpdateFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick); + tempTick = Util.EnvironmentTickCount(); + } + //if (timeStep < 0.2f) foreach (OdePrim prim in _activeprims) @@ -3067,6 +3086,9 @@ namespace OpenSim.Region.Physics.OdePlugin } } + if (CollectStats) + m_stats[ODEPrimUpdateFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick); + //DumpJointInfo(); // Finished with all sim stepping. If requested, dump world state to file for debugging. @@ -4135,6 +4157,8 @@ namespace OpenSim.Region.Physics.OdePlugin m_stats[ODENativeGeomCollisionFrameMsStatName] = 0; m_stats[ODEAvatarContactsStatsName] = 0; m_stats[ODEPrimContactsStatName] = 0; + m_stats[ODEAvatarUpdateFrameMsStatName] = 0; + m_stats[ODEPrimUpdateFrameMsStatName] = 0; } } } \ No newline at end of file From 31343aa7c3182f4b7e05d7dc01c4c43bd2d43596 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 02:33:44 +0100 Subject: [PATCH 10/17] Add optional stat that records milliseconds spent notifying collision listeners in physics frames --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index f1fa38eeee..0b9ad614b6 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -170,6 +170,11 @@ namespace OpenSim.Region.Physics.OdePlugin /// public const string ODENativeGeomCollisionFrameMsStatName = "ODENativeGeomCollisionFrameMS"; + /// + /// Stat name for time spent notifying listeners of collisions + /// + public const string ODECollisionNotificationFrameMsStatName = "ODECollisionNotificationFrameMS"; + /// /// Stat name for the milliseconds spent updating avatar position and velocity /// @@ -2998,6 +3003,9 @@ namespace OpenSim.Region.Physics.OdePlugin collision_optimized(); + if (CollectStats) + tempTick = Util.EnvironmentTickCount(); + foreach (PhysicsActor obj in _collisionEventPrim.Values) { // m_log.DebugFormat("[PHYSICS]: Assessing {0} {1} for collision events", obj.SOPName, obj.LocalID); @@ -3024,7 +3032,12 @@ namespace OpenSim.Region.Physics.OdePlugin m_global_contactcount = 0; if (CollectStats) + { + m_stats[ODECollisionNotificationFrameMsStatName] + += Util.EnvironmentTickCountSubtract(tempTick); + tempTick = Util.EnvironmentTickCount(); + } d.WorldQuickStep(world, ODE_STEPSIZE); @@ -4155,6 +4168,7 @@ namespace OpenSim.Region.Physics.OdePlugin m_stats[ODENativeStepFrameMsStatName] = 0; m_stats[ODENativeSpaceCollisionFrameMsStatName] = 0; m_stats[ODENativeGeomCollisionFrameMsStatName] = 0; + m_stats[ODECollisionNotificationFrameMsStatName] = 0; m_stats[ODEAvatarContactsStatsName] = 0; m_stats[ODEPrimContactsStatName] = 0; m_stats[ODEAvatarUpdateFrameMsStatName] = 0; From d1b5f8d9d76e3c7c4c23f485dd070e3775e8e85f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 02:35:11 +0100 Subject: [PATCH 11/17] Remove recent optional native collision frame milliseconds stat Unnecessary since this has now been broken down into space collisions and geom collisions --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 0b9ad614b6..948930bf39 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -155,11 +155,6 @@ namespace OpenSim.Region.Physics.OdePlugin /// public const string ODENativeStepFrameMsStatName = "ODENativeStepFrameMS"; - /// - /// Stat name for the number of milliseconds that ODE spends in native collision code. - /// - public const string ODENativeCollisionFrameMsStatName = "ODENativeCollisionFrameMS"; - /// /// Stat name for the number of milliseconds that ODE spends in native space collision code. /// @@ -3035,7 +3030,7 @@ namespace OpenSim.Region.Physics.OdePlugin { m_stats[ODECollisionNotificationFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick); - + tempTick = Util.EnvironmentTickCount(); } @@ -4149,10 +4144,6 @@ namespace OpenSim.Region.Physics.OdePlugin { returnStats = new Dictionary(m_stats); - returnStats[ODENativeCollisionFrameMsStatName] - = returnStats[ODENativeSpaceCollisionFrameMsStatName] - + returnStats[ODENativeGeomCollisionFrameMsStatName]; - InitializeExtraStats(); } @@ -4161,9 +4152,6 @@ namespace OpenSim.Region.Physics.OdePlugin private void InitializeExtraStats() { - // No need to zero since this is calculated by addition - // m_stats[ODENativeCollisionFrameMsStatName] = 0; - m_stats[ODETotalFrameMsStatName] = 0; m_stats[ODENativeStepFrameMsStatName] = 0; m_stats[ODENativeSpaceCollisionFrameMsStatName] = 0; From 9ff8efc72014d8d5e971c3ceb7ec83bf9c19d69f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 03:03:48 +0100 Subject: [PATCH 12/17] Collection optional avatar and prim taint frame millisecond times --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 43 ++++++++++++++++---- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 948930bf39..63b999ec29 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -150,6 +150,16 @@ namespace OpenSim.Region.Physics.OdePlugin /// public const string ODETotalFrameMsStatName = "ODETotalFrameMS"; + /// + /// Stat name for amount of time spent processing avatar taints per frame + /// + public const string ODEAvatarTaintMsStatName = "ODEAvatarTaintFrameMS"; + + /// + /// Stat name for amount of time spent processing prim taints per frame + /// + public const string ODEPrimTaintMsStatName = "ODEPrimTaintFrameMS"; + /// /// Stat name for the amount of time spent in native code that actually steps through the simulation. /// @@ -2848,7 +2858,7 @@ namespace OpenSim.Region.Physics.OdePlugin public override float Simulate(float timeStep) { int startFrameTick = CollectStats ? Util.EnvironmentTickCount() : 0; - int tempTick = 0;; + int tempTick = 0, tempTick2 = 0; if (framecount >= int.MaxValue) framecount = 0; @@ -2926,6 +2936,9 @@ namespace OpenSim.Region.Physics.OdePlugin { try { + if (CollectStats) + tempTick = Util.EnvironmentTickCount(); + lock (_taintedActors) { foreach (OdeCharacter character in _taintedActors) @@ -2934,6 +2947,13 @@ namespace OpenSim.Region.Physics.OdePlugin _taintedActors.Clear(); } + if (CollectStats) + { + tempTick2 = Util.EnvironmentTickCount(); + m_stats[ODEAvatarTaintMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); + tempTick = tempTick2; + } + lock (_taintedPrims) { foreach (OdePrim prim in _taintedPrims) @@ -2964,6 +2984,13 @@ namespace OpenSim.Region.Physics.OdePlugin _taintedPrims.Clear(); } + if (CollectStats) + { + tempTick2 = Util.EnvironmentTickCount(); + m_stats[ODEPrimTaintMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); + tempTick = tempTick2; + } + // Move characters foreach (OdeCharacter actor in _characters) actor.Move(defects); @@ -3028,10 +3055,9 @@ namespace OpenSim.Region.Physics.OdePlugin if (CollectStats) { - m_stats[ODECollisionNotificationFrameMsStatName] - += Util.EnvironmentTickCountSubtract(tempTick); - - tempTick = Util.EnvironmentTickCount(); + tempTick2 = Util.EnvironmentTickCount(); + m_stats[ODECollisionNotificationFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); + tempTick = tempTick2; } d.WorldQuickStep(world, ODE_STEPSIZE); @@ -3077,8 +3103,9 @@ namespace OpenSim.Region.Physics.OdePlugin if (CollectStats) { - m_stats[ODEAvatarUpdateFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick); - tempTick = Util.EnvironmentTickCount(); + tempTick2 = Util.EnvironmentTickCount(); + m_stats[ODEAvatarUpdateFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); + tempTick = tempTick2; } //if (timeStep < 0.2f) @@ -4153,6 +4180,8 @@ namespace OpenSim.Region.Physics.OdePlugin private void InitializeExtraStats() { m_stats[ODETotalFrameMsStatName] = 0; + m_stats[ODEAvatarTaintMsStatName] = 0; + m_stats[ODEPrimTaintMsStatName] = 0; m_stats[ODENativeStepFrameMsStatName] = 0; m_stats[ODENativeSpaceCollisionFrameMsStatName] = 0; m_stats[ODENativeGeomCollisionFrameMsStatName] = 0; From d34b84b53137f5516f790563588676ac5fbf0e49 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 03:23:19 +0100 Subject: [PATCH 13/17] Add avatar forces calculation, prim force and raycasting per frame millisecond optional stats --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 53 +++++++++++++++++--- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 63b999ec29..e44375b714 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -151,17 +151,32 @@ namespace OpenSim.Region.Physics.OdePlugin public const string ODETotalFrameMsStatName = "ODETotalFrameMS"; /// - /// Stat name for amount of time spent processing avatar taints per frame + /// Stat name for time spent processing avatar taints per frame /// public const string ODEAvatarTaintMsStatName = "ODEAvatarTaintFrameMS"; /// - /// Stat name for amount of time spent processing prim taints per frame + /// Stat name for time spent processing prim taints per frame /// public const string ODEPrimTaintMsStatName = "ODEPrimTaintFrameMS"; /// - /// Stat name for the amount of time spent in native code that actually steps through the simulation. + /// Stat name for time spent calculating avatar forces per frame. + /// + public const string ODEAvatarForcesFrameMsStatName = "ODEAvatarForcesFrameMS"; + + /// + /// Stat name for time spent calculating prim forces per frame + /// + public const string ODEPrimForcesFrameMsStatName = "ODEPrimForcesFrameMS"; + + /// + /// Stat name for time spent fulfilling raycasting requests per frame + /// + public const string ODERaycastingFrameMsStatName = "ODERaycastingFrameMS"; + + /// + /// Stat name for time spent in native code that actually steps through the simulation. /// public const string ODENativeStepFrameMsStatName = "ODENativeStepFrameMS"; @@ -171,7 +186,7 @@ namespace OpenSim.Region.Physics.OdePlugin public const string ODENativeSpaceCollisionFrameMsStatName = "ODENativeSpaceCollisionFrameMS"; /// - /// Stat name for the number of milliseconds that ODE spends in native geom collision code. + /// Stat name for milliseconds that ODE spends in native geom collision code. /// public const string ODENativeGeomCollisionFrameMsStatName = "ODENativeGeomCollisionFrameMS"; @@ -181,7 +196,7 @@ namespace OpenSim.Region.Physics.OdePlugin public const string ODECollisionNotificationFrameMsStatName = "ODECollisionNotificationFrameMS"; /// - /// Stat name for the milliseconds spent updating avatar position and velocity + /// Stat name for milliseconds spent updating avatar position and velocity /// public const string ODEAvatarUpdateFrameMsStatName = "ODEAvatarUpdateFrameMS"; @@ -191,12 +206,12 @@ namespace OpenSim.Region.Physics.OdePlugin public const string ODEPrimUpdateFrameMsStatName = "ODEPrimUpdateFrameMS"; /// - /// Stat name for the number of avatar collisions with another entity. + /// Stat name for avatar collisions with another entity. /// public const string ODEAvatarContactsStatsName = "ODEAvatarContacts"; /// - /// Stat name for the number of prim collisions with another entity. + /// Stat name for prim collisions with another entity. /// public const string ODEPrimContactsStatName = "ODEPrimContacts"; @@ -3010,6 +3025,13 @@ namespace OpenSim.Region.Physics.OdePlugin defects.Clear(); } + if (CollectStats) + { + tempTick2 = Util.EnvironmentTickCount(); + m_stats[ODEAvatarForcesFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); + tempTick = tempTick2; + } + // Move other active objects foreach (OdePrim prim in _activeprims) { @@ -3017,12 +3039,26 @@ namespace OpenSim.Region.Physics.OdePlugin prim.Move(timeStep); } + if (CollectStats) + { + tempTick2 = Util.EnvironmentTickCount(); + m_stats[ODEPrimForcesFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); + tempTick = tempTick2; + } + //if ((framecount % m_randomizeWater) == 0) // randomizeWater(waterlevel); //int RayCastTimeMS = m_rayCastManager.ProcessQueuedRequests(); m_rayCastManager.ProcessQueuedRequests(); + if (CollectStats) + { + tempTick2 = Util.EnvironmentTickCount(); + m_stats[ODERaycastingFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); + tempTick = tempTick2; + } + collision_optimized(); if (CollectStats) @@ -4182,6 +4218,9 @@ namespace OpenSim.Region.Physics.OdePlugin m_stats[ODETotalFrameMsStatName] = 0; m_stats[ODEAvatarTaintMsStatName] = 0; m_stats[ODEPrimTaintMsStatName] = 0; + m_stats[ODEAvatarForcesFrameMsStatName] = 0; + m_stats[ODEPrimForcesFrameMsStatName] = 0; + m_stats[ODERaycastingFrameMsStatName] = 0; m_stats[ODENativeStepFrameMsStatName] = 0; m_stats[ODENativeSpaceCollisionFrameMsStatName] = 0; m_stats[ODENativeGeomCollisionFrameMsStatName] = 0; From 200376b3c4717e9ae00b67ef5f2a57383952f2d5 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 03:49:42 +0100 Subject: [PATCH 14/17] Add optional stat for the other collision time per frame not spent in ODE native spaces or geom collision code --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index e44375b714..859045390c 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -190,6 +190,11 @@ namespace OpenSim.Region.Physics.OdePlugin /// public const string ODENativeGeomCollisionFrameMsStatName = "ODENativeGeomCollisionFrameMS"; + /// + /// Time spent in collision processing that is not spent in native space or geom collision code. + /// + public const string ODEOtherCollisionFrameMsStatName = "ODEOtherCollisionFrameMS"; + /// /// Stat name for time spent notifying listeners of collisions /// @@ -3062,7 +3067,11 @@ namespace OpenSim.Region.Physics.OdePlugin collision_optimized(); if (CollectStats) - tempTick = Util.EnvironmentTickCount(); + { + tempTick2 = Util.EnvironmentTickCount(); + m_stats[ODEOtherCollisionFrameMsStatName] += Util.EnvironmentTickCountSubtract(tempTick2, tempTick); + tempTick = tempTick2; + } foreach (PhysicsActor obj in _collisionEventPrim.Values) { @@ -4210,6 +4219,11 @@ namespace OpenSim.Region.Physics.OdePlugin InitializeExtraStats(); } + returnStats[ODEOtherCollisionFrameMsStatName] + = returnStats[ODEOtherCollisionFrameMsStatName] + - returnStats[ODENativeSpaceCollisionFrameMsStatName] + - returnStats[ODENativeGeomCollisionFrameMsStatName]; + return returnStats; } @@ -4224,6 +4238,7 @@ namespace OpenSim.Region.Physics.OdePlugin m_stats[ODENativeStepFrameMsStatName] = 0; m_stats[ODENativeSpaceCollisionFrameMsStatName] = 0; m_stats[ODENativeGeomCollisionFrameMsStatName] = 0; + m_stats[ODEOtherCollisionFrameMsStatName] = 0; m_stats[ODECollisionNotificationFrameMsStatName] = 0; m_stats[ODEAvatarContactsStatsName] = 0; m_stats[ODEPrimContactsStatName] = 0; From 4e06a46dc5e6d0fb6a894932e706e4a01351ec64 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 04:07:39 +0100 Subject: [PATCH 15/17] If OdeScene.Near() returns no collision contacts, then exit as early as possible. All subsequent code is only relevant if there are contacts. --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 859045390c..c26c9c581a 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -1025,6 +1025,10 @@ namespace OpenSim.Region.Physics.OdePlugin count = CollideGeoms(g1, g2, contacts.Length, contacts, d.ContactGeom.SizeOf); + // All code after this is only relevant if we have any collisions + if (count <= 0) + return; + if (count > contacts.Length) m_log.Error("[ODE SCENE]: Got " + count + " contacts when we asked for a maximum of " + contacts.Length); } From 6375db1533e6c625d7b6394542f74141092ff780 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 04:23:36 +0100 Subject: [PATCH 16/17] Add optional total avatars, total prims and active prims stats to ODE plugin. These will act as a sanity check with the main scene stats, to show that physics scene entities are being managed properly. Total prims will not match scene total prims since physics total does not include phantom prims --- OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 21 ++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index c26c9c581a..c6ecc68ae9 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -142,6 +142,21 @@ namespace OpenSim.Region.Physics.OdePlugin /// private Dictionary m_stats = new Dictionary(); + /// + /// Stat name for total number of avatars in this ODE scene. + /// + public const string ODETotalAvatarsStatName = "ODETotalAvatars"; + + /// + /// Stat name for total number of prims in this ODE scene. + /// + public const string ODETotalPrimsStatName = "ODETotalPrims"; + + /// + /// Stat name for total number of prims with active physics in this ODE scene. + /// + public const string ODEActivePrimsStatName = "ODEActivePrims"; + /// /// Stat name for the total time spent in ODE frame processing. /// @@ -4220,6 +4235,12 @@ namespace OpenSim.Region.Physics.OdePlugin { returnStats = new Dictionary(m_stats); + // FIXME: This is a SUPER DUMB HACK until we can establish stats that aren't subject to a division by + // 3 from the SimStatsReporter. + returnStats[ODETotalAvatarsStatName] = _characters.Count * 3; + returnStats[ODETotalPrimsStatName] = _prims.Count * 3; + returnStats[ODEActivePrimsStatName] = _activeprims.Count * 3; + InitializeExtraStats(); } From 72219eae7d3dac01e73ab5fdf84f05f8d0fa00cf Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 1 Jun 2012 04:45:42 +0100 Subject: [PATCH 17/17] Instead of updating sim stats root agent, child, objects and scripts accounts every single scene frame, update in the once every 3 seconds SimStatsReporter run --- OpenSim/Region/Framework/Scenes/Scene.cs | 5 --- .../Framework/Scenes/SimStatsReporter.cs | 42 +++++++------------ 2 files changed, 14 insertions(+), 33 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index ce386be205..702e3220f6 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1462,10 +1462,6 @@ namespace OpenSim.Region.Framework.Scenes StatsReporter.AddPhysicsFPS(physicsFPS); StatsReporter.AddTimeDilation(TimeDilation); StatsReporter.AddFPS(1); - StatsReporter.SetRootAgents(m_sceneGraph.GetRootAgentCount()); - StatsReporter.SetChildAgents(m_sceneGraph.GetChildAgentCount()); - StatsReporter.SetObjects(m_sceneGraph.GetTotalObjectsCount()); - StatsReporter.SetActiveObjects(m_sceneGraph.GetActiveObjectsCount()); // frameMS currently records work frame times, not total frame times (work + any required sleep to // reach min frame time. @@ -1474,7 +1470,6 @@ namespace OpenSim.Region.Framework.Scenes StatsReporter.addAgentMS(agentMS); StatsReporter.addPhysicsMS(physicsMS + physicsMS2); StatsReporter.addOtherMS(otherMS); - StatsReporter.SetActiveScripts(m_sceneGraph.GetActiveScriptsCount()); StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS()); if (LoginsDisabled && Frame == 20) diff --git a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs index 08d8d7c28f..87af311a06 100644 --- a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs +++ b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs @@ -207,6 +207,10 @@ namespace OpenSim.Region.Framework.Scenes m_report.Close(); } + /// + /// Sets the number of milliseconds between stat updates. + /// + /// public void SetUpdateMS(int ms) { statsUpdatesEveryMS = ms; @@ -254,6 +258,16 @@ namespace OpenSim.Region.Framework.Scenes physfps = 0; #endregion + + m_rootAgents = m_scene.SceneGraph.GetRootAgentCount(); + m_childAgents = m_scene.SceneGraph.GetChildAgentCount(); + m_numPrim = m_scene.SceneGraph.GetTotalObjectsCount(); + m_activePrim = m_scene.SceneGraph.GetActiveObjectsCount(); + m_activeScripts = m_scene.SceneGraph.GetActiveScriptsCount(); + + // FIXME: Checking for stat sanity is a complex approach. What we really need to do is fix the code + // so that stat numbers are always consistent. + CheckStatSanity(); //Our time dilation is 0.91 when we're running a full speed, // therefore to make sure we get an appropriate range, @@ -408,13 +422,6 @@ namespace OpenSim.Region.Framework.Scenes m_timeDilation = td; } - public void SetRootAgents(int rootAgents) - { - m_rootAgents = rootAgents; - CheckStatSanity(); - - } - internal void CheckStatSanity() { if (m_rootAgents < 0 || m_childAgents < 0) @@ -431,22 +438,6 @@ namespace OpenSim.Region.Framework.Scenes } } - public void SetChildAgents(int childAgents) - { - m_childAgents = childAgents; - CheckStatSanity(); - } - - public void SetObjects(int objects) - { - m_numPrim = objects; - } - - public void SetActiveObjects(int objects) - { - m_activePrim = objects; - } - public void AddFPS(int frames) { m_fps += frames; @@ -528,11 +519,6 @@ namespace OpenSim.Region.Framework.Scenes m_scriptLinesPerSecond += count; } - public void SetActiveScripts(int count) - { - m_activeScripts = count; - } - public void AddPacketsStats(int inPackets, int outPackets, int unAckedBytes) { AddInPackets(inPackets);