Remove IoCManager.InitThread calls from parallel code. (#13070)

This commit is contained in:
Pieter-Jan Briers
2022-12-20 12:52:39 +01:00
committed by GitHub
parent cd803a82bd
commit 4fa2920472
3 changed files with 24 additions and 33 deletions

View File

@@ -19,7 +19,6 @@ namespace Content.Benchmarks;
public class DeviceNetworkingBenchmark public class DeviceNetworkingBenchmark
{ {
private PairTracker _pair = default!; private PairTracker _pair = default!;
private IEntityManager _entityManager = default!;
private DeviceNetworkTestSystem _deviceNetTestSystem = default!; private DeviceNetworkTestSystem _deviceNetTestSystem = default!;
private DeviceNetworkSystem _deviceNetworkSystem = default!; private DeviceNetworkSystem _deviceNetworkSystem = default!;
private EntityUid _sourceEntity; private EntityUid _sourceEntity;
@@ -56,34 +55,35 @@ public class DeviceNetworkingBenchmark
public int EntityCount = 500; public int EntityCount = 500;
[GlobalSetup] [GlobalSetup]
public void Setup() public async Task SetupAsync()
{ {
ProgramShared.PathOffset = "../../../../"; ProgramShared.PathOffset = "../../../../";
_pair = PoolManager.GetServerClient(new PoolSettings{NoClient = true, ExtraPrototypes = Prototypes}).GetAwaiter().GetResult(); _pair = await PoolManager.GetServerClient(new PoolSettings{NoClient = true, ExtraPrototypes = Prototypes});
var server = _pair.Pair.Server; var server = _pair.Pair.Server;
_entityManager = server.ResolveDependency<IEntityManager>(); await server.WaitPost(() =>
_deviceNetworkSystem = _entityManager.EntitySysManager.GetEntitySystem<DeviceNetworkSystem>();
_deviceNetTestSystem = _entityManager.EntitySysManager.GetEntitySystem<DeviceNetworkTestSystem>();
IoCManager.InitThread(_pair.Pair.Server.InstanceDependencyCollection);
var testValue = "test";
_payload = new NetworkPayload
{ {
["Test"] = testValue, var entityManager = server.InstanceDependencyCollection.Resolve<IEntityManager>();
["testnumber"] = 1, _deviceNetworkSystem = entityManager.EntitySysManager.GetEntitySystem<DeviceNetworkSystem>();
["testbool"] = true _deviceNetTestSystem = entityManager.EntitySysManager.GetEntitySystem<DeviceNetworkTestSystem>();
};
_sourceEntity = _entityManager.SpawnEntity("DummyNetworkDevice", MapCoordinates.Nullspace); var testValue = "test";
_sourceWirelessEntity = _entityManager.SpawnEntity("DummyWirelessNetworkDevice", MapCoordinates.Nullspace); _payload = new NetworkPayload
{
["Test"] = testValue,
["testnumber"] = 1,
["testbool"] = true
};
for (var i = 0; i < EntityCount; i++) _sourceEntity = entityManager.SpawnEntity("DummyNetworkDevice", MapCoordinates.Nullspace);
{ _sourceWirelessEntity = entityManager.SpawnEntity("DummyWirelessNetworkDevice", MapCoordinates.Nullspace);
_targetEntities.Add(_entityManager.SpawnEntity("DummyNetworkDevice", MapCoordinates.Nullspace));
_targetWirelessEntities.Add(_entityManager.SpawnEntity("DummyWirelessNetworkDevice", MapCoordinates.Nullspace)); for (var i = 0; i < EntityCount; i++)
} {
_targetEntities.Add(entityManager.SpawnEntity("DummyNetworkDevice", MapCoordinates.Nullspace));
_targetWirelessEntities.Add(entityManager.SpawnEntity("DummyWirelessNetworkDevice", MapCoordinates.Nullspace));
}
});
} }
[Benchmark(Baseline = true, Description = "Entity Events")] [Benchmark(Baseline = true, Description = "Entity Events")]

View File

@@ -1,6 +1,5 @@
using System.Linq; using System.Linq;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Content.Server.Atmos.Components; using Content.Server.Atmos.Components;
using Content.Shared.Atmos; using Content.Shared.Atmos;
@@ -255,17 +254,11 @@ namespace Content.Server.Atmos.EntitySystems
// Afterwards we reset all the chunk data for the next time we tick. // Afterwards we reset all the chunk data for the next time we tick.
var players = _playerManager.ServerSessions.Where(x => x.Status == SessionStatus.InGame).ToArray(); var players = _playerManager.ServerSessions.Where(x => x.Status == SessionStatus.InGame).ToArray();
var opts = new ParallelOptions { MaxDegreeOfParallelism = _parMan.ParallelProcessCount }; var opts = new ParallelOptions { MaxDegreeOfParallelism = _parMan.ParallelProcessCount };
var mainThread = Thread.CurrentThread; Parallel.ForEach(players, opts, p => UpdatePlayer(p, curTick));
var parentDeps = IoCManager.Instance!;
Parallel.ForEach(players, opts, p => UpdatePlayer(p, curTick, mainThread, parentDeps));
} }
private void UpdatePlayer(IPlayerSession playerSession, GameTick curTick, Thread mainThread, IDependencyCollection parentDeps) private void UpdatePlayer(IPlayerSession playerSession, GameTick curTick)
{ {
// Thjs exists JUST to be able to resolve IRobustStringSerializer for networked message sending.
if (mainThread != Thread.CurrentThread)
IoCManager.InitThread(parentDeps.FromParent(parentDeps), true);
var xformQuery = GetEntityQuery<TransformComponent>(); var xformQuery = GetEntityQuery<TransformComponent>();
var chunksInRange = _chunkingSys.GetChunksForSession(playerSession, ChunkSize, xformQuery, _chunkIndexPool, _chunkViewerPool); var chunksInRange = _chunkingSys.GetChunksForSession(playerSession, ChunkSize, xformQuery, _chunkIndexPool, _chunkViewerPool);
var previouslySent = _lastSentChunks[playerSession]; var previouslySent = _lastSentChunks[playerSession];

View File

@@ -482,8 +482,6 @@ namespace Content.Server.Decals
public void UpdatePlayer(IPlayerSession player) public void UpdatePlayer(IPlayerSession player)
{ {
IoCManager.InitThread(_dependencies, replaceExisting: true);
var xformQuery = GetEntityQuery<TransformComponent>(); var xformQuery = GetEntityQuery<TransformComponent>();
var chunksInRange = _chunking.GetChunksForSession(player, ChunkSize, xformQuery, _chunkIndexPool, _chunkViewerPool); var chunksInRange = _chunking.GetChunksForSession(player, ChunkSize, xformQuery, _chunkIndexPool, _chunkViewerPool);
var staleChunks = _chunkViewerPool.Get(); var staleChunks = _chunkViewerPool.Get();