From c8aeef5cac0466b37b7f78edea721e6870060a09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 9 Jan 2021 07:17:01 +0100 Subject: [PATCH] Use weak hash map for connector references in cable renderer. --- .../client/renderer/NetworkCableRenderer.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/main/java/li/cil/oc2/client/renderer/NetworkCableRenderer.java b/src/main/java/li/cil/oc2/client/renderer/NetworkCableRenderer.java index 85e6236b..1044a9b5 100644 --- a/src/main/java/li/cil/oc2/client/renderer/NetworkCableRenderer.java +++ b/src/main/java/li/cil/oc2/client/renderer/NetworkCableRenderer.java @@ -22,9 +22,7 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.SubscribeEvent; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Objects; +import java.util.*; public final class NetworkCableRenderer { private static final int MAX_RENDER_DISTANCE = 100; @@ -38,10 +36,12 @@ public final class NetworkCableRenderer { private static final float CABLE_MAX_LENGTH = 8f; private static final Vector3f CABLE_COLOR = new Vector3f(0.0f, 0.33f, 0.4f); - private static final ArrayList connectors = new ArrayList<>(); - private static final ArrayList connections = new ArrayList<>(); + private static final Set connectors = Collections.newSetFromMap(new WeakHashMap<>()); + private static int lastKnownConnectorCount; private static boolean isDirty; + private static final ArrayList connections = new ArrayList<>(); + /////////////////////////////////////////////////////////////////// public static void initialize() { @@ -183,13 +183,20 @@ public final class NetworkCableRenderer { } private static void validateConnectors() { - for (int i = connectors.size() - 1; i >= 0; i--) { - final NetworkConnectorTileEntity connector = connectors.get(i); + final ArrayList list = new ArrayList<>(connectors); + for (final NetworkConnectorTileEntity connector : list) { if (connector.isRemoved()) { - connectors.remove(i); + connectors.remove(connector); invalidateConnections(); } } + + // We track the size because the WeakHasMap may expunge dead entries without + // us knowing otherwise. + if (list.size() != lastKnownConnectorCount) { + invalidateConnections(); + } + lastKnownConnectorCount = list.size(); } private static void validatePairs() {