Fixed #12
This commit is contained in:
NotAlwaysTrue
2025-12-26 01:16:05 +08:00
parent 81f44969ee
commit e715fdc835
4 changed files with 56 additions and 75 deletions

View File

@@ -479,7 +479,7 @@ namespace Barotrauma
{
foreach (Fixture fixture in triggerBody.FarseerBody.FixtureList)
{
ContactEdge contactEdge = fixture.Body.ContactList;
ContactEdge contactEdge = fixture.Body.ContactList.CreateCopy();
while (contactEdge != null)
{
if (contactEdge.Contact != null &&

View File

@@ -652,34 +652,28 @@ namespace Barotrauma
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 gapList = Gap.GapList.ToList();
var itemList = shouldUpdateMapEntities ? Item.ItemList.ToList() : null;
List<Hull> hullList = new List<Hull>(Hull.HullList);
List<Structure> structureList = new List<Structure>(Structure.WallList);
List<Gap> gapList = new List<Gap>(Gap.GapList);
List<Item> itemList = new List<Item>(Item.ItemList);
// First phase: parallel updates that have no order dependencies
Parallel.Invoke(parallelOptions,
// Hull parallel update
() =>
{
if (shouldUpdateMapEntities && hullList != null)
{
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 =>
{
structure.Update(deltaTime * MapEntityUpdateInterval, cam);
structure.Update(deltaTime, cam);
});
}
},
// Gap reset (must be done before update)
() =>
@@ -694,7 +688,7 @@ namespace Barotrauma
{
if (shouldUpdatePower)
{
Powered.UpdatePower(deltaTime * PoweredUpdateInterval);
Powered.UpdatePower(deltaTime);
}
}
);
@@ -721,11 +715,9 @@ 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;
float scaledDeltaTime = deltaTime;
Item lastUpdatedItem = null;
try
@@ -747,7 +739,6 @@ namespace Barotrauma
UpdateAllProjSpecific(scaledDeltaTime);
Spawner?.Update();
}
#if CLIENT
sw.Stop();

View File

@@ -151,9 +151,6 @@ namespace Barotrauma
var physicsBodies = PhysicsBody.List.ToList();
Parallel.Invoke(parallelOptions,
() =>
{
Parallel.ForEach(physicsBodies, parallelOptions, body =>
{
if ((body.Enabled || body.UserData is Character) &&
@@ -162,12 +159,8 @@ namespace Barotrauma
body.Update();
}
});
},
() =>
{
GameMain.GameSession?.Update((float)deltaTime);
}
);
foreach (PhysicsBody body in physicsBodies)
{
@@ -183,10 +176,8 @@ namespace Barotrauma
var sw = new System.Diagnostics.Stopwatch();
sw.Start();
Parallel.Invoke(parallelOptions,
() => GameMain.ParticleManager.Update((float)deltaTime),
() => { if (Level.Loaded != null) Level.Loaded.Update((float)deltaTime, cam); }
);
GameMain.ParticleManager.Update((float)deltaTime);
if (Level.Loaded != null) Level.Loaded.Update((float)deltaTime, cam);
sw.Stop();
GameMain.PerformanceCounter.AddElapsedTicks("Update:Particles+Level", sw.ElapsedTicks);
@@ -252,25 +243,25 @@ namespace Barotrauma
Character.Controlled?.UpdateLocalCursor(cam);
#elif SERVER
Parallel.Invoke(parallelOptions,
() => { if (Level.Loaded != null) Level.Loaded.Update((float)deltaTime, Camera.Instance); },
() => Character.UpdateAll((float)deltaTime, Camera.Instance)
);
if (Level.Loaded != null) Level.Loaded.Update((float)deltaTime, Camera.Instance);
Character.UpdateAll((float)deltaTime, Camera.Instance);
#endif
var submarines = Submarine.Loaded.ToList();
Parallel.ForEach(submarines, parallelOptions, sub =>
foreach(Submarine sub in submarines)
{
sub.SetPrevTransform(sub.Position);
});
}
Parallel.ForEach(physicsBodies, parallelOptions, body =>
//
foreach (PhysicsBody body in physicsBodies)
{
if (body.Enabled && body.BodyType != FarseerPhysics.BodyType.Static)
{
body.SetPrevTransform(body.SimPosition, body.Rotation);
}
});
}
#if CLIENT
MapEntity.UpdateAll((float)deltaTime, cam, parallelOptions);
@@ -302,11 +293,10 @@ namespace Barotrauma
GameMain.PerformanceCounter.AddElapsedTicks("Update:Ragdolls", sw.ElapsedTicks);
sw.Restart();
#endif
Parallel.ForEach(submarines, parallelOptions, sub =>
foreach (var sub in submarines)
{
sub.Update((float)deltaTime);
});
}
#if CLIENT
sw.Stop();