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 forge.StaticData;
import forge.game.card.Card;
import forge.item.PaperCard;
@@ -182,10 +183,11 @@ public enum Keyword {
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) {
Set<Keyword> keywordSet = cardKeywordsLookup.get(card);
String key = card.getName();
Set<Keyword> keywordSet = cardKeywordSetLookup.get(key);
if (keywordSet == null) {
keywordSet = new HashSet<Keyword>();
List<String> keywords = Card.getCardForUi(card).getKeywords();
@@ -195,8 +197,23 @@ public enum Keyword {
keywordSet.add(keyword);
}
}
cardKeywordsLookup.put(card, keywordSet);
cardKeywordSetLookup.put(card.getName(), 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.Forge;
import forge.game.keyword.Keyword;
import forge.item.InventoryItem;
import forge.itemmanager.AdvancedSearch;
import forge.itemmanager.ItemManager;
import forge.itemmanager.AdvancedSearch.FilterOption;
import forge.menu.FTooltip;
import forge.screens.FScreen;
import forge.screens.LoadingOverlay;
import forge.toolbox.FContainer;
import forge.toolbox.FDisplayObject;
import forge.toolbox.FEvent;
@@ -338,6 +341,13 @@ public class AdvancedSearchFilter<T extends InventoryItem> extends ItemFilter<T>
else {
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;
public LoadingOverlay(String caption0) {

View File

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