Selaa lähdekoodia

trying to optimise it

shedaniel 5 vuotta sitten
vanhempi
sitoutus
16c5cc3133

+ 1 - 1
gradle.properties

@@ -1,4 +1,4 @@
-mod_version=3.2.31
+mod_version=3.2.32
 minecraft_version=1.15
 yarn_version=1.15+build.1
 fabricloader_version=0.7.2+build.174

+ 5 - 8
src/main/java/me/shedaniel/rei/api/EntryRegistry.java

@@ -10,6 +10,7 @@ import me.shedaniel.rei.utils.CollectionUtils;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 
@@ -27,6 +28,8 @@ public interface EntryRegistry {
      */
     List<EntryStack> getStacksList();
 
+    List<ItemStack> appendStacksForItem(Item item);
+
     /**
      * Gets all possible stacks from an item
      *
@@ -66,11 +69,7 @@ public interface EntryRegistry {
      * @param stacks     the stacks to register
      */
     default void registerEntriesAfter(EntryStack afterStack, EntryStack... stacks) {
-        for (int i = stacks.length - 1; i >= 0; i--) {
-            EntryStack stack = stacks[i];
-            if (stack != null && !stack.isEmpty())
-                registerEntryAfter(afterStack, stack);
-        }
+        registerEntriesAfter(afterStack, Arrays.asList(stacks));
     }
 
     /**
@@ -79,9 +78,7 @@ public interface EntryRegistry {
      * @param afterStack the stack to put after
      * @param stacks     the stacks to register
      */
-    default void registerEntriesAfter(EntryStack afterStack, Collection<? extends EntryStack> stacks) {
-        registerEntriesAfter(afterStack, stacks.toArray(new EntryStack[0]));
-    }
+    void registerEntriesAfter(EntryStack afterStack, Collection<? extends EntryStack> stacks);
 
     /**
      * Registers multiple stacks to the item list

+ 37 - 52
src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java

@@ -8,20 +8,14 @@ package me.shedaniel.rei.impl;
 import com.google.common.collect.Lists;
 import me.shedaniel.rei.api.EntryRegistry;
 import me.shedaniel.rei.api.EntryStack;
+import me.shedaniel.rei.api.RecipeHelper;
 import me.shedaniel.rei.api.annotations.Internal;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 import net.minecraft.util.DefaultedList;
 
-import it.unimi.dsi.fastutil.Hash;
-import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet;
-import it.unimi.dsi.fastutil.objects.ObjectSets;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
+import javax.annotation.Nullable;
+import java.util.*;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 @Deprecated
@@ -29,39 +23,37 @@ import java.util.concurrent.CopyOnWriteArrayList;
 public class EntryRegistryImpl implements EntryRegistry {
 
     private final CopyOnWriteArrayList<EntryStack> entries = Lists.newCopyOnWriteArrayList();
-    private final Set<EntryStack> entrySet = ObjectSets.synchronize(new ObjectOpenCustomHashSet<>(new Hash.Strategy<EntryStack>() {
-        @Override
-        public int hashCode(EntryStack entry) {
-            return entry == null ? 0 : entry.hashOfAll();
-        }
+    private final LinkedList<EntryStack> linkedList = Lists.newLinkedList();
 
-        @Override
-        public boolean equals(EntryStack a, EntryStack b) {
-            if (a == null || b == null) {
-                return a == b;
-            } else {
-                boolean result = a.equalsAll(b);
-                assert result == b.equalsAll(a) : "a.equalsAll(b) != b.equalsAll(a); (a = " + a + ", b = " + b + ")";
-                return result;
-            }
-        }
-    }));
+    public void distinct() {
+        TreeSet<EntryStack> set = new TreeSet<>((i, j) -> i.equalsAll(j) ? 0 : 1);
+        set.addAll(linkedList);
+        entries.clear();
+        entries.addAll(set);
+        linkedList.clear();
+    }
 
     @Override
     public List<EntryStack> getStacksList() {
-        return entries;
+        return RecipeHelper.getInstance().arePluginsLoading() && !linkedList.isEmpty() ? linkedList : entries;
     }
 
     public void reset() {
         entries.clear();
-        entrySet.clear();
+        linkedList.clear();
     }
 
     @Override
-    public ItemStack[] getAllStacksFromItem(Item item) {
-        DefaultedList<ItemStack> list = DefaultedList.of();
-        list.add(item.getStackForRender());
+    public List<ItemStack> appendStacksForItem(Item item) {
+        DefaultedList<ItemStack> list = new DefaultedLinkedList(Lists.newLinkedList(), null);
         item.appendStacks(item.getGroup(), list);
+        if (list.isEmpty()) list.add(item.getStackForRender());
+        return list;
+    }
+
+    @Override
+    public ItemStack[] getAllStacksFromItem(Item item) {
+        List<ItemStack> list = appendStacksForItem(item);
         ItemStack[] array = list.toArray(new ItemStack[0]);
         Arrays.sort(array, (a, b) -> ItemStack.areEqualIgnoreDamage(a, b) ? 0 : 1);
         return array;
@@ -71,43 +63,36 @@ public class EntryRegistryImpl implements EntryRegistry {
     @Deprecated
     public void registerEntryAfter(EntryStack afterEntry, EntryStack stack, boolean checkAlreadyContains) {
         if (stack.isEmpty()) return;
-        boolean isNew = entrySet.add(stack);
-        if (checkAlreadyContains && !isNew) {
-            return;
-        }
         if (afterEntry == null) {
-            entries.add(stack);
+            linkedList.add(stack);
         } else {
-            int last = entries.size();
-            for (int i = 0; i < entries.size(); i++)
-                if (entries.get(i).equalsAll(afterEntry))
+            int last = linkedList.size();
+            for (int i = last - 1; i >= 0; i++)
+                if (linkedList.get(i).equalsAll(afterEntry)) {
                     last = i + 1;
-            entries.add(last, stack);
+                    break;
+                }
+            linkedList.add(last, stack);
         }
     }
 
     @Override
     public void registerEntriesAfter(EntryStack afterStack, Collection<? extends EntryStack> stacks) {
-        List<EntryStack> nonDuplicates = new ArrayList<>();
-        for (EntryStack stack : stacks) {
-            if (entrySet.add(stack)) {
-                nonDuplicates.add(stack);
-            }
-        }
-        int index = entries.size();
         if (afterStack != null) {
+            int index = linkedList.size();
             for (int i = index - 1; i >= 0; i--) {
-                if (entries.get(i).equalsAll(afterStack)) {
+                if (linkedList.get(i).equalsAll(afterStack)) {
                     index = i + 1;
                     break;
                 }
             }
-        }
-        entries.addAll(index, nonDuplicates);
+            linkedList.addAll(index, stacks);
+        } else linkedList.addAll(stacks);
     }
 
-    @Override
-    public void registerEntriesAfter(EntryStack afterStack, EntryStack... stacks) {
-        registerEntriesAfter(afterStack, Arrays.asList(stacks));
+    private class DefaultedLinkedList<E> extends DefaultedList<E> {
+        public DefaultedLinkedList(List<E> delegate, @Nullable E initialElement) {
+            super(delegate, initialElement);
+        }
     }
 }

+ 6 - 6
src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java

@@ -116,17 +116,17 @@ public class ItemEntryStack extends AbstractEntryStack {
 
     @Override
     public int hashCode() {
-        if (hash == -1) {
+//        if (hash == -1) {
             int result = 1;
-            result = 31 * result + getType().ordinal();
+            result = 31 * result + getType().hashCode();
             result = 31 * result + itemStack.getItem().hashCode();
             result = 31 * result + itemStack.getCount();
             result = 31 * result + (itemStack.hasTag() ? itemStack.getTag().hashCode() : 0);
             hash = result;
-            if (hash == -1) {
-                hash = -2;
-            }
-        }
+//            if (hash == -1) {
+//                hash = -2;
+//            }
+//        }
         return hash;
     }
 

+ 22 - 16
src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java

@@ -47,16 +47,16 @@ public class RecipeHelperImpl implements RecipeHelper {
         VISIBILITY_HANDLER_COMPARATOR = comparator.reversed();
     }
 
-    private final List<AutoTransferHandler> autoTransferHandlers = Lists.newArrayList();
-    private final List<RecipeFunction> recipeFunctions = Lists.newArrayList();
-    private final List<ScreenClickArea> screenClickAreas = Lists.newArrayList();
-    private final AtomicInteger recipeCount = new AtomicInteger();
-    private final Map<Identifier, List<RecipeDisplay>> recipeCategoryListMap = Maps.newHashMap();
-    private final List<RecipeCategory<?>> categories = Lists.newArrayList();
-    private final Map<Identifier, ButtonAreaSupplier> autoCraftAreaSupplierMap = Maps.newHashMap();
-    private final Map<Identifier, List<List<EntryStack>>> categoryWorkingStations = Maps.newHashMap();
-    private final List<DisplayVisibilityHandler> displayVisibilityHandlers = Lists.newArrayList();
-    private final List<LiveRecipeGenerator<RecipeDisplay>> liveRecipeGenerators = Lists.newArrayList();
+    private final List<AutoTransferHandler> autoTransferHandlers = Lists.newLinkedList();
+    private final List<RecipeFunction> recipeFunctions = Lists.newLinkedList();
+    private final List<ScreenClickArea> screenClickAreas = Lists.newLinkedList();
+    private final int[] recipeCount = {0};
+    private final Map<Identifier, List<RecipeDisplay>> recipeCategoryListMap = Maps.newLinkedHashMap();
+    private final List<RecipeCategory<?>> categories = Lists.newLinkedList();
+    private final Map<Identifier, ButtonAreaSupplier> autoCraftAreaSupplierMap = Maps.newLinkedHashMap();
+    private final Map<Identifier, List<List<EntryStack>>> categoryWorkingStations = Maps.newLinkedHashMap();
+    private final List<DisplayVisibilityHandler> displayVisibilityHandlers = Lists.newLinkedList();
+    private final List<LiveRecipeGenerator<RecipeDisplay>> liveRecipeGenerators = Lists.newLinkedList();
     private RecipeManager recipeManager;
     private boolean arePluginsLoading = false;
 
@@ -118,14 +118,14 @@ public class RecipeHelperImpl implements RecipeHelper {
     public void registerDisplay(Identifier categoryIdentifier, RecipeDisplay display) {
         if (!recipeCategoryListMap.containsKey(categoryIdentifier))
             return;
-        recipeCount.incrementAndGet();
+        recipeCount[0]++;
         recipeCategoryListMap.get(categoryIdentifier).add(display);
     }
 
     private void registerDisplay(Identifier categoryIdentifier, RecipeDisplay display, int index) {
         if (!recipeCategoryListMap.containsKey(categoryIdentifier))
             return;
-        recipeCount.incrementAndGet();
+        recipeCount[0]++;
         recipeCategoryListMap.get(categoryIdentifier).add(index, display);
     }
 
@@ -249,7 +249,7 @@ public class RecipeHelperImpl implements RecipeHelper {
         long startTime = System.currentTimeMillis();
         arePluginsLoading = true;
         ScreenHelper.clearData();
-        this.recipeCount.set(0);
+        recipeCount[0] = 0;
         this.recipeManager = recipeManager;
         this.recipeCategoryListMap.clear();
         this.categories.clear();
@@ -277,7 +277,9 @@ public class RecipeHelperImpl implements RecipeHelper {
         for (REIPluginEntry plugin : plugins) {
             try {
                 if (reiVersion instanceof SemanticVersion)
-                    if (plugin.getMinimumVersion().compareTo((SemanticVersion) reiVersion) > 0) {
+                    if (plugin.getMinimumVersion() == null) {
+                        RoughlyEnoughItemsCore.LOGGER.warn("[REI] Plugin " + plugin.getPluginIdentifier().toString() + " did not provide a minimum version, skipping version check!");
+                    } else if (plugin.getMinimumVersion().compareTo((SemanticVersion) reiVersion) > 0) {
                         throw new IllegalStateException("Requires " + plugin.getMinimumVersion().getFriendlyString() + " version of REI!");
                     }
                 if (plugin instanceof REIPluginV0) {
@@ -300,6 +302,9 @@ public class RecipeHelperImpl implements RecipeHelper {
                 RoughlyEnoughItemsCore.LOGGER.error("[REI] " + identifier.toString() + " plugin failed to load!", e);
             }
         }
+        // Remove duplicate entries
+        ((EntryRegistryImpl) EntryRegistry.getInstance()).distinct();
+
         for (REIPluginV0 plugin : reiPluginV0s) {
             Identifier identifier = plugin.getPluginIdentifier();
             try {
@@ -333,12 +338,13 @@ public class RecipeHelperImpl implements RecipeHelper {
                     return -1f;
                 }
             });
+
         // Clear Cache
         ((DisplayHelperImpl) DisplayHelper.getInstance()).resetCache();
         ScreenHelper.getOptionalOverlay().ifPresent(overlay -> overlay.shouldReInit = true);
 
         long usedTime = System.currentTimeMillis() - startTime;
-        RoughlyEnoughItemsCore.LOGGER.info("[REI] Registered %d stack entries, %d recipes displays, %d exclusion zones suppliers, %d bounds handler, %d visibility handlers and %d categories (%s) in %d ms.", EntryRegistry.getInstance().getStacksList().size(), recipeCount.get(), DisplayHelper.getInstance().getBaseBoundsHandler().supplierSize(), DisplayHelper.getInstance().getAllBoundsHandlers().size(), getDisplayVisibilityHandlers().size(), categories.size(), String.join(", ", categories.stream().map(RecipeCategory::getCategoryName).collect(Collectors.toList())), usedTime);
+        RoughlyEnoughItemsCore.LOGGER.info("[REI] Registered %d stack entries, %d recipes displays, %d exclusion zones suppliers, %d bounds handler, %d visibility handlers and %d categories (%s) in %d ms.", EntryRegistry.getInstance().getStacksList().size(), recipeCount[0], DisplayHelper.getInstance().getBaseBoundsHandler().supplierSize(), DisplayHelper.getInstance().getAllBoundsHandlers().size(), getDisplayVisibilityHandlers().size(), categories.size(), String.join(", ", categories.stream().map(RecipeCategory::getCategoryName).collect(Collectors.toList())), usedTime);
         arePluginsLoading = false;
     }
 
@@ -355,7 +361,7 @@ public class RecipeHelperImpl implements RecipeHelper {
 
     @Override
     public int getRecipeCount() {
-        return recipeCount.get();
+        return recipeCount[0];
     }
 
     @Override

+ 3 - 6
src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java

@@ -94,16 +94,13 @@ public class DefaultPlugin implements REIPluginV0 {
             return;
         }
         for (Item item : Registry.ITEM) {
-            ItemStack[] stacks = null;
+            List<ItemStack> stacks = null;
             try {
-                stacks = entryRegistry.getAllStacksFromItem(item);
-                for (ItemStack stack : entryRegistry.getAllStacksFromItem(item)) {
-                    entryRegistry.registerEntry(EntryStack.create(stack));
-                }
+                stacks = entryRegistry.appendStacksForItem(item);
             } catch (Exception ignored) {
             }
             if (stacks != null) {
-                for (ItemStack stack : entryRegistry.getAllStacksFromItem(item)) {
+                for (ItemStack stack : entryRegistry.appendStacksForItem(item)) {
                     entryRegistry.registerEntry(EntryStack.create(stack));
                 }
             } else

+ 15 - 7
src/main/java/me/shedaniel/rei/tests/plugin/REITestPlugin.java

@@ -15,10 +15,14 @@ import net.minecraft.util.registry.Registry;
 import org.apache.logging.log4j.LogManager;
 import org.jetbrains.annotations.TestOnly;
 
+import java.util.Random;
+
 @TestOnly
 @Deprecated
 public class REITestPlugin implements REIPluginV0 {
 
+    private Random random = new Random();
+
     @Override
     public void preRegister() {
         LogManager.getLogger().error("REI Test Plugin is enabled! If you see this unintentionally, please report this!");
@@ -32,17 +36,21 @@ public class REITestPlugin implements REIPluginV0 {
     @Override
     public void registerEntries(EntryRegistry entryRegistry) {
         for (Item item : Registry.ITEM) {
-            entryRegistry.registerEntryAfter(null, EntryStack.create(item), false);
-            entryRegistry.registerEntryAfter(null, EntryStack.create(item), false);
-            entryRegistry.registerEntryAfter(null, EntryStack.create(item), false);
+            for (int i = 0; i < 15; i++)
+                entryRegistry.registerEntry(transformStack(EntryStack.create(item)));
             try {
-                for (ItemStack stack : entryRegistry.getAllStacksFromItem(item)) {
-                    entryRegistry.registerEntryAfter(null, EntryStack.create(stack), false);
-                    entryRegistry.registerEntryAfter(null, EntryStack.create(stack), false);
-                    entryRegistry.registerEntryAfter(null, EntryStack.create(stack), false);
+                for (ItemStack stack : entryRegistry.appendStacksForItem(item)) {
+                    for (int i = 0; i < 15; i++)
+                        entryRegistry.registerEntry(transformStack(EntryStack.create(stack)));
                 }
             } catch (Exception e) {
             }
         }
     }
+
+    public EntryStack transformStack(EntryStack stack) {
+        stack.setAmount(random.nextInt(Integer.MAX_VALUE));
+        return stack;
+    }
+
 }