From 2e80d972febf6facf3e7c36a8d2a8c50a859282f Mon Sep 17 00:00:00 2001 From: Max Weber Date: Sat, 3 Mar 2018 19:57:09 -0700 Subject: [PATCH] inline RSHashTableMixin.getNodes into RSWidgetMixin.getParentId to reduce allocations --- .../net/runelite/mixins/RSHashTableMixin.java | 1 + .../net/runelite/mixins/RSWidgetMixin.java | 22 ++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSHashTableMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSHashTableMixin.java index 25426d526f..ae82420438 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSHashTableMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSHashTableMixin.java @@ -40,6 +40,7 @@ public abstract class RSHashTableMixin implements RSHashTable @Override public Collection getNodes() { + // Copied in RSWidgetMixin.getParentId to reduce allocations List nodes = new ArrayList(); RSNode[] buckets = getBuckets(); diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java index 6de2421011..07954d9f16 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSWidgetMixin.java @@ -43,6 +43,7 @@ import net.runelite.api.widgets.WidgetItem; import static net.runelite.client.callback.Hooks.eventBus; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSHashTable; +import net.runelite.rs.api.RSNode; import net.runelite.rs.api.RSWidget; @Mixin(RSWidget.class) @@ -76,18 +77,27 @@ public abstract class RSWidgetMixin implements RSWidget return parentId; } - int i = TO_GROUP(getId()); + int groupId = TO_GROUP(getId()); RSHashTable componentTable = client.getComponentTable(); - for (Node node : componentTable.getNodes()) + RSNode[] buckets = componentTable.getBuckets(); + for (int i = 0; i < buckets.length; ++i) { - WidgetNode wn = (WidgetNode) node; + Node node = buckets[i]; - if (i == wn.getId()) + // It looks like the first node in the bucket is always + // a sentinel + Node cur = node.getNext(); + while (cur != node) { - return (int) wn.getHash(); + WidgetNode wn = (WidgetNode) cur; + + if (groupId == wn.getId()) + { + return (int) wn.getHash(); + } + cur = cur.getNext(); } } - return -1; }