aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/nei
diff options
context:
space:
mode:
authorGlease <4586901+Glease@users.noreply.github.com>2021-10-18 16:21:41 +0800
committerGlease <4586901+Glease@users.noreply.github.com>2021-10-18 16:21:41 +0800
commit4d91ffd264c10ba82d767403e200347c74b8338d (patch)
tree8683e58190fa0c6cca1412b0ed12b48ef5ec974e /src/main/java/gregtech/nei
parentfa411d8339e75f8e4127c07f42cab0563c14cf5b (diff)
downloadGT5-Unofficial-4d91ffd264c10ba82d767403e200347c74b8338d.tar.gz
GT5-Unofficial-4d91ffd264c10ba82d767403e200347c74b8338d.tar.bz2
GT5-Unofficial-4d91ffd264c10ba82d767403e200347c74b8338d.zip
Cache sorted recipe list in NEI handlers
Diffstat (limited to 'src/main/java/gregtech/nei')
-rw-r--r--src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java56
1 files changed, 28 insertions, 28 deletions
diff --git a/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java b/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java
index f51acd9a77..f28c014bda 100644
--- a/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java
+++ b/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java
@@ -32,14 +32,18 @@ import net.minecraftforge.fluids.FluidStack;
import org.lwjgl.opengl.GL11;
import java.awt.*;
+import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+import java.util.stream.Collectors;
public class GT_NEI_DefaultHandler extends RecipeMapHandler {
public static final int sOffsetX = 5;
public static final int sOffsetY = 11;
+ private int mCachedRecipesVersion = -1;
+ private SoftReference<List<CachedDefaultRecipe>> mCachedRecipes = null;
static {
GuiContainerManager.addInputHandler(new GT_RectHandler());
@@ -51,12 +55,27 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
this.transferRects.add(new TemplateRecipeHandler.RecipeTransferRect(new Rectangle(65, 13, 36, 18), getOverlayIdentifier()));
}
+ @Deprecated
public List<GT_Recipe> getSortedRecipes() {
List<GT_Recipe> result = new ArrayList<>(this.mRecipeMap.mRecipeList);
Collections.sort(result);
return result;
}
+ public List<CachedDefaultRecipe> getCache() {
+ List<CachedDefaultRecipe> cache;
+ if (mCachedRecipesVersion == GT_Mod.gregtechproxy.getReloadCount() || mCachedRecipes == null || (cache = mCachedRecipes.get()) == null) {
+ cache = mRecipeMap.mRecipeList.stream() // do not use parallel stream. This is already parallelized by NEI
+ .filter(r -> !r.mHidden)
+ .map(CachedDefaultRecipe::new)
+ .collect(Collectors.toList());
+ // while the NEI parallelize handlers, for each individual handler it still uses sequential execution model
+ // so we do not need any synchronization here
+ mCachedRecipes = new SoftReference<>(cache);
+ }
+ return cache;
+ }
+
public static void drawText(int aX, int aY, String aString, int aColor) {
Minecraft.getMinecraft().fontRenderer.drawString(aString, aX, aY, aColor);
}
@@ -69,11 +88,7 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
@Override
public void loadCraftingRecipes(String outputId, Object... results) {
if (outputId.equals(getOverlayIdentifier())) {
- for (GT_Recipe tRecipe : getSortedRecipes()) {
- if (!tRecipe.mHidden) {
- this.arecipes.add(new CachedDefaultRecipe(tRecipe));
- }
- }
+ arecipes.addAll(getCache());
} else {
super.loadCraftingRecipes(outputId, results);
}
@@ -83,7 +98,7 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
public void loadCraftingRecipes(ItemStack aResult) {
ItemData tPrefixMaterial = GT_OreDictUnificator.getAssociation(aResult);
- ArrayList<ItemStack> tResults = new ArrayList();
+ ArrayList<ItemStack> tResults = new ArrayList<>();
tResults.add(aResult);
tResults.add(GT_OreDictUnificator.get(true, aResult));
if ((tPrefixMaterial != null) && (!tPrefixMaterial.mBlackListed) && (!tPrefixMaterial.mPrefix.mFamiliarPrefixes.isEmpty())) {
@@ -101,16 +116,9 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
if (tFluidStack != null) {
tResults.addAll(GT_Utility.getContainersFromFluid(tFluidStack));
}
- for (GT_Recipe tRecipe : getSortedRecipes()) {
- if (!tRecipe.mHidden) {
- CachedDefaultRecipe tNEIRecipe = new CachedDefaultRecipe(tRecipe);
- for (ItemStack tStack : tResults) {
- if (tNEIRecipe.contains(tNEIRecipe.mOutputs, tStack)) {
- this.arecipes.add(tNEIRecipe);
- break;
- }
- }
- }
+ for (CachedDefaultRecipe recipe : getCache()) {
+ if (tResults.stream().anyMatch(stack -> recipe.contains(recipe.mOutputs, stack)))
+ arecipes.add(recipe);
}
}
@@ -118,7 +126,7 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
public void loadUsageRecipes(ItemStack aInput) {
ItemData tPrefixMaterial = GT_OreDictUnificator.getAssociation(aInput);
- ArrayList<ItemStack> tInputs = new ArrayList();
+ ArrayList<ItemStack> tInputs = new ArrayList<>();
tInputs.add(aInput);
tInputs.add(GT_OreDictUnificator.get(false, aInput));
if ((tPrefixMaterial != null) && (!tPrefixMaterial.mPrefix.mFamiliarPrefixes.isEmpty())) {
@@ -136,18 +144,10 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
if (tFluidStack != null) {
tInputs.addAll(GT_Utility.getContainersFromFluid(tFluidStack));
}
- for (GT_Recipe tRecipe : getSortedRecipes()) {
- if (!tRecipe.mHidden) {
- CachedDefaultRecipe tNEIRecipe = new CachedDefaultRecipe(tRecipe);
- for (ItemStack tStack : tInputs) {
- if (tNEIRecipe.contains(tNEIRecipe.mInputs, tStack)) {
- this.arecipes.add(tNEIRecipe);
- break;
- }
- }
- }
+ for (CachedDefaultRecipe recipe : getCache()) {
+ if (tInputs.stream().anyMatch(stack -> recipe.contains(recipe.mInputs, stack)))
+ arecipes.add(recipe);
}
- CachedDefaultRecipe tNEIRecipe;
}
@Override