From ba3d418260932a3f621bc0e995ffa2432598ed39 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Wed, 26 Apr 2023 20:37:37 -0400 Subject: [PATCH] Speed up processing of dummy registry entries --- .../core/config/ModernFixEarlyConfig.java | 1 + .../NamespacedHolderHelperMixin.java | 46 +++++++++++++++++++ src/main/resources/modernfix.mixins.json | 1 + 3 files changed, 48 insertions(+) create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/perf/fast_forge_dummies/NamespacedHolderHelperMixin.java diff --git a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index 228627f1..ef65ce46 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -59,6 +59,7 @@ public class ModernFixEarlyConfig { this.addMixinRule("perf.compress_blockstate", false); this.addMixinRule("bugfix.concurrency", true); this.addMixinRule("bugfix.edge_chunk_not_saved", true); + this.addMixinRule("perf.fast_forge_dummies", true); this.addMixinRule("perf.dynamic_structure_manager", true); this.addMixinRule("bugfix.chunk_deadlock", true); this.addMixinRule("perf.thread_priorities", true); diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/fast_forge_dummies/NamespacedHolderHelperMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/fast_forge_dummies/NamespacedHolderHelperMixin.java new file mode 100644 index 00000000..d1e586a8 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/fast_forge_dummies/NamespacedHolderHelperMixin.java @@ -0,0 +1,46 @@ +package org.embeddedt.modernfix.mixin.perf.fast_forge_dummies; + +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.registries.IForgeRegistryEntry; +import org.jetbrains.annotations.Nullable; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.Map; +import java.util.function.Function; + +@Mixin(targets = { "net/minecraftforge/registries/NamespacedHolderHelper" }) +public class NamespacedHolderHelperMixin> { + @Shadow private Map> holdersByName; + + @Shadow @Final private @Nullable Function> holderLookup; + + @Shadow private Map> holders; + + @Shadow @Final private Registry self; + + @Inject(method = "freeze", at = @At(value = "FIELD", opcode = Opcodes.GETFIELD, target = "Lnet/minecraftforge/registries/NamespacedHolderHelper;holdersByName:Ljava/util/Map;"), cancellable = true, remap = false) + private void fastDummyCheck(CallbackInfoReturnable> cir) { + // Quickly iterate without making any streams, etc. to see if everything is fine + // Use the slow path (by returning without cancelling) when there is an error + for(Holder.Reference ref : this.holdersByName.values()) { + if(!ref.isBound()) + return; + } + if (this.holderLookup != null) { + for(Holder.Reference ref : this.holders.values()) { + if(ref.getType() == Holder.Reference.Type.INTRUSIVE && !ref.isBound()) + return; + } + } + // Skip the creation of streams + cir.setReturnValue(this.self); + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index 6dfac2a9..fb3e4bfe 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -13,6 +13,7 @@ "perf.dynamic_structure_manager.StructureManagerMixin", "bugfix.chunk_deadlock.ServerChunkCacheMixin", "perf.dedicated_reload_executor.MinecraftServerMixin", + "perf.fast_forge_dummies.NamespacedHolderHelperMixin", "perf.remove_biome_temperature_cache.BiomeMixin", "perf.reduce_blockstate_cache_rebuilds.GameDataMixin", "perf.reduce_blockstate_cache_rebuilds.BlockCallbacksMixin",