From c8b392508505f49aee01fecd1648774b7131a268 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 7 Jun 2017 18:04:02 +0100 Subject: [PATCH 1/4] remove nonsense SendPeriodicAppearanceUpdates. if we need such a thing, then a lot is broken. Remove duplicated CleanTempObjects() call, rename BackupWaitCallback thread as BackupWorker ( still didn't found cause for mantis 8783) --- OpenSim/Region/Framework/Scenes/Scene.cs | 34 +++---------------- .../SceneCommands/SceneCommandsModule.cs | 12 ------- 2 files changed, 5 insertions(+), 41 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 826cda103d..bc2630f0f8 100755 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -257,11 +257,6 @@ namespace OpenSim.Region.Framework.Scenes public bool m_useFlySlow; public bool m_useTrashOnDelete = true; - /// - /// Temporarily setting to trigger appearance resends at 60 second intervals. - /// - public bool SendPeriodicAppearanceUpdates { get; set; } - /// /// How much a root agent has to change position before updates are sent to viewers. /// @@ -1147,17 +1142,6 @@ namespace OpenSim.Region.Framework.Scenes } - - // FIXME: Ultimately this should be in a module. - SendPeriodicAppearanceUpdates = false; - - IConfig appearanceConfig = m_config.Configs["Appearance"]; - if (appearanceConfig != null) - { - SendPeriodicAppearanceUpdates - = appearanceConfig.GetBoolean("ResendAppearanceUpdates", SendPeriodicAppearanceUpdates); - } - #endregion Region Config IConfig entityTransferConfig = m_config.Configs["EntityTransfer"]; @@ -1715,16 +1699,7 @@ namespace OpenSim.Region.Framework.Scenes }); } - if (SendPeriodicAppearanceUpdates && MaintenanceRun % 60 == 0) - { - // m_log.DebugFormat("[SCENE]: Sending periodic appearance updates"); - - if (AvatarFactory != null) - { - ForEachRootScenePresence(sp => AvatarFactory.SendAppearance(sp.UUID)); - } - } - +/* this is done on heartbeat // Delete temp-on-rez stuff if (MaintenanceRun % m_update_temp_cleaning == 0 && !m_cleaningTemps) { @@ -1739,7 +1714,7 @@ namespace OpenSim.Region.Framework.Scenes tempOnRezMS = Util.EnvironmentTickCountSubtract(tmpMS); } - +*/ Watchdog.UpdateThread(); previousMaintenanceTick = m_lastMaintenanceTick; @@ -1864,7 +1839,8 @@ namespace OpenSim.Region.Framework.Scenes if (Frame % m_update_temp_cleaning == 0 && !m_cleaningTemps) { m_cleaningTemps = true; - Util.FireAndForget(delegate { CleanTempObjects(); m_cleaningTemps = false; }); + WorkManager.RunInThread( + delegate { CleanTempObjects(); m_cleaningTemps = false; }, null, string.Format("CleanTempObjects ({0})", Name)); tmpMS2 = Util.GetTimeStampMS(); tempOnRezMS = (float)(tmpMS2 - tmpMS); // bad.. counts the FireAndForget, not CleanTempObjects tmpMS = tmpMS2; @@ -2091,7 +2067,7 @@ namespace OpenSim.Region.Framework.Scenes if (!m_backingup) { m_backingup = true; - WorkManager.RunInThread(o => Backup(false), null, string.Format("BackupWaitCallback ({0})", Name)); + WorkManager.RunInThread(o => Backup(false), null, string.Format("BackupWorker ({0})", Name)); } } diff --git a/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs b/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs index d0d726c96b..45edbda446 100644 --- a/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs +++ b/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs @@ -96,7 +96,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments "List current scene options.", "active - if false then main scene update and maintenance loops are suspended.\n" + "animations - if true then extra animations debug information is logged.\n" - + "appear-refresh - if true then appearance is resent to other avatars every 60 seconds.\n" + "client-pos-upd - the tolerance before clients are updated with new rotation information for an avatar.\n" + "client-rot-upd - the tolerance before clients are updated with new rotation information for an avatar.\n" + "client-vel-upd - the tolerance before clients are updated with new velocity information for an avatar.\n" @@ -117,7 +116,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments "Turn on scene debugging options.", "active - if false then main scene update and maintenance loops are suspended.\n" + "animations - if true then extra animations debug information is logged.\n" - + "appear-refresh - if true then appearance is resent to other avatars every 60 seconds.\n" + "client-pos-upd - the tolerance before clients are updated with new rotation information for an avatar.\n" + "client-rot-upd - the tolerance before clients are updated with new rotation information for an avatar.\n" + "client-vel-upd - the tolerance before clients are updated with new velocity information for an avatar.\n" @@ -153,7 +151,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments ConsoleDisplayList cdl = new ConsoleDisplayList(); cdl.AddRow("active", m_scene.Active); cdl.AddRow("animations", m_scene.DebugAnimations); - cdl.AddRow("appear-refresh", m_scene.SendPeriodicAppearanceUpdates); cdl.AddRow("client-pos-upd", m_scene.RootPositionUpdateTolerance); cdl.AddRow("client-rot-upd", m_scene.RootRotationUpdateTolerance); cdl.AddRow("client-vel-upd", m_scene.RootVelocityUpdateTolerance); @@ -207,15 +204,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments m_scene.DebugAnimations = active; } - if (options.ContainsKey("appear-refresh")) - { - bool newValue; - - // FIXME: This can only come from the console at the moment but might not always be true. - if (ConsoleUtil.TryParseConsoleBool(MainConsole.Instance, options["appear-refresh"], out newValue)) - m_scene.SendPeriodicAppearanceUpdates = newValue; - } - if (options.ContainsKey("client-pos-upd")) { float newValue; From eca89c6e61126da9bf526e97cf06ee738f0460be Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 7 Jun 2017 18:15:15 +0100 Subject: [PATCH 2/4] remove some more dead scene options --- OpenSim/Region/Framework/Scenes/Scene.cs | 40 +--------- .../SceneCommands/SceneCommandsModule.cs | 78 ------------------- 2 files changed, 1 insertion(+), 117 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index bc2630f0f8..b78ee6e2a1 100755 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -257,32 +257,7 @@ namespace OpenSim.Region.Framework.Scenes public bool m_useFlySlow; public bool m_useTrashOnDelete = true; - /// - /// How much a root agent has to change position before updates are sent to viewers. - /// - public float RootPositionUpdateTolerance { get; set; } - - /// - /// How much a root agent has to rotate before updates are sent to viewers. - /// - public float RootRotationUpdateTolerance { get; set; } - - /// - /// How much a root agent has to change velocity before updates are sent to viewers. - /// - public float RootVelocityUpdateTolerance { get; set; } - - /// - /// If greater than 1, we only send terse updates to other root agents on every n updates. - /// - public int RootTerseUpdatePeriod { get; set; } - - /// - /// If greater than 1, we only send terse updates to child agents on every n updates. - /// - public int ChildTerseUpdatePeriod { get; set; } - - protected float m_defaultDrawDistance = 255f; + protected float m_defaultDrawDistance = 255f; protected float m_defaultCullingDrawDistance = 16f; public float DefaultDrawDistance { @@ -1181,16 +1156,6 @@ namespace OpenSim.Region.Framework.Scenes ObjectsCullingByDistance = interestConfig.GetBoolean("ObjectsCullingByDistance", ObjectsCullingByDistance); - - RootTerseUpdatePeriod = interestConfig.GetInt("RootTerseUpdatePeriod", RootTerseUpdatePeriod); - ChildTerseUpdatePeriod = interestConfig.GetInt("ChildTerseUpdatePeriod", ChildTerseUpdatePeriod); - - RootPositionUpdateTolerance - = interestConfig.GetFloat("RootPositionUpdateTolerance", RootPositionUpdateTolerance); - RootRotationUpdateTolerance - = interestConfig.GetFloat("RootRotationUpdateTolerance", RootRotationUpdateTolerance); - RootVelocityUpdateTolerance - = interestConfig.GetFloat("RootVelocityUpdateTolerance", RootVelocityUpdateTolerance); } m_log.DebugFormat("[SCENE]: Using the {0} prioritization scheme", UpdatePrioritizationScheme); @@ -1259,9 +1224,6 @@ namespace OpenSim.Region.Framework.Scenes UpdatePrioritizationScheme = UpdatePrioritizationSchemes.Time; ReprioritizationInterval = 5000; - RootRotationUpdateTolerance = 0.1f; - RootVelocityUpdateTolerance = 0.001f; - RootPositionUpdateTolerance = 0.05f; ReprioritizationDistance = m_minReprioritizationDistance; m_eventManager = new EventManager(); diff --git a/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs b/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs index 45edbda446..7e3bd7f235 100644 --- a/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs +++ b/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs @@ -96,17 +96,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments "List current scene options.", "active - if false then main scene update and maintenance loops are suspended.\n" + "animations - if true then extra animations debug information is logged.\n" - + "client-pos-upd - the tolerance before clients are updated with new rotation information for an avatar.\n" - + "client-rot-upd - the tolerance before clients are updated with new rotation information for an avatar.\n" - + "client-vel-upd - the tolerance before clients are updated with new velocity information for an avatar.\n" - + "root-upd-per - if greater than 1, terse updates are only sent to root agents other than the originator on every n updates.\n" - + "child-upd-per - if greater than 1, terse updates are only sent to child agents on every n updates.\n" + "collisions - if false then collisions with other objects are turned off.\n" + "pbackup - if false then periodic scene backup is turned off.\n" + "physics - if false then all physics objects are non-physical.\n" + "scripting - if false then no scripting operations happen.\n" + "teleport - if true then some extra teleport debug information is logged.\n" - + "update-on-timer - If true then the scene is updated via a timer. If false then a thread with sleep is used.\n" + "updates - if true then any frame which exceeds double the maximum desired frame time is logged.", HandleDebugSceneGetCommand); @@ -116,17 +110,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments "Turn on scene debugging options.", "active - if false then main scene update and maintenance loops are suspended.\n" + "animations - if true then extra animations debug information is logged.\n" - + "client-pos-upd - the tolerance before clients are updated with new rotation information for an avatar.\n" - + "client-rot-upd - the tolerance before clients are updated with new rotation information for an avatar.\n" - + "client-vel-upd - the tolerance before clients are updated with new velocity information for an avatar.\n" - + "root-upd-per - if greater than 1, terse updates are only sent to root agents other than the originator on every n updates.\n" - + "child-upd-per - if greater than 1, terse updates are only sent to child agents on every n updates.\n" + "collisions - if false then collisions with other objects are turned off.\n" + "pbackup - if false then periodic scene backup is turned off.\n" + "physics - if false then all physics objects are non-physical.\n" + "scripting - if false then no scripting operations happen.\n" + "teleport - if true then some extra teleport debug information is logged.\n" - + "update-on-timer - If true then the scene is updated via a timer. If false then a thread with sleep is used.\n" + "updates - if true then any frame which exceeds double the maximum desired frame time is logged.", HandleDebugSceneSetCommand); } @@ -151,16 +139,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments ConsoleDisplayList cdl = new ConsoleDisplayList(); cdl.AddRow("active", m_scene.Active); cdl.AddRow("animations", m_scene.DebugAnimations); - cdl.AddRow("client-pos-upd", m_scene.RootPositionUpdateTolerance); - cdl.AddRow("client-rot-upd", m_scene.RootRotationUpdateTolerance); - cdl.AddRow("client-vel-upd", m_scene.RootVelocityUpdateTolerance); - cdl.AddRow("root-upd-per", m_scene.RootTerseUpdatePeriod); - cdl.AddRow("child-upd-per", m_scene.ChildTerseUpdatePeriod); cdl.AddRow("pbackup", m_scene.PeriodicBackup); cdl.AddRow("physics", m_scene.PhysicsEnabled); cdl.AddRow("scripting", m_scene.ScriptsEnabled); cdl.AddRow("teleport", m_scene.DebugTeleporting); -// cdl.AddRow("update-on-timer", m_scene.UpdateOnTimer); cdl.AddRow("updates", m_scene.DebugUpdates); MainConsole.Instance.OutputFormat("Scene {0} options:", m_scene.Name); @@ -204,51 +186,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments m_scene.DebugAnimations = active; } - if (options.ContainsKey("client-pos-upd")) - { - float newValue; - - // FIXME: This can only come from the console at the moment but might not always be true. - if (ConsoleUtil.TryParseConsoleFloat(MainConsole.Instance, options["client-pos-upd"], out newValue)) - m_scene.RootPositionUpdateTolerance = newValue; - } - - if (options.ContainsKey("client-rot-upd")) - { - float newValue; - - // FIXME: This can only come from the console at the moment but might not always be true. - if (ConsoleUtil.TryParseConsoleFloat(MainConsole.Instance, options["client-rot-upd"], out newValue)) - m_scene.RootRotationUpdateTolerance = newValue; - } - - if (options.ContainsKey("client-vel-upd")) - { - float newValue; - - // FIXME: This can only come from the console at the moment but might not always be true. - if (ConsoleUtil.TryParseConsoleFloat(MainConsole.Instance, options["client-vel-upd"], out newValue)) - m_scene.RootVelocityUpdateTolerance = newValue; - } - - if (options.ContainsKey("root-upd-per")) - { - int newValue; - - // FIXME: This can only come from the console at the moment but might not always be true. - if (ConsoleUtil.TryParseConsoleNaturalInt(MainConsole.Instance, options["root-upd-per"], out newValue)) - m_scene.RootTerseUpdatePeriod = newValue; - } - - if (options.ContainsKey("child-upd-per")) - { - int newValue; - - // FIXME: This can only come from the console at the moment but might not always be true. - if (ConsoleUtil.TryParseConsoleNaturalInt(MainConsole.Instance, options["child-upd-per"], out newValue)) - m_scene.ChildTerseUpdatePeriod = newValue; - } - if (options.ContainsKey("pbackup")) { bool active; @@ -284,21 +221,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments m_scene.DebugTeleporting = enableTeleportDebugging; } - if (options.ContainsKey("update-on-timer")) - { - bool enableUpdateOnTimer; - if (bool.TryParse(options["update-on-timer"], out enableUpdateOnTimer)) - { -// m_scene.UpdateOnTimer = enableUpdateOnTimer; - m_scene.Active = false; - - while (m_scene.IsRunning) - Thread.Sleep(20); - - m_scene.Active = true; - } - } - if (options.ContainsKey("updates")) { bool enableUpdateDebugging; From 2d93008bd99f657aa8a79ed2ecef1a0df3c483c0 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 7 Jun 2017 18:52:56 +0100 Subject: [PATCH 3/4] course locations is a also heartbeat job (for now sync) --- OpenSim/Region/Framework/Scenes/Scene.cs | 43 +++++++----------------- 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index b78ee6e2a1..0905a56a9f 100755 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -379,7 +379,7 @@ namespace OpenSim.Region.Framework.Scenes private int m_update_terrain = 1000; private int m_update_land = 10; - private int m_update_coarse_locations = 50; + private int m_update_coarse_locations = 5; private int m_update_temp_cleaning = 180; private float agentMS; @@ -1640,8 +1640,6 @@ namespace OpenSim.Region.Framework.Scenes if (runs >= 0) endRun = MaintenanceRun + runs; - List coarseLocations; - List avatarUUIDs; while (!m_shuttingDown && ((endRun == null && Active) || MaintenanceRun < endRun)) { @@ -1650,33 +1648,6 @@ namespace OpenSim.Region.Framework.Scenes // m_log.DebugFormat("[SCENE]: Maintenance run {0} in {1}", MaintenanceRun, Name); - // Coarse locations relate to positions of green dots on the mini-map (on a SecondLife client) - if (MaintenanceRun % (m_update_coarse_locations / 10) == 0) - { - SceneGraph.GetCoarseLocations(out coarseLocations, out avatarUUIDs, 60); - // Send coarse locations to clients - ForEachScenePresence(delegate(ScenePresence presence) - { - presence.SendCoarseLocations(coarseLocations, avatarUUIDs); - }); - } - -/* this is done on heartbeat - // Delete temp-on-rez stuff - if (MaintenanceRun % m_update_temp_cleaning == 0 && !m_cleaningTemps) - { - // m_log.DebugFormat("[SCENE]: Running temp-on-rez cleaning in {0}", Name); - tmpMS = Util.EnvironmentTickCount(); - m_cleaningTemps = true; - - WorkManager.RunInThread( - delegate { CleanTempObjects(); m_cleaningTemps = false; }, - null, - string.Format("CleanTempObjects ({0})", Name)); - - tempOnRezMS = Util.EnvironmentTickCountSubtract(tmpMS); - } -*/ Watchdog.UpdateThread(); previousMaintenanceTick = m_lastMaintenanceTick; @@ -1759,6 +1730,18 @@ namespace OpenSim.Region.Framework.Scenes if (Frame % m_update_entitymovement == 0) m_sceneGraph.UpdateScenePresenceMovement(); + if (Frame % (m_update_coarse_locations) == 0) + { + List coarseLocations; + List avatarUUIDs; + + SceneGraph.GetCoarseLocations(out coarseLocations, out avatarUUIDs, 60); + // Send coarse locations to clients + ForEachScenePresence(delegate(ScenePresence presence) + { + presence.SendCoarseLocations(coarseLocations, avatarUUIDs); + }); + } // Get the simulation frame time that the avatar force input // took tmpMS2 = Util.GetTimeStampMS(); From 02b51b84f487fcf25c043a9aaf92591de02332d0 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 7 Jun 2017 19:08:37 +0100 Subject: [PATCH 4/4] so no real need for Maintenance thread.. so removed --- OpenSim/Region/Framework/Scenes/Scene.cs | 78 +----------------------- 1 file changed, 1 insertion(+), 77 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 0905a56a9f..e1e06d044d 100755 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -345,11 +345,6 @@ namespace OpenSim.Region.Framework.Scenes protected set; } - /// - /// Current maintenance run number - /// - public uint MaintenanceRun { get; private set; } - /// /// Frame time /// @@ -361,14 +356,6 @@ namespace OpenSim.Region.Framework.Scenes // see SimStatsReporter.cs public bool Normalized55FPS { get; private set; } - /// - /// The minimum length of time in seconds that will be taken for a scene frame. - /// - /// - /// Always derived from MinFrameTicks. - /// - public float MinMaintenanceTime { get; private set; } - private int m_update_physics = 1; private int m_update_entitymovement = 1; private int m_update_objects = 1; @@ -377,7 +364,6 @@ namespace OpenSim.Region.Framework.Scenes private int m_update_backup = 200; private int m_update_terrain = 1000; - private int m_update_land = 10; private int m_update_coarse_locations = 5; private int m_update_temp_cleaning = 180; @@ -398,11 +384,6 @@ namespace OpenSim.Region.Framework.Scenes /// private int m_lastFrameTick; - /// - /// Tick at which the last maintenance run occurred. - /// - private int m_lastMaintenanceTick; - /// /// Total script execution time (in Stopwatch Ticks) since the last frame /// @@ -419,11 +400,6 @@ namespace OpenSim.Region.Framework.Scenes /// private ManualResetEvent m_updateWaitEvent = new ManualResetEvent(false); - /// - /// Used to control maintenance thread runs. - /// - private ManualResetEvent m_maintenanceWaitEvent = new ManualResetEvent(false); - // TODO: Possibly stop other classes being able to manipulate this directly. private SceneGraph m_sceneGraph; private readonly Timer m_restartTimer = new Timer(15000); // Wait before firing @@ -467,7 +443,7 @@ namespace OpenSim.Region.Framework.Scenes /// Is the scene active? /// /// - /// If false, maintenance and update loops are not being run, though after setting to false update may still + /// If false, update loop is not being run, though after setting to false update may still /// be active for a period (and IsRunning will still be true). Updates can still be triggered manually if /// the scene is not active. /// @@ -497,7 +473,6 @@ namespace OpenSim.Region.Framework.Scenes public bool IsRunning { get { return m_isRunning; } } private volatile bool m_isRunning; -// private int m_lastUpdate; private bool m_firstHeartbeat = true; // private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time; @@ -853,7 +828,6 @@ namespace OpenSim.Region.Framework.Scenes FrameTimeWarnPercent = 60; FrameTimeCritPercent = 40; Normalized55FPS = true; - MinMaintenanceTime = 1; SeeIntoRegion = true; Random random = new Random(); @@ -1614,62 +1588,12 @@ namespace OpenSim.Region.Framework.Scenes // alarms for scenes with many objects. Update(1); - WorkManager.StartThread( - Maintenance, string.Format("Maintenance ({0})", RegionInfo.RegionName), ThreadPriority.Normal, false, true); - Watchdog.GetCurrentThreadInfo().AlarmIfTimeout = true; m_lastFrameTick = Util.EnvironmentTickCount(); Update(-1); - Watchdog.RemoveThread(); } - private void Maintenance() - { - DoMaintenance(-1); - - Watchdog.RemoveThread(); - } - - public void DoMaintenance(int runs) - { - long? endRun = null; - int runtc, tmpMS; - int previousMaintenanceTick; - - if (runs >= 0) - endRun = MaintenanceRun + runs; - - - while (!m_shuttingDown && ((endRun == null && Active) || MaintenanceRun < endRun)) - { - runtc = Util.EnvironmentTickCount(); - ++MaintenanceRun; - - // m_log.DebugFormat("[SCENE]: Maintenance run {0} in {1}", MaintenanceRun, Name); - - Watchdog.UpdateThread(); - - previousMaintenanceTick = m_lastMaintenanceTick; - m_lastMaintenanceTick = Util.EnvironmentTickCount(); - runtc = Util.EnvironmentTickCountSubtract(m_lastMaintenanceTick, runtc); - runtc = (int)(MinMaintenanceTime * 1000) - runtc; - - if (runtc > 0) - m_maintenanceWaitEvent.WaitOne(runtc); - - // Optionally warn if a frame takes double the amount of time that it should. - if (DebugUpdates - && Util.EnvironmentTickCountSubtract( - m_lastMaintenanceTick, previousMaintenanceTick) > (int)(MinMaintenanceTime * 1000 * 2)) - m_log.WarnFormat( - "[SCENE]: Maintenance took {0} ms (desired max {1} ms) in {2}", - Util.EnvironmentTickCountSubtract(m_lastMaintenanceTick, previousMaintenanceTick), - MinMaintenanceTime * 1000, - RegionInfo.RegionName); - } - } - public override void Update(int frames) { long? endFrame = null;