Revert "Multi-threaded mob movement" (#12809)

This commit is contained in:
metalgearsloth
2022-11-30 12:39:02 +11:00
committed by GitHub
parent c86170303d
commit 4f6ead57bf
5 changed files with 105 additions and 242 deletions

View File

@@ -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);
}