Remove IoCManager.InitThread calls from parallel code. (#13070)
This commit is contained in:
committed by
GitHub
parent
cd803a82bd
commit
4fa2920472
@@ -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")]
|
||||||
|
|||||||
@@ -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];
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user