Reduce node resolves (#6435)

This commit is contained in:
Leon Friedrich
2022-02-07 01:10:33 +13:00
committed by GitHub
parent b82926e324
commit 1e10314900
12 changed files with 195 additions and 147 deletions

View File

@@ -12,6 +12,7 @@ using Robust.Shared.Enums;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Log;
using Robust.Shared.Map;
using Robust.Shared.Maths;
using Robust.Shared.Utility;
@@ -28,6 +29,7 @@ namespace Content.Server.NodeContainer.EntitySystems
[Dependency] private readonly IAdminManager _adminManager = default!;
[Dependency] private readonly INodeGroupFactory _nodeGroupFactory = default!;
[Dependency] private readonly ILogManager _logManager = default!;
[Dependency] private readonly IMapManager _mapManager = default!;
private readonly List<int> _visDeletes = new();
private readonly List<BaseNodeGroup> _visSends = new();
@@ -141,6 +143,9 @@ namespace Content.Server.NodeContainer.EntitySystems
var sw = Stopwatch.StartNew();
var xformQuery = EntityManager.GetEntityQuery<TransformComponent>();
var nodeQuery = EntityManager.GetEntityQuery<NodeContainerComponent>();
foreach (var toRemove in _toRemove)
{
if (toRemove.NodeGroup == null)
@@ -182,7 +187,11 @@ namespace Content.Server.NodeContainer.EntitySystems
QueueRemakeGroup((BaseNodeGroup) node.NodeGroup);
}
foreach (var compatible in GetCompatibleNodes(node))
// GetCompatibleNodes will involve getting the transform & grid as most connection requirements are
// based on position & anchored neighbours However, here more than one node could be attached to the
// same parent. So there is probably a better way of doing this.
foreach (var compatible in GetCompatibleNodes(node, xformQuery, nodeQuery))
{
ClearReachableIfNecessary(compatible);
@@ -303,14 +312,23 @@ namespace Content.Server.NodeContainer.EntitySystems
return allNodes;
}
private static IEnumerable<Node> GetCompatibleNodes(Node node)
private IEnumerable<Node> GetCompatibleNodes(Node node, EntityQuery<TransformComponent> xformQuery, EntityQuery<NodeContainerComponent> nodeQuery)
{
foreach (var reachable in node.GetReachableNodes())
var xform = xformQuery.GetComponent(node.Owner);
_mapManager.TryGetGrid(xform.GridID, out var grid);
if (!node.Connectable(EntityManager, xform))
yield break;
foreach (var reachable in node.GetReachableNodes(xform, nodeQuery, xformQuery, grid, EntityManager))
{
DebugTools.Assert(reachable != node, "GetReachableNodes() should not include self.");
if (reachable.Connectable && reachable.NodeGroupID == node.NodeGroupID)
if (reachable.NodeGroupID == node.NodeGroupID
&& reachable.Connectable(EntityManager, xformQuery.GetComponent(reachable.Owner)))
{
yield return reachable;
}
}
}