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/impl/DisplayHelperImpl.java | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) (limited to 'src/main/java/me/shedaniel/rei/impl/DisplayHelperImpl.java') 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