From d1108cd4617cc454481bcde2086b9b05cbd3541c Mon Sep 17 00:00:00 2001 From: Unknown Date: Wed, 14 Aug 2019 11:08:27 +0800 Subject: Cache handlers so it won't leak ram --- .../me/shedaniel/rei/api/BaseBoundsHandler.java | 6 +++++- .../shedaniel/rei/impl/BaseBoundsHandlerImpl.java | 21 ++++++++++++--------- .../me/shedaniel/rei/impl/DisplayHelperImpl.java | 22 ++++++++++++++++------ 3 files changed, 33 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/main/java/me/shedaniel/rei/api/BaseBoundsHandler.java b/src/main/java/me/shedaniel/rei/api/BaseBoundsHandler.java index cfdb29282..3f2a3cd51 100644 --- a/src/main/java/me/shedaniel/rei/api/BaseBoundsHandler.java +++ b/src/main/java/me/shedaniel/rei/api/BaseBoundsHandler.java @@ -19,7 +19,11 @@ public interface BaseBoundsHandler extends DisplayHelper.DisplayBoundsHandler getCurrentExclusionZones(Class currentScreenClass, boolean isOnRightSide); + default List getCurrentExclusionZones(Class currentScreenClass, boolean isOnRightSide) { + return getCurrentExclusionZones(currentScreenClass, isOnRightSide, false); + } + + List getCurrentExclusionZones(Class currentScreenClass, boolean isOnRightSide, boolean sort); /** * Register an exclusion zone diff --git a/src/main/java/me/shedaniel/rei/impl/BaseBoundsHandlerImpl.java b/src/main/java/me/shedaniel/rei/impl/BaseBoundsHandlerImpl.java index 7ac55b5f9..0376de6f4 100644 --- a/src/main/java/me/shedaniel/rei/impl/BaseBoundsHandlerImpl.java +++ b/src/main/java/me/shedaniel/rei/impl/BaseBoundsHandlerImpl.java @@ -18,12 +18,12 @@ import java.awt.*; import java.util.Comparator; import java.util.List; import java.util.function.Function; -import java.util.stream.Collectors; public class BaseBoundsHandlerImpl implements BaseBoundsHandler { private static final Function RECTANGLE_LONG_FUNCTION = r -> r.x + 1000l * r.y + 1000000l * r.width + 1000000000l * r.height; private static final Comparator, Float>, Function>>> LIST_PAIR_COMPARATOR; + private static final Comparator RECTANGLE_COMPARER = Comparator.comparingLong(RECTANGLE_LONG_FUNCTION::apply); static { Comparator, Float>, Function>>> comparator = Comparator.comparingDouble(value -> value.getLeft().getRight()); @@ -55,7 +55,7 @@ public class BaseBoundsHandlerImpl implements BaseBoundsHandler { @Override public ActionResult isInZone(boolean isOnRightSide, double mouseX, double mouseY) { - for (Rectangle zone : getCurrentExclusionZones(MinecraftClient.getInstance().currentScreen.getClass(), isOnRightSide)) + for (Rectangle zone : getCurrentExclusionZones(MinecraftClient.getInstance().currentScreen.getClass(), isOnRightSide, false)) if (zone.contains(mouseX, mouseY)) return ActionResult.FAIL; return ActionResult.PASS; @@ -75,23 +75,26 @@ public class BaseBoundsHandlerImpl implements BaseBoundsHandler { } private long getStringFromCurrent(boolean isOnRightSide) { - return getLongFromAreas(isOnRightSide ? getHandler().getRightBounds(MinecraftClient.getInstance().currentScreen) : getHandler().getLeftBounds(MinecraftClient.getInstance().currentScreen), getCurrentExclusionZones(MinecraftClient.getInstance().currentScreen.getClass(), isOnRightSide)); + return getLongFromAreas(isOnRightSide ? getHandler().getRightBounds(MinecraftClient.getInstance().currentScreen) : getHandler().getLeftBounds(MinecraftClient.getInstance().currentScreen), getCurrentExclusionZones(MinecraftClient.getInstance().currentScreen.getClass(), isOnRightSide, false)); } @Override public ActionResult canItemSlotWidgetFit(boolean isOnRightSide, int left, int top, Screen screen, Rectangle fullBounds) { - List currentExclusionZones = getCurrentExclusionZones(MinecraftClient.getInstance().currentScreen.getClass(), isOnRightSide); - for (Rectangle currentExclusionZone : currentExclusionZones) + for (Rectangle currentExclusionZone : getCurrentExclusionZones(MinecraftClient.getInstance().currentScreen.getClass(), isOnRightSide, false)) if (left + 18 >= currentExclusionZone.x && top + 18 >= currentExclusionZone.y && left <= currentExclusionZone.x + currentExclusionZone.width && top <= currentExclusionZone.y + currentExclusionZone.height) return ActionResult.FAIL; return ActionResult.PASS; } - public List getCurrentExclusionZones(Class currentScreenClass, boolean isOnRightSide) { - List, Float>, Function>>> only = list.stream().filter(pair -> pair.getLeft().getLeft().isAssignableFrom(currentScreenClass)).collect(Collectors.toList()); - only.sort(LIST_PAIR_COMPARATOR); + @Override + public List getCurrentExclusionZones(Class currentScreenClass, boolean isOnRightSide, boolean sort) { List rectangles = Lists.newArrayList(); - only.forEach(pair -> rectangles.addAll(pair.getRight().apply(isOnRightSide))); + for (Pair, Float>, Function>> pair : list) { + if (pair.getLeft().getLeft().isAssignableFrom(currentScreenClass)) + rectangles.addAll(pair.getRight().apply(isOnRightSide)); + } + if (sort) + rectangles.sort(RECTANGLE_COMPARER); return rectangles; } diff --git a/src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java b/src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java index 470d5a2c1..57305de0c 100644 --- a/src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java +++ b/src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java @@ -14,7 +14,6 @@ import java.awt.*; import java.util.Comparator; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.stream.Collectors; public class DisplayHelperImpl implements DisplayHelper { @@ -49,11 +48,17 @@ public class DisplayHelperImpl implements DisplayHelper { private List> screenDisplayBoundsHandlers = Lists.newArrayList(); private Map, DisplayBoundsHandler> handlerCache = Maps.newHashMap(); + private Map>> handlerSortedCache = Maps.newHashMap(); private BaseBoundsHandler baseBoundsHandler; + private Class tempScreen; @Override public List> getSortedBoundsHandlers(Class screenClass) { - return screenDisplayBoundsHandlers.stream().filter(handler -> handler.getBaseSupportedClass().isAssignableFrom(screenClass)).sorted(BOUNDS_HANDLER_COMPARATOR).collect(Collectors.toList()); + if (handlerSortedCache.containsKey(screenClass)) + return handlerSortedCache.get(screenClass); + tempScreen = screenClass; + handlerSortedCache.put(screenClass, screenDisplayBoundsHandlers.stream().filter(this::filterResponsible).sorted(BOUNDS_HANDLER_COMPARATOR).collect(Collectors.toList())); + return handlerSortedCache.get(screenClass); } @Override @@ -63,13 +68,17 @@ public class DisplayHelperImpl implements DisplayHelper { @Override public DisplayBoundsHandler getResponsibleBoundsHandler(Class screenClass) { - Optional> any = handlerCache.entrySet().stream().filter(entry -> entry.getKey().equals(screenClass)).map(Map.Entry::getValue).findAny(); - if (any.isPresent()) - return any.get(); - handlerCache.put(screenClass, screenDisplayBoundsHandlers.stream().filter(handler -> handler.getBaseSupportedClass().isAssignableFrom(screenClass)).sorted(BOUNDS_HANDLER_COMPARATOR).findAny().orElse(EMPTY)); + if (handlerCache.containsKey(screenClass)) + return handlerCache.get(screenClass); + tempScreen = screenClass; + handlerCache.put(screenClass, screenDisplayBoundsHandlers.stream().filter(this::filterResponsible).sorted(BOUNDS_HANDLER_COMPARATOR).findAny().orElse(EMPTY)); return handlerCache.get(screenClass); } + public boolean filterResponsible(DisplayBoundsHandler handler) { + return handler.getBaseSupportedClass().isAssignableFrom(tempScreen); + } + @Override public void registerBoundsHandler(DisplayBoundsHandler handler) { screenDisplayBoundsHandlers.add(handler); @@ -86,6 +95,7 @@ public class DisplayHelperImpl implements DisplayHelper { public void resetCache() { handlerCache.clear(); + handlerSortedCache.clear(); } } -- cgit