OBT/1.0.14

Fixed parallelism count issue
Added SingleThreadWorker to handle single-thread related works
Fixed incorrect order when updating gaps
Potentially Fixed #39
This commit is contained in:
NotAlwaysTrue
2026-01-08 12:40:30 +08:00
committed by GitHub
parent f3c22315a1
commit 8bfe8a2c37
5 changed files with 53 additions and 19 deletions

View File

@@ -812,7 +812,11 @@ namespace Barotrauma
if (outsideCollisionBlocker == null) { return false; }
if (IsRoomToRoom || Submarine == null || open <= 0.0f || linkedTo.Count == 0 || linkedTo[0] is not Hull)
{
outsideCollisionBlocker.AddToDisableQueue();
SingleThreadWorker.GlobalWorker.AddAction(() =>
{
outsideCollisionBlocker.Enabled = false;
});
return false;
}

View File

@@ -681,12 +681,12 @@ namespace Barotrauma
{
// if crashed, go ask the god damn physics engine :(
var shuffledGaps = gapList.OrderBy(g => Rand.Int(int.MaxValue)).ToList();
Parallel.ForEach(gapList, parallelOptions, gap =>
Parallel.ForEach(shuffledGaps, parallelOptions, gap =>
{
gap.ResetWaterFlowThisFrame();
gap.Update(deltaTime, cam);
});
FarseerPhysics.Dynamics.Body.QueueDisable();
SingleThreadWorker.GlobalWorker.RunActions();
},
// Powered components update
() =>

View File

@@ -25,7 +25,7 @@ namespace Barotrauma
private static readonly ParallelOptions parallelOptions = new ParallelOptions
{
MaxDegreeOfParallelism = Environment.ProcessorCount > 0 ? Environment.ProcessorCount * 2 : 16,
MaxDegreeOfParallelism = Math.Max(4, Environment.ProcessorCount - 1)
};
#if CLIENT
@@ -287,6 +287,7 @@ namespace Barotrauma
Ragdoll.UpdateAll((float)deltaTime, cam);
#elif SERVER
Ragdoll.UpdateAll((float)deltaTime, Camera.Instance);
SingleThreadWorker.GlobalWorker.RunActions();
#endif
#if CLIENT
@@ -295,7 +296,7 @@ namespace Barotrauma
sw.Restart();
#endif
foreach(Submarine sub in submarines)
foreach (Submarine sub in submarines)
{
sub.Update((float)deltaTime);
}

View File

@@ -0,0 +1,43 @@
using System;
using System.Collections.Concurrent;
namespace Barotrauma
{
public class SingleThreadWorker
{
private ConcurrentQueue<Action> ActionQueue;
public static SingleThreadWorker GlobalWorker = new SingleThreadWorker();
public SingleThreadWorker()
{
ActionQueue = new ConcurrentQueue<Action>();
}
public void AddAction(Action action)
{
ActionQueue.Enqueue(action);
}
[STAThread]
public void RunActions()
{
while (ActionQueue.TryDequeue(out Action action))
{
try
{
action();
}
catch (Exception e)
{
// Just try-catch and do nothing but print errorlogs. We cannot afford crashing the game.
ConsoleColor originalForeground = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"WARNING: Error occurred when running Single Thread Actions \n{e}");
Console.ForegroundColor = Console.ForegroundColor;
}
}
}
}
}

View File

@@ -350,20 +350,6 @@ namespace FarseerPhysics.Dynamics
}
}
private static ConcurrentQueue<Body> DisableQueue = new ConcurrentQueue<Body>();
public static void QueueDisable()
{
while (DisableQueue.TryDequeue(out var pendingbody))
{
pendingbody.Enabled = false;
}
}
public void AddToDisableQueue()
{
DisableQueue.Enqueue(this);
}
/// <summary>
/// Create all proxies.