diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index a6b91a3e34..6fba71eec3 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -462,7 +462,7 @@ namespace OpenSim string password = MainConsole.Instance.PasswdPrompt("Password"); string email = MainConsole.Instance.CmdPrompt("Email", ""); - string rawPrincipalId = MainConsole.Instance.CmdPrompt("ID", UUID.Random().ToString()); + string rawPrincipalId = MainConsole.Instance.CmdPrompt("User ID", UUID.Random().ToString()); UUID principalId = UUID.Zero; if (!UUID.TryParse(rawPrincipalId, out principalId)) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 29a54e81b6..b1755ac3c2 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; @@ -173,6 +183,7 @@ namespace OpenSim.Region.Framework.Scenes // private int m_update_land = 1; private int m_update_coarse_locations = 50; + private int agentMS; private int frameMS; private int physicsMS2; private int physicsMS; @@ -1211,17 +1222,20 @@ 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(); int tmpFrameMS = maintc; - tempOnRezMS = eventMS = backupMS = terrainMS = landMS = 0; + agentMS = tempOnRezMS = eventMS = backupMS = terrainMS = landMS = 0; + // TODO: ADD AGENT TIME HERE // Increment the frame counter ++Frame; try { + int tmpAgentMS = Util.EnvironmentTickCount(); + // Check if any objects have reached their targets CheckAtTargets(); @@ -1248,6 +1262,8 @@ namespace OpenSim.Region.Framework.Scenes }); } + agentMS = Util.EnvironmentTickCountSubtract(tmpAgentMS); + int tmpPhysicsMS2 = Util.EnvironmentTickCount(); if ((Frame % m_update_physics == 0) && m_physics_enabled) m_sceneGraph.UpdatePreparePhysics(); @@ -1255,7 +1271,11 @@ namespace OpenSim.Region.Framework.Scenes // Apply any pending avatar force input to the avatar's velocity if (Frame % m_update_entitymovement == 0) + { + tmpAgentMS = Util.EnvironmentTickCount(); m_sceneGraph.UpdateScenePresenceMovement(); + agentMS += Util.EnvironmentTickCountSubtract(tmpAgentMS); + } // Perform the main physics update. This will do the actual work of moving objects and avatars according to their // velocity @@ -1263,7 +1283,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); } @@ -1320,6 +1340,7 @@ namespace OpenSim.Region.Framework.Scenes StatsReporter.SetObjects(m_sceneGraph.GetTotalObjectsCount()); StatsReporter.SetActiveObjects(m_sceneGraph.GetActiveObjectsCount()); StatsReporter.addFrameMS(frameMS); + StatsReporter.addAgentMS(agentMS); StatsReporter.addPhysicsMS(physicsMS + physicsMS2); StatsReporter.addOtherMS(otherMS); StatsReporter.SetActiveScripts(m_sceneGraph.GetActiveScriptsCount()); @@ -1379,11 +1400,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 36c5c52483..caec704fb5 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -166,6 +166,12 @@ namespace OpenSim.Region.Framework.Scenes } } + /// + /// Update the position of all the scene presences. + /// + /// + /// Called only from the main scene loop. + /// protected internal void UpdatePresences() { ForEachScenePresence(delegate(ScenePresence presence) @@ -174,6 +180,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/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 0290576c95..ce63946b48 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -870,11 +870,7 @@ namespace OpenSim.Region.Framework.Scenes /// public void SendPrimUpdates() { - m_perfMonMS = Util.EnvironmentTickCount(); - SceneViewer.SendPrimUpdates(); - - m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); } #region Status Methods @@ -1276,7 +1272,7 @@ namespace OpenSim.Region.Framework.Scenes // return; //} - m_perfMonMS = Util.EnvironmentTickCount(); +// m_perfMonMS = Util.EnvironmentTickCount(); ++m_movementUpdateCount; if (m_movementUpdateCount < 1) @@ -1565,7 +1561,8 @@ namespace OpenSim.Region.Framework.Scenes m_scene.EventManager.TriggerOnClientMovement(this); - m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); + // It doesn't make sense to add this to frame stats as this update is processed indepedently of the scene loop +// m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); } /// @@ -2341,8 +2338,6 @@ namespace OpenSim.Region.Framework.Scenes /// The vector in which to move. This is relative to the rotation argument public void AddNewMovement(Vector3 vec) { - m_perfMonMS = Util.EnvironmentTickCount(); - Vector3 direc = vec * Rotation; direc.Normalize(); @@ -2379,8 +2374,6 @@ namespace OpenSim.Region.Framework.Scenes // TODO: Add the force instead of only setting it to support multiple forces per frame? m_forceToApply = direc; - - m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); } #endregion @@ -2443,8 +2436,6 @@ namespace OpenSim.Region.Framework.Scenes // server. if (remoteClient.IsActive) { - m_perfMonMS = Util.EnvironmentTickCount(); - Vector3 pos = m_pos; pos.Z += Appearance.HipOffset; @@ -2455,7 +2446,6 @@ namespace OpenSim.Region.Framework.Scenes PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity); - m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); m_scene.StatsReporter.AddAgentUpdates(1); } } @@ -2496,14 +2486,11 @@ namespace OpenSim.Region.Framework.Scenes || Math.Abs(distanceError) > distanceErrorThreshold || velocidyDiff > 0.01f) // did velocity change from last update? { - m_perfMonMS = currentTick; lastVelocitySentToAllClients = Velocity; lastTerseUpdateToAllClientsTick = currentTick; lastPositionSentToAllClients = OffsetPosition; m_scene.ForEachClient(SendTerseUpdateToClient); - - m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); } } @@ -2524,9 +2511,7 @@ namespace OpenSim.Region.Framework.Scenes public void SendCoarseLocationsDefault(UUID sceneId, ScenePresence p, List coarseLocations, List avatarUUIDs) { - m_perfMonMS = Util.EnvironmentTickCount(); ControllingClient.SendCoarseLocationUpdate(avatarUUIDs, coarseLocations); - m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); } /// @@ -2587,8 +2572,6 @@ namespace OpenSim.Region.Framework.Scenes m_log.Warn("[SCENE PRESENCE] attempt to send avatar data from a child agent"); return; } - - m_perfMonMS = Util.EnvironmentTickCount(); int count = 0; m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence) @@ -2598,7 +2581,6 @@ namespace OpenSim.Region.Framework.Scenes }); m_scene.StatsReporter.AddAgentUpdates(count); - m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); } /// @@ -2607,8 +2589,6 @@ namespace OpenSim.Region.Framework.Scenes /// public void SendOtherAgentsAvatarDataToMe() { - m_perfMonMS = Util.EnvironmentTickCount(); - int count = 0; m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence) { @@ -2625,7 +2605,6 @@ namespace OpenSim.Region.Framework.Scenes }); m_scene.StatsReporter.AddAgentUpdates(count); - m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); } /// @@ -2654,8 +2633,6 @@ namespace OpenSim.Region.Framework.Scenes m_log.Warn("[SCENE PRESENCE] attempt to send avatar data from a child agent"); return; } - - m_perfMonMS = Util.EnvironmentTickCount(); int count = 0; m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence) @@ -2668,7 +2645,6 @@ namespace OpenSim.Region.Framework.Scenes }); m_scene.StatsReporter.AddAgentUpdates(count); - m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); } /// @@ -2678,7 +2654,6 @@ namespace OpenSim.Region.Framework.Scenes public void SendOtherAgentsAppearanceToMe() { //m_log.DebugFormat("[SCENE PRESENCE] SendOtherAgentsAppearanceToMe: {0} ({1})", Name, UUID); - m_perfMonMS = Util.EnvironmentTickCount(); int count = 0; m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence) @@ -2696,7 +2671,6 @@ namespace OpenSim.Region.Framework.Scenes }); m_scene.StatsReporter.AddAgentUpdates(count); - m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); } /// diff --git a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs index 87dcdeea14..282b677ee5 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; + lastReportedSimFPS = (float)m_fps / statsUpdateFactor; - //if (simfps > 45) - //simfps = simfps - (simfps - 45); - //if (simfps < 0) - //simfps = 0; - - // 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; @@ -455,12 +452,6 @@ namespace OpenSim.Region.Framework.Scenes AddOutPackets(outPackets); AddunAckedBytes(unAckedBytes); } - - public void AddAgentTime(int ms) - { - addFrameMS(ms); - addAgentMS(ms); - } #endregion } diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs index 6e603e8f4f..2da922bce0 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs @@ -2651,8 +2651,6 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name); //base.TriggerPhysicsBasedRestart(); //} - int i = 0; - // Figure out the Frames Per Second we're going at. //(step_time == 0.004f, there's 250 of those per second. Times the step time/step size @@ -2810,7 +2808,6 @@ Console.WriteLine("AddPhysicsActorTaint to " + taintedprim.Name); } step_time -= ODE_STEPSIZE; - i++; //} //else //{ diff --git a/OpenSim/Region/UserStatistics/WebStatsModule.cs b/OpenSim/Region/UserStatistics/WebStatsModule.cs index 3139b8ade1..9d87c4502d 100644 --- a/OpenSim/Region/UserStatistics/WebStatsModule.cs +++ b/OpenSim/Region/UserStatistics/WebStatsModule.cs @@ -58,7 +58,7 @@ namespace OpenSim.Region.UserStatistics private static SqliteConnection dbConn; private Dictionary m_sessions = new Dictionary(); - private List m_scene = new List(); + private List m_scenes = new List(); private Dictionary reports = new Dictionary(); private Dictionary m_simstatsCounters = new Dictionary(); private const int updateStatsMod = 6; @@ -71,25 +71,17 @@ namespace OpenSim.Region.UserStatistics public virtual void Initialise(Scene scene, IConfigSource config) { - IConfig cnfg; - try - { - cnfg = config.Configs["WebStats"]; + IConfig cnfg = config.Configs["WebStats"]; + + if (cnfg != null) enabled = cnfg.GetBoolean("enabled", false); - } - catch (Exception) - { - enabled = false; - } if (!enabled) - { return; - } - lock (m_scene) + lock (m_scenes) { - if (m_scene.Count == 0) + if (m_scenes.Count == 0) { //IConfig startupConfig = config.Configs["Startup"]; @@ -115,22 +107,19 @@ namespace OpenSim.Region.UserStatistics reports.Add("clients.report", clientReport); reports.Add("sessions.report", sessionsReport); - - //// // Add Your own Reports here (Do Not Modify Lines here Devs!) //// //// // End Own reports section - //// - + //// MainServer.Instance.AddHTTPHandler("/SStats/", HandleStatsRequest); MainServer.Instance.AddHTTPHandler("/CAPS/VS/", HandleUnknownCAPSRequest); } - m_scene.Add(scene); + m_scenes.Add(scene); if (m_simstatsCounters.ContainsKey(scene.RegionInfo.RegionID)) m_simstatsCounters.Remove(scene.RegionInfo.RegionID); @@ -214,7 +203,7 @@ namespace OpenSim.Region.UserStatistics repParams["DatabaseConnection"] = dbConn; - repParams["Scenes"] = m_scene; + repParams["Scenes"] = m_scenes; repParams["SimStats"] = m_simstatsCounters; repParams["LogLines"] = m_loglines; repParams["Reports"] = reports; @@ -265,7 +254,6 @@ namespace OpenSim.Region.UserStatistics CreateTables(db); } } - } public void CreateTables(SqliteConnection db) @@ -277,8 +265,6 @@ namespace OpenSim.Region.UserStatistics createcmd.ExecuteNonQuery(); } - - public virtual void PostInitialise() { if (!enabled) @@ -297,7 +283,7 @@ namespace OpenSim.Region.UserStatistics dbConn.Close(); dbConn.Dispose(); m_sessions.Clear(); - m_scene.Clear(); + m_scenes.Clear(); reports.Clear(); m_simstatsCounters.Clear(); } @@ -333,10 +319,10 @@ namespace OpenSim.Region.UserStatistics protected virtual void AddHandlers() { - lock (m_scene) + lock (m_scenes) { - updateLogMod = m_scene.Count * 2; - foreach (Scene scene in m_scene) + updateLogMod = m_scenes.Count * 2; + foreach (Scene scene in m_scenes) { scene.EventManager.OnRegisterCaps += OnRegisterCaps; scene.EventManager.OnDeregisterCaps += OnDeRegisterCaps; @@ -376,15 +362,11 @@ namespace OpenSim.Region.UserStatistics } } - - - public void OnMakeChildAgent(ScenePresence agent) { } - public void OnClientClosed(UUID agentID, Scene scene) { lock (m_sessions) @@ -394,7 +376,6 @@ namespace OpenSim.Region.UserStatistics m_sessions.Remove(agentID); } } - } public string readLogLines(int amount) @@ -433,14 +414,13 @@ namespace OpenSim.Region.UserStatistics fs.Close(); fs.Dispose(); return encoding.GetString(buffer); - } public UUID GetRegionUUIDFromHandle(ulong regionhandle) { - lock (m_scene) + lock (m_scenes) { - foreach (Scene scene in m_scene) + foreach (Scene scene in m_scenes) { if (scene.RegionInfo.RegionHandle == regionhandle) return scene.RegionInfo.RegionID; @@ -448,6 +428,7 @@ namespace OpenSim.Region.UserStatistics } return UUID.Zero; } + /// /// Callback for a viewerstats cap /// @@ -523,8 +504,6 @@ namespace OpenSim.Region.UserStatistics usd = uid.session_data; - - if (message.Type != OSDType.Map) return new UserSessionID(); @@ -699,7 +678,6 @@ namespace OpenSim.Region.UserStatistics } } - } #region SQL @@ -824,6 +802,7 @@ set session_id=:session_id, WHERE session_id=:session_key AND agent_id=:agent_key AND region_id=:region_key"; #endregion } + public static class UserSessionUtil { public static UserSessionData newUserSessionData() @@ -941,7 +920,6 @@ WHERE session_id=:session_key AND agent_id=:agent_key AND region_id=:region_key" return result / cnt; } - public static float ArrayMode_f(float[] arr) { List mode = new List(); @@ -995,10 +973,8 @@ WHERE session_id=:session_key AND agent_id=:agent_key AND region_id=:region_key" } return mode.ToArray()[0]; - } - public static int ArrayMode_i(int[] arr) { List mode = new List(); @@ -1052,7 +1028,6 @@ WHERE session_id=:session_key AND agent_id=:agent_key AND region_id=:region_key" } return mode.ToArray()[0]; - } #endregion @@ -1178,7 +1153,6 @@ WHERE session_id=:session_key AND agent_id=:agent_key AND region_id=:region_key" public List _sim_fps; public List _agents_in_view; } - #endregion @@ -1263,5 +1237,4 @@ WHERE session_id=:session_key AND agent_id=:agent_key AND region_id=:region_key" m_scriptLinesPerSecond = stats.StatsBlock[20].StatValue; } } - -} +} \ No newline at end of file diff --git a/OpenSim/Services/Interfaces/IUserAccountService.cs b/OpenSim/Services/Interfaces/IUserAccountService.cs index 20414f6550..cadf297cad 100644 --- a/OpenSim/Services/Interfaces/IUserAccountService.cs +++ b/OpenSim/Services/Interfaces/IUserAccountService.cs @@ -44,6 +44,17 @@ namespace OpenSim.Services.Interfaces PrincipalID = principalID; } + public UserAccount(UUID scopeID, string firstName, string lastName, string email) + { + PrincipalID = UUID.Random(); + ScopeID = scopeID; + FirstName = firstName; + LastName = lastName; + Email = email; + ServiceURLs = new Dictionary(); + Created = Util.UnixTimeSinceEpoch(); + } + public UserAccount(UUID scopeID, UUID principalID, string firstName, string lastName, string email) { PrincipalID = principalID;