From f0efc2089c11fa68fb1b9162cbe5e43e57c7b29c Mon Sep 17 00:00:00 2001 From: tehdiplomat Date: Tue, 26 Feb 2019 14:42:58 -0500 Subject: [PATCH] Ad LRU to ImageCache to get a handle on memory bloat --- .../src/main/java/forge/ImageCache.java | 45 ++++++++++--------- .../forge/properties/ForgePreferences.java | 3 +- .../forge/properties/PreferencesStore.java | 10 +++-- 3 files changed, 32 insertions(+), 26 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/ImageCache.java b/forge-gui-desktop/src/main/java/forge/ImageCache.java index b45c73c2d02..7cc24a3df86 100644 --- a/forge-gui-desktop/src/main/java/forge/ImageCache.java +++ b/forge-gui-desktop/src/main/java/forge/ImageCache.java @@ -17,6 +17,24 @@ */ package forge; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader.InvalidCacheLoadException; +import com.google.common.cache.LoadingCache; +import com.mortennobel.imagescaling.ResampleOp; +import forge.assets.FSkinProp; +import forge.game.card.CardView; +import forge.game.player.PlayerView; +import forge.item.InventoryItem; +import forge.model.FModel; +import forge.properties.ForgeConstants; +import forge.properties.ForgePreferences; +import forge.properties.ForgePreferences.FPref; +import forge.toolbox.FSkin; +import forge.toolbox.FSkin.SkinIcon; +import forge.util.ImageUtil; +import org.apache.commons.lang3.StringUtils; + +import javax.imageio.ImageIO; import java.awt.*; import java.awt.geom.RoundRectangle2D; import java.awt.image.BufferedImage; @@ -24,27 +42,7 @@ import java.io.File; import java.util.HashSet; import java.util.Set; import java.util.concurrent.ExecutionException; - -import javax.imageio.ImageIO; - -import forge.properties.ForgePreferences; -import org.apache.commons.lang3.StringUtils; - -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader.InvalidCacheLoadException; -import com.google.common.cache.LoadingCache; -import com.mortennobel.imagescaling.ResampleOp; - -import forge.assets.FSkinProp; -import forge.game.card.CardView; -import forge.game.player.PlayerView; -import forge.item.InventoryItem; -import forge.model.FModel; -import forge.properties.ForgeConstants; -import forge.properties.ForgePreferences.FPref; -import forge.toolbox.FSkin; -import forge.toolbox.FSkin.SkinIcon; -import forge.util.ImageUtil; +import java.util.concurrent.TimeUnit; /** * This class stores ALL card images in a cache with soft values. this means @@ -64,7 +62,10 @@ public class ImageCache { // short prefixes to save memory private static final Set _missingIconKeys = new HashSet(); - private static final LoadingCache _CACHE = CacheBuilder.newBuilder().softValues().build(new ImageLoader()); + private static final LoadingCache _CACHE = CacheBuilder.newBuilder() + .maximumSize(FModel.getPreferences().getPrefInt((FPref.UI_IMAGE_CACHE_MAXIMUM))) + .expireAfterAccess(15, TimeUnit.MINUTES) + .build(new ImageLoader()); private static final BufferedImage _defaultImage; static { BufferedImage defImage = null; diff --git a/forge-gui/src/main/java/forge/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/properties/ForgePreferences.java index 6059254787d..8caea6fe279 100644 --- a/forge-gui/src/main/java/forge/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/properties/ForgePreferences.java @@ -70,6 +70,7 @@ public class ForgePreferences extends PreferencesStore { UI_OVERLAY_CARD_MANA_COST ("true"), UI_OVERLAY_CARD_ID ("true"), UI_ENABLE_ONLINE_IMAGE_FETCHER ("false"), + UI_IMAGE_CACHE_MAXIMUM("400"), UI_OVERLAY_FOIL_EFFECT ("true"), UI_HIDE_REMINDER_TEXT ("false"), UI_OPEN_PACKS_INDIV ("false"), @@ -125,7 +126,7 @@ public class ForgePreferences extends PreferencesStore { UI_DISABLE_IMAGES_EFFECT_CARDS("false"), UI_ALLOW_ORDER_GRAVEYARD_WHEN_NEEDED ("Never"), UI_DEFAULT_FONT_SIZE("12"), - UI_SELECT_FROM_CARD_DISPLAYS("true"), + UI_SELECT_FROM_CARD_DISPLAYS("true"), UI_FOR_TOUCHSCREN("false"), UI_VIBRATE_ON_LIFE_LOSS("true"), diff --git a/forge-gui/src/main/java/forge/properties/PreferencesStore.java b/forge-gui/src/main/java/forge/properties/PreferencesStore.java index c18cb3a97d5..9fd0a15d116 100644 --- a/forge-gui/src/main/java/forge/properties/PreferencesStore.java +++ b/forge-gui/src/main/java/forge/properties/PreferencesStore.java @@ -17,6 +17,8 @@ */ package forge.properties; +import forge.util.FileUtil; + import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; @@ -24,8 +26,6 @@ import java.util.EnumMap; import java.util.List; import java.util.Map; -import forge.util.FileUtil; - /** * Holds default preference values in an enum. * Loads preferred values when instantiated. @@ -109,7 +109,11 @@ public abstract class PreferencesStore> { } public final int getPrefInt(final T fp0) { - return Integer.parseInt(getPref(fp0)); + try{ + return Integer.parseInt(getPref(fp0)); + } catch(NumberFormatException e) { + return Integer.parseInt(getPrefDefault(fp0)); + } } public final boolean getPrefBoolean(final T fp0) {