aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech
diff options
context:
space:
mode:
authorUristqwerty <Uristqwerty@gmail.com>2020-11-26 04:29:20 -0500
committerGitHub <noreply@github.com>2020-11-26 10:29:20 +0100
commita65bc5d9189095398d85b36cb0e2890ef5f106ce (patch)
tree9ab16bc995bcff41bb0f3f509119f8b03deec8d0 /src/main/java/gregtech
parentce81af0017487e0f914befc28a8151b6ff70d7a7 (diff)
downloadGT5-Unofficial-a65bc5d9189095398d85b36cb0e2890ef5f106ce.tar.gz
GT5-Unofficial-a65bc5d9189095398d85b36cb0e2890ef5f106ce.tar.bz2
GT5-Unofficial-a65bc5d9189095398d85b36cb0e2890ef5f106ce.zip
isRecipeInputEqual optimization (#351)
* Optimize GT_Recipe.isRecipeInputEqual Used HEAVILY to catch duplicate recipes during game startup. Worst-case, it would result in 5 GT_OreDictUnificator.get calls for each pair of inputs. Instead, this is closer to 1 + 1/N, and as an added bonus, the modified unification it now uses doesn't copy its output only for it to be discarded immediately after comparison. Apart from inproved startup times, this might make a small difference when machines switch recipes. I am making an assumption that GT_OreDictUnificator.get(true, GT_OreDictUnificator.get(false, stack)) is equivalent to a just GT_OreDictUnificator.get(false, stack), and the original code only double-unificated because it was easier to code. If this turns out to be false, there's still some performance gain from factoring out the tStack unification, but some of the optimization here would be lost. * Changed method visibility according to PR feedback
Diffstat (limited to 'src/main/java/gregtech')
-rw-r--r--src/main/java/gregtech/api/util/GT_OreDictUnificator.java53
-rw-r--r--src/main/java/gregtech/api/util/GT_Recipe.java5
2 files changed, 56 insertions, 2 deletions
diff --git a/src/main/java/gregtech/api/util/GT_OreDictUnificator.java b/src/main/java/gregtech/api/util/GT_OreDictUnificator.java
index 9d9b45cecf..188af9cfaa 100644
--- a/src/main/java/gregtech/api/util/GT_OreDictUnificator.java
+++ b/src/main/java/gregtech/api/util/GT_OreDictUnificator.java
@@ -156,6 +156,59 @@ public class GT_OreDictUnificator {
return GT_Utility.copyAmount(aStack.stackSize, rStack);
}
+ /** Doesn't copy the returned stack or set quantity. Be careful and do not mutate it;
+ * intended only to optimize comparisons */
+ static ItemStack get_nocopy(boolean aUseBlackList, ItemStack aStack) {
+ if (GT_Utility.isStackInvalid(aStack)) return null;
+ ItemData tPrefixMaterial = getAssociation(aStack);
+ ItemStack rStack = null;
+ if (tPrefixMaterial == null || !tPrefixMaterial.hasValidPrefixMaterialData() || (aUseBlackList && tPrefixMaterial.mBlackListed))
+ return aStack;
+ if (aUseBlackList && !GregTech_API.sUnificationEntriesRegistered && isBlacklisted(aStack)) {
+ tPrefixMaterial.mBlackListed = true;
+ return aStack;
+ }
+ if (tPrefixMaterial.mUnificationTarget == null)
+ tPrefixMaterial.mUnificationTarget = sName2StackMap.get(tPrefixMaterial.toString());
+ rStack = tPrefixMaterial.mUnificationTarget;
+ if (GT_Utility.isStackInvalid(rStack)) return aStack;
+ assert rStack != null;
+ rStack.setTagCompound(aStack.getTagCompound());
+ return rStack;
+ }
+
+ /** Compares the first argument against an already-unificated second argument as if
+ * aUseBlackList was both true and false. */
+ public static boolean isInputStackEqual(ItemStack aStack, ItemStack unified_tStack) {
+ boolean alreadyCompared = false;
+ if (GT_Utility.isStackInvalid(aStack)) return false;
+ ItemData tPrefixMaterial = getAssociation(aStack);
+ ItemStack rStack = null;
+ if (tPrefixMaterial == null || !tPrefixMaterial.hasValidPrefixMaterialData())
+ return GT_Utility.areStacksEqual(aStack, unified_tStack, true);
+ else if(tPrefixMaterial.mBlackListed) {
+ if (GT_Utility.areStacksEqual(aStack, unified_tStack, true))
+ return true;
+ else
+ alreadyCompared = true;
+ }
+ if (!alreadyCompared && !GregTech_API.sUnificationEntriesRegistered && isBlacklisted(aStack)) {
+ tPrefixMaterial.mBlackListed = true;
+ if (GT_Utility.areStacksEqual(aStack, unified_tStack, true))
+ return true;
+ else
+ alreadyCompared = true;
+ }
+ if (tPrefixMaterial.mUnificationTarget == null)
+ tPrefixMaterial.mUnificationTarget = sName2StackMap.get(tPrefixMaterial.toString());
+ rStack = tPrefixMaterial.mUnificationTarget;
+ if (GT_Utility.isStackInvalid(rStack))
+ return !alreadyCompared && GT_Utility.areStacksEqual(aStack, unified_tStack, true);
+ assert rStack != null;
+ rStack.setTagCompound(aStack.getTagCompound());
+ return GT_Utility.areStacksEqual(rStack, unified_tStack, true);
+ }
+
public static List<ItemStack> getNonUnifiedStacks(Object obj) {
synchronized (sUnificationTable) {
if (sUnificationTable.isEmpty() && !sItemStack2DataMap.isEmpty()) {
diff --git a/src/main/java/gregtech/api/util/GT_Recipe.java b/src/main/java/gregtech/api/util/GT_Recipe.java
index bf091695c7..537d92b365 100644
--- a/src/main/java/gregtech/api/util/GT_Recipe.java
+++ b/src/main/java/gregtech/api/util/GT_Recipe.java
@@ -389,11 +389,12 @@ public class GT_Recipe implements Comparable<GT_Recipe> {
if (mInputs.length > 0 && aInputs == null) return false;
for (ItemStack tStack : mInputs) {
- if (tStack != null) {
+ ItemStack unified_tStack = GT_OreDictUnificator.get_nocopy(true, tStack);
+ if (unified_tStack != null) {
amt = tStack.stackSize;
boolean temp = true;
for (ItemStack aStack : aInputs) {
- if ((GT_Utility.areUnificationsEqual(aStack, tStack, true) || GT_Utility.areUnificationsEqual(GT_OreDictUnificator.get(false, aStack), tStack, true))) {
+ if (GT_OreDictUnificator.isInputStackEqual(aStack, unified_tStack)) {
if (GTppRecipeHelper) {//remove once the fix is out
if (GT_Utility.areStacksEqual(aStack, Ic2Items.FluidCell.copy(), true) || GT_Utility.areStacksEqual(aStack, ItemList.Tool_DataStick.get(1L), true) || GT_Utility.areStacksEqual(aStack, ItemList.Tool_DataOrb.get(1L), true)) {
if (!GT_Utility.areStacksEqual(aStack, tStack, false))