From 6dd36a157585b8b818eefbdfecab9ed54b01d2ae Mon Sep 17 00:00:00 2001 From: Evil Factory <36804725+evilfactory@users.noreply.github.com> Date: Tue, 23 Dec 2025 20:47:40 -0300 Subject: [PATCH 1/7] Fix memory leak that happens when you press retry in singleplayer --- .../BarotraumaShared/SharedSource/GameSession/GameSession.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Barotrauma/BarotraumaShared/SharedSource/GameSession/GameSession.cs b/Barotrauma/BarotraumaShared/SharedSource/GameSession/GameSession.cs index ffe92f4fa..f3782f134 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/GameSession/GameSession.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/GameSession/GameSession.cs @@ -408,6 +408,7 @@ namespace Barotrauma public void LoadPreviousSave() { + GameMain.LuaCs.Hook.Call("roundEnd"); AchievementManager.OnRoundEnded(this, roundInterrupted: true); Submarine.Unload(); SaveUtil.LoadGame(DataPath); From 8f0eec7031e6a78cbbfa6247316229279f810759 Mon Sep 17 00:00:00 2001 From: NotAlwaysTrue <2136846186@qq.com> Date: Fri, 26 Dec 2025 11:07:54 +0800 Subject: [PATCH 2/7] Fixed #7 (re-applied) --- .../SharedSource/Map/Submarine.cs | 67 ++++++++++--------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Submarine.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Submarine.cs index 64f547fa3..f9e7a706d 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Submarine.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Submarine.cs @@ -2,16 +2,17 @@ using Barotrauma.IO; using Barotrauma.Items.Components; using Barotrauma.Networking; +using Barotrauma.PerkBehaviors; using FarseerPhysics; using FarseerPhysics.Dynamics; using Microsoft.Xna.Framework; using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics; using System.Linq; using System.Xml.Linq; -using Barotrauma.PerkBehaviors; using Voronoi2; namespace Barotrauma @@ -484,9 +485,9 @@ namespace Barotrauma { Rectangle dockedBorders = Borders; checkSubmarineBorders.Add(this); - var connectedSubs = DockedTo.Where(s => - !checkSubmarineBorders.Contains(s) && - !s.Info.IsOutpost && + var connectedSubs = DockedTo.Where(s => + !checkSubmarineBorders.Contains(s) && + !s.Info.IsOutpost && (allowDifferentTeam || s.TeamID == TeamID)); foreach (Submarine dockedSub in connectedSubs) { @@ -508,23 +509,16 @@ namespace Barotrauma return dockedBorders; } - private readonly HashSet connectedSubs; + private readonly ConcurrentBag connectedSubs; /// /// Returns a list of all submarines that are connected to this one via docking ports, including this sub. /// - public IEnumerable GetConnectedSubs() + public ConcurrentBag GetConnectedSubs() { return connectedSubs; } - public void RefreshConnectedSubs() - { - connectedSubs.Clear(); - connectedSubs.Add(this); - GetConnectedSubsRecursive(connectedSubs); - } - - private void GetConnectedSubsRecursive(HashSet subs) + private void GetConnectedSubsRecursive(ConcurrentBag subs) { foreach (Submarine dockedSub in DockedTo) { @@ -534,6 +528,12 @@ namespace Barotrauma } } + public void RefreshConnectedSubs() + { + connectedSubs.Clear(); + connectedSubs.Add(this); + GetConnectedSubsRecursive(connectedSubs); + } /// /// Attempt to find a spawn position close to the specified position where the sub doesn't collide with walls/ruins /// @@ -551,7 +551,7 @@ namespace Barotrauma minWidth += padding; minHeight += padding; - int iterations = 0; + int iterations = 0; const int maxIterations = 5; do { @@ -580,9 +580,9 @@ namespace Barotrauma //if the raycast hit a wall, attempt to place the spawnpos there int offsetFromWall = 10 * -verticalMoveDir; float pickedPos = ConvertUnits.ToDisplayUnits(LastPickedPosition.Y) + offsetFromWall; - closestPickedPos.Y = - verticalMoveDir > 0 ? - Math.Min(closestPickedPos.Y, pickedPos) : + closestPickedPos.Y = + verticalMoveDir > 0 ? + Math.Min(closestPickedPos.Y, pickedPos) : Math.Max(closestPickedPos.Y, pickedPos); } } @@ -597,7 +597,7 @@ namespace Barotrauma bool couldMoveInVerticalMoveDir = Math.Sign(newSpawnPos.Y - spawnPos.Y) == Math.Sign(verticalMoveDir); if (!couldMoveInVerticalMoveDir) { break; } spawnPos = ClampToHorizontalLimits(newSpawnPos, limits); - } + } iterations++; } while (iterations < maxIterations); @@ -1001,7 +1001,7 @@ namespace Barotrauma /// Should plants' branches be ignored? /// If the predicate returns false, the fixture is ignored even if it would normally block visibility. /// A physics body that was between the points (or null) - public static Body CheckVisibility(Vector2 rayStart, Vector2 rayEnd, bool ignoreLevel = false, bool ignoreSubs = false, bool ignoreSensors = true, bool ignoreDisabledWalls = true, bool ignoreBranches = true, + public static Body CheckVisibility(Vector2 rayStart, Vector2 rayEnd, bool ignoreLevel = false, bool ignoreSubs = false, bool ignoreSensors = true, bool ignoreDisabledWalls = true, bool ignoreBranches = true, Predicate blocksVisibilityPredicate = null) { Body closestBody = null; @@ -1160,10 +1160,10 @@ namespace Barotrauma { //a little hacky: undock and redock to ensure the hulls and gaps between docking ports are correct //after all the parts of the submarine have been flipped and moved to correct places. - if (dockingPort.DockingTarget is { } dockingTarget) + if (dockingPort.DockingTarget is { } dockingTarget) { - dockingPort.Undock(); - dockingPort.Dock(dockingTarget); + dockingPort.Undock(); + dockingPort.Dock(dockingTarget); } } @@ -1487,7 +1487,7 @@ namespace Barotrauma { if (ignoreOutposts && sub.Info.IsOutpost) { continue; } if (ignoreOutsideLevel && Level.Loaded != null && sub.IsAboveLevel) { continue; } - if (ignoreRespawnShuttle && sub.IsRespawnShuttle) { continue; } + if (ignoreRespawnShuttle && sub.IsRespawnShuttle) { continue; } if (teamType.HasValue && sub.TeamID != teamType) { continue; } float dist = Vector2.DistanceSquared(worldPosition, sub.WorldPosition); if (closest == null || dist < closestDist) @@ -1551,6 +1551,7 @@ namespace Barotrauma if (includingConnectedSubs) { // Performance-sensitive code -> implemented without Linq. + foreach (Submarine s in connectedSubs) { if (s == entity.Submarine && (allowDifferentTeam || entity.Submarine.TeamID == TeamID) && (allowDifferentType || entity.Submarine.Info.Type == Info.Type)) @@ -1600,7 +1601,7 @@ namespace Barotrauma Vector4 bounds = new Vector4(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue); foreach (XElement element in submarineElement.Elements()) { - if (element.Name == "Structure") + if (element.Name == "Structure") { string name = element.GetAttributeString("name", ""); Identifier identifier = element.GetAttributeIdentifier("identifier", ""); @@ -1642,7 +1643,7 @@ namespace Barotrauma { Stopwatch sw = Stopwatch.StartNew(); - connectedSubs = new HashSet(2) + connectedSubs = new ConcurrentBag { this }; @@ -1829,7 +1830,7 @@ namespace Barotrauma } } - if (Screen.Selected is { IsEditor : false }) + if (Screen.Selected is { IsEditor: false }) { foreach (Identifier layer in Info.LayersHiddenByDefault) { @@ -2011,7 +2012,7 @@ namespace Barotrauma Item itemToSwap = kvp.Key; ItemPrefab swapTo = kvp.Value; itemToSwap.PurchasedNewSwap = item.PurchasedNewSwap; - if (itemToSwap.Prefab != swapTo) { itemToSwap.PendingItemSwap = swapTo; } + if (itemToSwap.Prefab != swapTo) { itemToSwap.PendingItemSwap = swapTo; } } } @@ -2101,8 +2102,8 @@ namespace Barotrauma public static void Unload() { - if (Unloading) - { + if (Unloading) + { DebugConsole.AddWarning($"Called {nameof(Submarine.Unload)} when already unloading."); return; } @@ -2152,7 +2153,7 @@ namespace Barotrauma Ragdoll.RemoveAll(); PhysicsBody.RemoveAll(); - StatusEffect.StopAll(); + StatusEffect.StopAll(); GameMain.World = null; Powered.Grids.Clear(); @@ -2348,10 +2349,10 @@ namespace Barotrauma if (potentialContainer.Submarine == this && !isSecondary) { //valid primary container in the same sub -> perfect, let's use that one - return potentialContainer; + return potentialContainer; } selectedContainer = potentialContainer; - + } return selectedContainer; } From 51a1fb1235359fcc63d1d5f25bec1384cd6a36c3 Mon Sep 17 00:00:00 2001 From: NotAlwaysTrue <2136846186@qq.com> Date: Sat, 27 Dec 2025 02:06:04 +0800 Subject: [PATCH 3/7] Re-applied multiple fixs --- .../BarotraumaShared/SharedSource/Screens/GameScreen.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs b/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs index e29da7114..aac2baab1 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs @@ -303,10 +303,10 @@ namespace Barotrauma sw.Restart(); #endif - Parallel.ForEach(submarines, parallelOptions, sub => + foreach(Submarine sub in submarines) { sub.Update((float)deltaTime); - }); + } #if CLIENT sw.Stop(); From bd643503b3ddc8e6e5fa050195bf4b0404928b7b Mon Sep 17 00:00:00 2001 From: NotAlwaysTrue <2136846186@qq.com> Date: Sat, 27 Dec 2025 13:19:36 +0800 Subject: [PATCH 4/7] Added ClientCount for PerformenceMonitor Add a marker to help distinguish EP from other SV Executables Fixed a "Failed to copy object. Source is null." introduced by last update Uses dynamic ThreadCount instead of fixed 16 Re-Removed most PF support Re-Parallelzed Level update and Character Update(a conflict warning will be issued --- .../ServerSource/PerformenceMonitor.cs | 5 ++ .../BarotraumaServer/ServerSource/Program.cs | 2 +- .../Map/Levels/LevelObjects/LevelTrigger.cs | 2 +- .../SharedSource/Map/MapEntity.cs | 85 +++++++------------ .../SharedSource/Screens/GameScreen.cs | 32 +++---- 5 files changed, 53 insertions(+), 73 deletions(-) diff --git a/Barotrauma/BarotraumaServer/ServerSource/PerformenceMonitor.cs b/Barotrauma/BarotraumaServer/ServerSource/PerformenceMonitor.cs index d6d4c5d8d..9186bd504 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/PerformenceMonitor.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/PerformenceMonitor.cs @@ -37,6 +37,10 @@ namespace Barotrauma { get { return PhysicsBody.List.Count; } } + public int ConnectClients + { + get { return Client.ClientList.Count; } + } public double RealTickRate { @@ -160,6 +164,7 @@ namespace Barotrauma return $"Server Performence Info \n" + $"Item Count: {ItemCount}\n" + $"Character Count: {CharacterCount}\n" + + $"Clients Count {ConnectClients}\n " + $"PhysicsBody Count: {PhysicsBodyCount}\n" + $"Tick Rate: {RealTickRate}\n" + $"Min Tick Rate: {TickRateLow}\n" + diff --git a/Barotrauma/BarotraumaServer/ServerSource/Program.cs b/Barotrauma/BarotraumaServer/ServerSource/Program.cs index 35e2503ef..1f5a9727b 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/Program.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/Program.cs @@ -64,7 +64,7 @@ namespace Barotrauma GameMain.ShouldRun = false; }; #endif - Console.WriteLine("Barotrauma Dedicated Server " + GameMain.Version + + Console.WriteLine("Barotrauma Dedicated Server(EP) " + GameMain.Version + " (" + AssemblyInfo.BuildString + ", branch " + AssemblyInfo.GitBranch + ", revision " + AssemblyInfo.GitRevision + ")"); if (Console.IsOutputRedirected) { diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/LevelObjects/LevelTrigger.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/LevelObjects/LevelTrigger.cs index 21a71b22b..261a21706 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/LevelObjects/LevelTrigger.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Levels/LevelObjects/LevelTrigger.cs @@ -479,7 +479,7 @@ namespace Barotrauma { foreach (Fixture fixture in triggerBody.FarseerBody.FixtureList) { - ContactEdge contactEdge = fixture.Body.ContactList; + ContactEdge contactEdge = fixture.Body.ContactList == null ? null: fixture.Body.ContactList.CreateCopy(); while (contactEdge != null) { if (contactEdge.Contact != null && diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/MapEntity.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/MapEntity.cs index 48ea30861..2634f9560 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/MapEntity.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/MapEntity.cs @@ -642,44 +642,34 @@ namespace Barotrauma /// public static void UpdateAll(float deltaTime, Camera cam , ParallelOptions parallelOptions) { - mapEntityUpdateTick++; #if CLIENT var sw = new System.Diagnostics.Stopwatch(); sw.Start(); #endif - bool shouldUpdateMapEntities = mapEntityUpdateTick % MapEntityUpdateInterval == 0; - bool shouldUpdatePower = mapEntityUpdateTick % PoweredUpdateInterval == 0; - // Buffer lists to avoid repeated allocations - var hullList = shouldUpdateMapEntities ? Hull.HullList.ToList() : null; - var structureList = shouldUpdateMapEntities ? Structure.WallList.ToList() : null; + var hullList = Hull.HullList.ToList(); + var structureList = Structure.WallList.ToList(); var gapList = Gap.GapList.ToList(); - var itemList = shouldUpdateMapEntities ? Item.ItemList.ToList() : null; + var itemList = Item.ItemList.ToList(); // First phase: parallel updates that have no order dependencies Parallel.Invoke(parallelOptions, // Hull parallel update () => { - if (shouldUpdateMapEntities && hullList != null) + Parallel.ForEach(hullList, parallelOptions, hull => { - Parallel.ForEach(hullList, parallelOptions, hull => - { - hull.Update(deltaTime * MapEntityUpdateInterval, cam); - }); - } + hull.Update(deltaTime, cam); + }); }, // Structure parallel update () => { - if (shouldUpdateMapEntities && structureList != null) + Parallel.ForEach(structureList, parallelOptions, structure => { - Parallel.ForEach(structureList, parallelOptions, structure => - { - structure.Update(deltaTime * MapEntityUpdateInterval, cam); - }); - } + structure.Update(deltaTime, cam); + }); }, // Gap reset (must be done before update) () => @@ -692,27 +682,21 @@ namespace Barotrauma // Powered components update () => { - if (shouldUpdatePower) - { - Powered.UpdatePower(deltaTime * PoweredUpdateInterval); - } + Powered.UpdatePower(deltaTime); } ); #if CLIENT // Hull Cheats need to be executed after Hull update - if (shouldUpdateMapEntities) - { - Hull.UpdateCheats(deltaTime * MapEntityUpdateInterval, cam); - } + Hull.UpdateCheats(deltaTime, cam); #endif // Gap update (has order dependencies, keep random order but execute sequentially) var shuffledGaps = gapList.OrderBy(g => Rand.Int(int.MaxValue)).ToList(); - foreach (Gap gap in shuffledGaps) + Parallel.ForEach(gapList, parallelOptions, gap => { gap.Update(deltaTime, cam); - } + }); #if CLIENT sw.Stop(); @@ -721,33 +705,30 @@ namespace Barotrauma #endif // Item update (Item.Update() is not thread-safe and must be executed on the main thread) - if (shouldUpdateMapEntities && itemList != null) + Item.UpdatePendingConditionUpdates(deltaTime); + + float scaledDeltaTime = deltaTime * MapEntityUpdateInterval; + Item lastUpdatedItem = null; + + try { - Item.UpdatePendingConditionUpdates(deltaTime); - - float scaledDeltaTime = deltaTime * MapEntityUpdateInterval; - Item lastUpdatedItem = null; - - try + foreach (Item item in itemList) { - foreach (Item item in itemList) - { - lastUpdatedItem = item; - item.Update(scaledDeltaTime, cam); - } + lastUpdatedItem = item; + item.Update(scaledDeltaTime, cam); } - catch (InvalidOperationException e) - { - GameAnalyticsManager.AddErrorEventOnce( - "MapEntity.UpdateAll:ItemUpdateInvalidOperation", - GameAnalyticsManager.ErrorSeverity.Critical, - $"Error while updating item {lastUpdatedItem?.Name ?? "null"}: {e.Message}"); - throw new InvalidOperationException($"Error while updating item {lastUpdatedItem?.Name ?? "null"}", innerException: e); - } - - UpdateAllProjSpecific(scaledDeltaTime); - Spawner?.Update(); } + catch (InvalidOperationException e) + { + GameAnalyticsManager.AddErrorEventOnce( + "MapEntity.UpdateAll:ItemUpdateInvalidOperation", + GameAnalyticsManager.ErrorSeverity.Critical, + $"Error while updating item {lastUpdatedItem?.Name ?? "null"}: {e.Message}"); + throw new InvalidOperationException($"Error while updating item {lastUpdatedItem?.Name ?? "null"}", innerException: e); + } + + UpdateAllProjSpecific(scaledDeltaTime); + Spawner?.Update(); #if CLIENT sw.Stop(); diff --git a/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs b/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs index aac2baab1..182873fc1 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs @@ -7,6 +7,7 @@ using FarseerPhysics; using System.Threading.Tasks; using System.Linq; using System.Collections.Generic; +using System; #if DEBUG && CLIENT @@ -24,7 +25,7 @@ namespace Barotrauma private static readonly ParallelOptions parallelOptions = new ParallelOptions { - MaxDegreeOfParallelism = 16 + MaxDegreeOfParallelism = Environment.ProcessorCount * 2, }; #if CLIENT @@ -151,31 +152,23 @@ namespace Barotrauma var physicsBodies = PhysicsBody.List.ToList(); - Parallel.Invoke(parallelOptions, - () => + Parallel.ForEach(physicsBodies, parallelOptions, body => + { + if ((body.Enabled || body.UserData is Character) && + body.BodyType != BodyType.Static) { - Parallel.ForEach(physicsBodies, parallelOptions, body => - { - if ((body.Enabled || body.UserData is Character) && - body.BodyType != BodyType.Static) - { - body.Update(); - } - }); - }, - () => - { - GameMain.GameSession?.Update((float)deltaTime); + body.Update(); } - ); + }); + GameMain.GameSession?.Update((float)deltaTime); - foreach (PhysicsBody body in physicsBodies) + Parallel.ForEach(physicsBodies, parallelOptions, body => { if (body.Enabled && body.BodyType != BodyType.Static) { body.SetPrevTransform(body.SimPosition, body.Rotation); } - } + }); MapEntity.ClearHighlightedEntities(); @@ -259,6 +252,7 @@ namespace Barotrauma #endif var submarines = Submarine.Loaded.ToList(); + Parallel.ForEach(submarines, parallelOptions, sub => { sub.SetPrevTransform(sub.Position); @@ -276,8 +270,8 @@ namespace Barotrauma MapEntity.UpdateAll((float)deltaTime, cam, parallelOptions); #elif SERVER - MapEntity.UpdateAll((float)deltaTime, Camera.Instance, parallelOptions); + //StatusEffect.UpdateAll is not thread-safe and must be executed on the main thread StatusEffect.UpdateAll((float)deltaTime); From 21a2863a1ad7ceff83de45cbf761f97629258894 Mon Sep 17 00:00:00 2001 From: NotAlwaysTrue <2136846186@qq.com> Date: Sat, 27 Dec 2025 18:47:50 +0800 Subject: [PATCH 5/7] Fixed a typo using e instead of a :( --- Barotrauma/BarotraumaServer/ServerSource/DebugConsole.cs | 4 ++-- Barotrauma/BarotraumaServer/ServerSource/GameMain.cs | 4 ++-- .../BarotraumaServer/ServerSource/PerformenceMonitor.cs | 8 ++++---- .../BarotraumaShared/SharedSource/Screens/GameScreen.cs | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Barotrauma/BarotraumaServer/ServerSource/DebugConsole.cs b/Barotrauma/BarotraumaServer/ServerSource/DebugConsole.cs index 6814e1b41..063b61d08 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/DebugConsole.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/DebugConsole.cs @@ -2771,8 +2771,8 @@ namespace Barotrauma commands.Add(new Command("ShowServerPerf", "Immediately log server performance info in ServerMessage", (string[] args) => { - GameServer.Log(PerformenceMonitor.PM.ToString(), ServerLog.MessageType.ServerMessage); - NewMessage(PerformenceMonitor.PM.ToString(), Color.Green); + GameServer.Log(PerformanceMonitor.PM.ToString(), ServerLog.MessageType.ServerMessage); + NewMessage(PerformanceMonitor.PM.ToString(), Color.Green); })); #if DEBUG diff --git a/Barotrauma/BarotraumaServer/ServerSource/GameMain.cs b/Barotrauma/BarotraumaServer/ServerSource/GameMain.cs index b0c49b38a..516bbba8f 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/GameMain.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/GameMain.cs @@ -330,7 +330,7 @@ namespace Barotrauma Stopwatch performanceCounterTimer = Stopwatch.StartNew(); stopwatch = Stopwatch.StartNew(); - PerformenceMonitor PM = new PerformenceMonitor(); + PerformanceMonitor PM = new PerformanceMonitor(); long prevTicks = stopwatch.ElapsedTicks; while (ShouldRun) @@ -426,7 +426,7 @@ namespace Barotrauma } } - PerformenceMonitor.PM.Dispose(); + PerformanceMonitor.PM.Dispose(); stopwatch.Stop(); diff --git a/Barotrauma/BarotraumaServer/ServerSource/PerformenceMonitor.cs b/Barotrauma/BarotraumaServer/ServerSource/PerformenceMonitor.cs index 9186bd504..442b91315 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/PerformenceMonitor.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/PerformenceMonitor.cs @@ -11,9 +11,9 @@ using System.Threading.Tasks; namespace Barotrauma { - public class PerformenceMonitor + public class PerformanceMonitor { - static public PerformenceMonitor PM; + static public PerformanceMonitor PM; private Stopwatch PMStopwatch = new Stopwatch(); @@ -111,7 +111,7 @@ namespace Barotrauma get; set; } - public PerformenceMonitor() + public PerformanceMonitor() { PM = this; RealTickRate = 60; @@ -161,7 +161,7 @@ namespace Barotrauma } override public string ToString() { - return $"Server Performence Info \n" + + return $"Server Performance Info \n" + $"Item Count: {ItemCount}\n" + $"Character Count: {CharacterCount}\n" + $"Clients Count {ConnectClients}\n " + diff --git a/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs b/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs index 182873fc1..11b3ce9ad 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs @@ -114,7 +114,7 @@ namespace Barotrauma public override void Update(double deltaTime) { -#warning For now CL side performence counter is partly useless bucz multiple changes on such things. Need time to take care of it +#warning For now CL side performance counter is partly useless bucz multiple changes on such things. Need time to take care of it #if RUN_PHYSICS_IN_SEPARATE_THREAD physicsTime += deltaTime; From 3d96e4adb6a3f6d3f024c8bba808442e795f1b11 Mon Sep 17 00:00:00 2001 From: NotAlwaysTrue <2136846186@qq.com> Date: Sun, 28 Dec 2025 13:02:31 +0800 Subject: [PATCH 6/7] Fixed #22 --- Barotrauma/BarotraumaShared/SharedSource/Map/Gap.cs | 7 ++----- Barotrauma/BarotraumaShared/SharedSource/Map/MapEntity.cs | 6 +++--- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/Gap.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/Gap.cs index 94b8bd03e..6f7c132da 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/Gap.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/Gap.cs @@ -745,7 +745,6 @@ namespace Barotrauma waterFlowThisFrame = 0.0f; } - private static readonly HashSet checkedHulls = new HashSet(); /// /// Simulates water flow from the source to all the hulls it's connected to across the sub, as if the water was coming directly from outside. @@ -753,7 +752,7 @@ namespace Barotrauma /// void SimulateWaterFlowFromOutsideToConnectedHulls(Hull hull, float maxFlow, float deltaTime) { - checkedHulls.Clear(); + List checkedHulls = new List(); checkedHulls.Add(hull); foreach (var connectedGap in hull.ConnectedGaps) { @@ -764,7 +763,7 @@ namespace Barotrauma } } - static void SimulateWaterFlowFromOutsideToConnectedHullsRecursive(Hull targetHull, Gap gap, HashSet checkedHulls, Hull originHull, float maxFlow, float deltaTime) + static void SimulateWaterFlowFromOutsideToConnectedHullsRecursive(Hull targetHull, Gap gap, List checkedHulls, Hull originHull, float maxFlow, float deltaTime) { const float decay = 0.95f; @@ -995,8 +994,6 @@ namespace Barotrauma base.Remove(); GapList.Remove(this); - checkedHulls.Clear(); - foreach (Hull hull in Hull.HullList) { hull.ConnectedGaps.Remove(this); diff --git a/Barotrauma/BarotraumaShared/SharedSource/Map/MapEntity.cs b/Barotrauma/BarotraumaShared/SharedSource/Map/MapEntity.cs index 2634f9560..7ef1b529e 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Map/MapEntity.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Map/MapEntity.cs @@ -655,13 +655,13 @@ namespace Barotrauma // First phase: parallel updates that have no order dependencies Parallel.Invoke(parallelOptions, - // Hull parallel update () => { - Parallel.ForEach(hullList, parallelOptions, hull => + // basically nothing here is thread-safe so + foreach(var hull in hullList) { hull.Update(deltaTime, cam); - }); + } }, // Structure parallel update () => From aaf0763e09a377d0a2feb1c6afce90e45fe0bfc9 Mon Sep 17 00:00:00 2001 From: NotAlwaysTrue <2136846186@qq.com> Date: Sun, 28 Dec 2025 13:54:29 +0800 Subject: [PATCH 7/7] Removed a potential issue --- .../BarotraumaShared/SharedSource/Screens/GameScreen.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs b/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs index 11b3ce9ad..66dac49bb 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/Screens/GameScreen.cs @@ -162,13 +162,13 @@ namespace Barotrauma }); GameMain.GameSession?.Update((float)deltaTime); - Parallel.ForEach(physicsBodies, parallelOptions, body => + foreach (PhysicsBody body in physicsBodies) { if (body.Enabled && body.BodyType != BodyType.Static) { body.SetPrevTransform(body.SimPosition, body.Rotation); } - }); + } MapEntity.ClearHighlightedEntities();