Revert "Multi-threaded mob movement" (#12809)
This commit is contained in:
@@ -1,28 +1,20 @@
|
||||
using System.Buffers;
|
||||
using System.Threading.Tasks;
|
||||
using Content.Server.Cargo.Components;
|
||||
using Content.Server.Shuttles.Components;
|
||||
using Content.Server.Shuttles.Systems;
|
||||
using Content.Shared.Inventory;
|
||||
using Content.Shared.Movement.Components;
|
||||
using Content.Shared.Movement.Systems;
|
||||
using Content.Shared.Shuttles.Components;
|
||||
using Content.Shared.Shuttles.Systems;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Containers;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Physics.Components;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Threading;
|
||||
using Robust.Shared.Utility;
|
||||
|
||||
namespace Content.Server.Physics.Controllers
|
||||
{
|
||||
public sealed class MoverController : SharedMoverController
|
||||
{
|
||||
[Dependency] private readonly IMapManager _mapManager = default!;
|
||||
[Dependency] private readonly IParallelManager _parallel = default!;
|
||||
[Dependency] private readonly ThrusterSystem _thruster = default!;
|
||||
|
||||
private Dictionary<ShuttleComponent, List<(PilotComponent, InputMoverComponent, TransformComponent)>> _shuttlePilots = new();
|
||||
@@ -72,12 +64,7 @@ namespace Content.Server.Physics.Controllers
|
||||
var xformQuery = GetEntityQuery<TransformComponent>();
|
||||
var moverQuery = GetEntityQuery<InputMoverComponent>();
|
||||
|
||||
var movers = AllEntityQuery<InputMoverComponent>();
|
||||
var totalCount = EntityManager.Count<InputMoverComponent>();
|
||||
var moveInput = ArrayPool<(InputMoverComponent Mover, TransformComponent Transform, PhysicsComponent Physics)>.Shared.Rent(totalCount);
|
||||
var count = 0;
|
||||
|
||||
while (movers.MoveNext(out var mover))
|
||||
foreach (var mover in EntityQuery<InputMoverComponent>(true))
|
||||
{
|
||||
if (relayQuery.TryGetComponent(mover.Owner, out var relayed) && relayed.RelayEntity != null)
|
||||
{
|
||||
@@ -96,11 +83,13 @@ namespace Content.Server.Physics.Controllers
|
||||
continue;
|
||||
}
|
||||
|
||||
PhysicsComponent? body;
|
||||
PhysicsComponent? body = null;
|
||||
TransformComponent? xformMover = xform;
|
||||
|
||||
if (mover.ToParent && relayQuery.HasComponent(xform.ParentUid))
|
||||
{
|
||||
if (!bodyQuery.TryGetComponent(xform.ParentUid, out body) ||
|
||||
!xformQuery.HasComponent(xform.ParentUid))
|
||||
!TryComp(xform.ParentUid, out xformMover))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@@ -110,64 +99,9 @@ namespace Content.Server.Physics.Controllers
|
||||
continue;
|
||||
}
|
||||
|
||||
DebugTools.Assert(!UsedMobMovement.ContainsKey(mover.Owner));
|
||||
|
||||
// To avoid threading issues on adding dictionary entries later.
|
||||
UsedMobMovement[mover.Owner] = false;
|
||||
moveInput[count++] = (mover, xform, body);
|
||||
HandleMobMovement(mover, body, xformMover, frameTime, xformQuery);
|
||||
}
|
||||
|
||||
var moveResults = ArrayPool<(bool DirtyMover, Vector2? LinearVelocity, SoundSpecifier? sound, AudioParams audio)>.Shared.Rent(count);
|
||||
var mobQuery = GetEntityQuery<MobMoverComponent>();
|
||||
var inventoryQuery = GetEntityQuery<InventoryComponent>();
|
||||
var containerQuery = GetEntityQuery<ContainerManagerComponent>();
|
||||
var footQuery = GetEntityQuery<FootstepModifierComponent>();
|
||||
|
||||
var options = new ParallelOptions()
|
||||
{
|
||||
MaxDegreeOfParallelism = _parallel.ParallelProcessCount,
|
||||
};
|
||||
|
||||
Parallel.For(0, count, options, i =>
|
||||
{
|
||||
var (mover, xform, body) = moveInput[i];
|
||||
HandleMobMovement(mover, body, xform, frameTime, xformQuery, mobQuery, inventoryQuery, containerQuery, footQuery, out var dirtyMover, out var linearVelocity, out var sound, out var audio);
|
||||
moveResults[i] = (dirtyMover, linearVelocity, sound, audio);
|
||||
});
|
||||
|
||||
var metaQuery = GetEntityQuery<MetaDataComponent>();
|
||||
|
||||
for (var i = 0; i < count; i++)
|
||||
{
|
||||
var results = moveResults[i];
|
||||
var input = moveInput[i];
|
||||
MetaDataComponent? metadata = null;
|
||||
|
||||
// Calling dirty isn't thread-safe sadly.
|
||||
if (results.DirtyMover)
|
||||
{
|
||||
metadata ??= metaQuery.GetComponent(input.Mover.Owner);
|
||||
Dirty(input.Mover, metadata);
|
||||
}
|
||||
|
||||
if (results.LinearVelocity != null)
|
||||
{
|
||||
metadata ??= metaQuery.GetComponent(input.Physics.Owner);
|
||||
PhysicsSystem.SetLinearVelocity(input.Physics, results.LinearVelocity.Value, false);
|
||||
PhysicsSystem.SetAngularVelocity(input.Physics, 0f, false);
|
||||
Dirty(input.Physics, metadata);
|
||||
}
|
||||
|
||||
if (results.sound != null)
|
||||
{
|
||||
Audio.PlayPredicted(results.sound, input.Mover.Owner, input.Mover.Owner, results.audio);
|
||||
}
|
||||
|
||||
moveInput[i] = default;
|
||||
}
|
||||
|
||||
ArrayPool<(bool DirtyMover, Vector2? LinearVelocity, SoundSpecifier? Sound, AudioParams Audio)>.Shared.Return(moveResults);
|
||||
ArrayPool<(InputMoverComponent, TransformComponent, PhysicsComponent)>.Shared.Return(moveInput);
|
||||
HandleShuttleMovement(frameTime);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user