Support preloading keywords for improved performance

This commit is contained in:
drdev
2015-09-07 21:13:12 +00:00
parent b707d03c1e
commit 1ce62b1bb8
4 changed files with 55 additions and 3 deletions

View File

@@ -2,6 +2,7 @@ package forge.game.keyword;
import java.util.*; import java.util.*;
import forge.StaticData;
import forge.game.card.Card; import forge.game.card.Card;
import forge.item.PaperCard; import forge.item.PaperCard;
@@ -182,10 +183,11 @@ public enum Keyword {
return keywords; return keywords;
} }
private static final Map<PaperCard, Set<Keyword>> cardKeywordsLookup = new HashMap<PaperCard, Set<Keyword>>(); private static final Map<String, Set<Keyword>> cardKeywordSetLookup = new HashMap<String, Set<Keyword>>();
public static Set<Keyword> getKeywordSet(PaperCard card) { public static Set<Keyword> getKeywordSet(PaperCard card) {
Set<Keyword> keywordSet = cardKeywordsLookup.get(card); String key = card.getName();
Set<Keyword> keywordSet = cardKeywordSetLookup.get(key);
if (keywordSet == null) { if (keywordSet == null) {
keywordSet = new HashSet<Keyword>(); keywordSet = new HashSet<Keyword>();
List<String> keywords = Card.getCardForUi(card).getKeywords(); List<String> keywords = Card.getCardForUi(card).getKeywords();
@@ -195,8 +197,23 @@ public enum Keyword {
keywordSet.add(keyword); keywordSet.add(keyword);
} }
} }
cardKeywordsLookup.put(card, keywordSet); cardKeywordSetLookup.put(card.getName(), keywordSet);
} }
return keywordSet; return keywordSet;
} }
public static Runnable getPreloadTask() {
if (cardKeywordSetLookup.size() < 10000) { //allow preloading even if some but not all cards loaded
return new Runnable() {
@Override
public void run() {
final Collection<PaperCard> cards = StaticData.instance().getCommonCards().getUniqueCards();
for (PaperCard card : cards) {
getKeywordSet(card);
}
}
};
}
return null;
}
} }

View File

@@ -9,11 +9,14 @@ import com.google.common.base.Predicates;
import forge.FThreads; import forge.FThreads;
import forge.Forge; import forge.Forge;
import forge.game.keyword.Keyword;
import forge.item.InventoryItem; import forge.item.InventoryItem;
import forge.itemmanager.AdvancedSearch; import forge.itemmanager.AdvancedSearch;
import forge.itemmanager.ItemManager; import forge.itemmanager.ItemManager;
import forge.itemmanager.AdvancedSearch.FilterOption;
import forge.menu.FTooltip; import forge.menu.FTooltip;
import forge.screens.FScreen; import forge.screens.FScreen;
import forge.screens.LoadingOverlay;
import forge.toolbox.FContainer; import forge.toolbox.FContainer;
import forge.toolbox.FDisplayObject; import forge.toolbox.FDisplayObject;
import forge.toolbox.FEvent; import forge.toolbox.FEvent;
@@ -338,6 +341,13 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
else { else {
btnFilter.setText(emptyFilterText); btnFilter.setText(emptyFilterText);
} }
if (filter.getOption() == FilterOption.CARD_KEYWORDS) {
//the first time the user selects keywords, preload keywords for all cards
Runnable preloadTask = Keyword.getPreloadTask();
if (preloadTask != null) {
LoadingOverlay.runBackgroundTask("Loading keywords...", preloadTask);
}
}
} }
}); });
} }

View File

@@ -38,6 +38,23 @@ public class LoadingOverlay extends FOverlay {
}); });
} }
public static void runBackgroundTask(String caption0, final Runnable task) {
final LoadingOverlay loader = new LoadingOverlay(caption0);
loader.show();
FThreads.invokeInBackgroundThread(new Runnable() {
@Override
public void run() {
task.run();
FThreads.invokeInEdtLater(new Runnable() {
@Override
public void run() {
loader.hide();
}
});
}
});
}
private String caption; private String caption;
public LoadingOverlay(String caption0) { public LoadingOverlay(String caption0) {

View File

@@ -891,6 +891,14 @@ public class AdvancedSearch {
return caption.substring(emptyCaption.length()); return caption.substring(emptyCaption.length());
} }
public FilterOption getOption() {
return option;
}
public FilterOperator getOperator() {
return operator;
}
public Predicate<T> getPredicate() { public Predicate<T> getPredicate() {
return predicate; return predicate;
} }