diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/parallel_potentially_unsafe/parallel_deferred_suppliers/EventDispatcherMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/parallel_potentially_unsafe/parallel_deferred_suppliers/EventDispatcherMixin.java new file mode 100644 index 00000000..041bcc87 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/parallel_potentially_unsafe/parallel_deferred_suppliers/EventDispatcherMixin.java @@ -0,0 +1,35 @@ +package org.embeddedt.modernfix.mixin.perf.parallel_potentially_unsafe.parallel_deferred_suppliers; + +import com.sun.org.apache.xpath.internal.operations.Bool; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.IForgeRegistry; +import org.embeddedt.modernfix.registry.DeferredRegisterBaker; +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.CallbackInfo; + +import java.util.HashMap; + +@Mixin(DeferredRegister.EventDispatcher.class) +public class EventDispatcherMixin { + private static HashMap hasRegistryBaked = new HashMap<>(); + @Inject(method = "handleEvent", at = @At("HEAD"), remap = false) + private void bakeIfNeeded(RegistryEvent.Register event, CallbackInfo ci) { + IForgeRegistry registry = event.getRegistry(); + if(registry == null) + return; + ResourceLocation location = registry.getRegistryName(); + if(location == null) + return; + if(!hasRegistryBaked.getOrDefault(location, false)) { + DeferredRegisterBaker.bakeSuppliers(location); + hasRegistryBaked.put(location, true); + } + } +} diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/parallel_potentially_unsafe/parallel_deferred_suppliers/GameDataMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/parallel_potentially_unsafe/parallel_deferred_suppliers/GameDataMixin.java deleted file mode 100644 index ae79f002..00000000 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/parallel_potentially_unsafe/parallel_deferred_suppliers/GameDataMixin.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.embeddedt.modernfix.mixin.perf.parallel_potentially_unsafe.parallel_deferred_suppliers; - -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.ModLoadingStage; -import net.minecraftforge.registries.GameData; -import org.embeddedt.modernfix.registry.DeferredRegisterBaker; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -import java.util.List; -import java.util.function.Function; -import java.util.stream.Stream; - -@Mixin(GameData.class) -public class GameDataMixin { - @Inject(method = "generateRegistryEvents", at = @At(value = "INVOKE", target = "Ljava/util/List;stream()Ljava/util/stream/Stream;"), locals = LocalCapture.CAPTURE_FAILHARD, remap = false) - private static void bakeDeferredBeforeSendingEvents(CallbackInfoReturnable>> cir, List keys) { - /* TODO also bake items, maybe? */ - DeferredRegisterBaker.bakeSuppliers(new ResourceLocation("minecraft", "block")); - } -} diff --git a/src/main/java/org/embeddedt/modernfix/registry/DeferredRegisterBaker.java b/src/main/java/org/embeddedt/modernfix/registry/DeferredRegisterBaker.java index 79f7fefa..3528074e 100644 --- a/src/main/java/org/embeddedt/modernfix/registry/DeferredRegisterBaker.java +++ b/src/main/java/org/embeddedt/modernfix/registry/DeferredRegisterBaker.java @@ -30,6 +30,7 @@ public class DeferredRegisterBaker { HashMap>> registrySupplierMap = supplierMap.get(registry); if(registrySupplierMap == null) return; + ModernFix.LOGGER.info("Caching suppliers for " + registry); Stopwatch realtimeStopwatch = Stopwatch.createStarted(); AsyncStopwatch cpuStopwatch = new AsyncStopwatch(); OrderedParallelModDispatcher.dispatchBlocking(ModWorkManager.parallelExecutor(), modId -> { @@ -50,7 +51,7 @@ public class DeferredRegisterBaker { }); realtimeStopwatch.stop(); if(modErrors.size() > 0) - ModernFix.LOGGER.warn("The following mods had errors while caching suppliers (this is likely safe): [" + String.join(", ", modErrors) + "]"); + ModernFix.LOGGER.warn("The following mods had errors while caching " + registry + " suppliers (this is likely safe): [" + String.join(", ", modErrors) + "]"); ModernFix.LOGGER.info("CPU time spent constructing " + registry + " suppliers: " + cpuStopwatch.getCpuTime()/1000f + " seconds"); ModernFix.LOGGER.info("Real time spent constructing " + registry + " suppliers: " + realtimeStopwatch.elapsed(TimeUnit.MILLISECONDS)/1000f + " seconds"); } diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index b77edf3b..6a882462 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -20,7 +20,7 @@ "perf.thread_priorities.UtilMixin", "perf.preload_block_classes.GameDataMixin", "perf.parallel_potentially_unsafe.parallel_deferred_suppliers.DeferredRegisterMixin", - "perf.parallel_potentially_unsafe.parallel_deferred_suppliers.GameDataMixin", + "perf.parallel_potentially_unsafe.parallel_deferred_suppliers.EventDispatcherMixin", "perf.parallel_potentially_unsafe.parallel_blockstate_cache_rebuild.BlocksMixin", "perf.parallel_potentially_unsafe.parallel_blockstate_cache_rebuild.BlockCallbacksMixin", "perf.parallel_potentially_unsafe.parallel_blockstate_cache_rebuild.ShapeCacheMixin"