From f4bdfeec13c2d24f917c41feb12dbe990c762232 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 24 Feb 2018 15:54:03 -0500 Subject: [PATCH] Garbage collect world map once closed --- .../net/runelite/api/widgets/WidgetID.java | 1 + .../net/runelite/client/callback/Hooks.java | 51 ++++++++++++++++--- 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java index 9e0135f1e2..749ef0b761 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java @@ -67,6 +67,7 @@ public class WidgetID public static final int PUZZLE_BOX_GROUP_ID = 306; public static final int NIGHTMARE_ZONE_GROUP_ID = 202; public static final int BLAST_FURNACE_GROUP_ID = 474; + public static final int WORLD_MAP = 595; static class WorldMap { diff --git a/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java b/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java index 1432168d05..171f1fcf20 100644 --- a/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java +++ b/runelite-client/src/main/java/net/runelite/client/callback/Hooks.java @@ -24,13 +24,6 @@ */ package net.runelite.client.callback; -import net.runelite.api.TextureProvider; -import net.runelite.api.events.GameTick; -import net.runelite.api.events.ProjectileMoved; -import net.runelite.api.events.MenuEntryAdded; -import net.runelite.api.events.ChatMessage; -import net.runelite.api.events.MenuOptionClicked; -import net.runelite.api.events.SetMessage; import com.google.common.eventbus.EventBus; import com.google.inject.Injector; import java.awt.Graphics; @@ -45,6 +38,17 @@ import net.runelite.api.PacketBuffer; import net.runelite.api.Point; import net.runelite.api.Projectile; import net.runelite.api.Region; +import net.runelite.api.RenderOverview; +import net.runelite.api.TextureProvider; +import net.runelite.api.WorldMapManager; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameTick; +import net.runelite.api.events.MenuEntryAdded; +import net.runelite.api.events.MenuOptionClicked; +import net.runelite.api.events.ProjectileMoved; +import net.runelite.api.events.SetMessage; +import net.runelite.api.widgets.Widget; +import static net.runelite.api.widgets.WidgetID.WORLD_MAP; import net.runelite.client.RuneLite; import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.game.DeathChecker; @@ -96,6 +100,8 @@ public class Hooks infoBoxManager.cull(); chatMessageManager.process(); + + checkWorldMap(); } catch (Exception ex) { @@ -103,6 +109,37 @@ public class Hooks } } + /** + * When the world map opens it loads about ~100mb of data into memory, which + * represents about half of the total memory allocated by the client. + * This gets cached and never released, which causes GC pressure which can affect + * performance. This method reinitailzies the world map cache, which allows the + * data to be garbage collecged, and causes the map data from disk each time + * is it opened. + */ + private static void checkWorldMap() + { + Widget widget = client.getWidget(WORLD_MAP, 0); + if (widget != null) + { + return; + } + + RenderOverview renderOverview = client.getRenderOverview(); + if (renderOverview == null) + { + return; + } + + WorldMapManager manager = renderOverview.getWorldMapManager(); + + if (manager != null && manager.isLoaded()) + { + log.debug("World map was closed, reinitializing"); + renderOverview.initializeWorldMap(renderOverview.getWorldMapData()); + } + } + public static void draw(MainBufferProvider mainBufferProvider, Graphics graphics, int x, int y) { final BufferedImage image = (BufferedImage) mainBufferProvider.getImage();