Ad LRU to ImageCache to get a handle on memory bloat

This commit is contained in:
tehdiplomat
2019-02-26 14:42:58 -05:00
parent 3095c25f6d
commit f0efc2089c
3 changed files with 32 additions and 26 deletions

View File

@@ -17,6 +17,24 @@
*/ */
package forge; 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.*;
import java.awt.geom.RoundRectangle2D; import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
@@ -24,27 +42,7 @@ import java.io.File;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
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;
/** /**
* This class stores ALL card images in a cache with soft values. this means * 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 // short prefixes to save memory
private static final Set<String> _missingIconKeys = new HashSet<String>(); private static final Set<String> _missingIconKeys = new HashSet<String>();
private static final LoadingCache<String, BufferedImage> _CACHE = CacheBuilder.newBuilder().softValues().build(new ImageLoader()); private static final LoadingCache<String, BufferedImage> _CACHE = CacheBuilder.newBuilder()
.maximumSize(FModel.getPreferences().getPrefInt((FPref.UI_IMAGE_CACHE_MAXIMUM)))
.expireAfterAccess(15, TimeUnit.MINUTES)
.build(new ImageLoader());
private static final BufferedImage _defaultImage; private static final BufferedImage _defaultImage;
static { static {
BufferedImage defImage = null; BufferedImage defImage = null;

View File

@@ -70,6 +70,7 @@ public class ForgePreferences extends PreferencesStore<ForgePreferences.FPref> {
UI_OVERLAY_CARD_MANA_COST ("true"), UI_OVERLAY_CARD_MANA_COST ("true"),
UI_OVERLAY_CARD_ID ("true"), UI_OVERLAY_CARD_ID ("true"),
UI_ENABLE_ONLINE_IMAGE_FETCHER ("false"), UI_ENABLE_ONLINE_IMAGE_FETCHER ("false"),
UI_IMAGE_CACHE_MAXIMUM("400"),
UI_OVERLAY_FOIL_EFFECT ("true"), UI_OVERLAY_FOIL_EFFECT ("true"),
UI_HIDE_REMINDER_TEXT ("false"), UI_HIDE_REMINDER_TEXT ("false"),
UI_OPEN_PACKS_INDIV ("false"), UI_OPEN_PACKS_INDIV ("false"),

View File

@@ -17,6 +17,8 @@
*/ */
package forge.properties; package forge.properties;
import forge.util.FileUtil;
import java.io.BufferedWriter; import java.io.BufferedWriter;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
@@ -24,8 +26,6 @@ import java.util.EnumMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import forge.util.FileUtil;
/** /**
* Holds default preference values in an enum. * Holds default preference values in an enum.
* Loads preferred values when instantiated. * Loads preferred values when instantiated.
@@ -109,7 +109,11 @@ public abstract class PreferencesStore<T extends Enum<T>> {
} }
public final int getPrefInt(final T fp0) { public final int getPrefInt(final T fp0) {
try{
return Integer.parseInt(getPref(fp0)); return Integer.parseInt(getPref(fp0));
} catch(NumberFormatException e) {
return Integer.parseInt(getPrefDefault(fp0));
}
} }
public final boolean getPrefBoolean(final T fp0) { public final boolean getPrefBoolean(final T fp0) {