From 74a727d335c9a0cf798f3128528023cf2eba443c Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 19 Feb 2023 20:05:09 -0500 Subject: [PATCH] Add ability to use vanilla resource reload profiler --- .../modernfix/core/ModernFixMixinPlugin.java | 2 +- .../core/config/ModernFixConfig.java | 5 +++- .../ProfiledReloadInstanceMixin.java | 24 ++++++++++++++++++ .../SimpleReloadableResourceManagerMixin.java | 23 +++++++++++++++++ .../util/NamedPreparableResourceListener.java | 25 +++++++++++++++++++ src/main/resources/modernfix.mixins.json | 4 ++- 6 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/ProfiledReloadInstanceMixin.java create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/SimpleReloadableResourceManagerMixin.java create mode 100644 src/main/java/org/embeddedt/modernfix/util/NamedPreparableResourceListener.java diff --git a/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java b/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java index ea3b018d..bbc4dcc0 100644 --- a/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java +++ b/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java @@ -9,7 +9,7 @@ import org.apache.logging.log4j.Logger; import org.embeddedt.modernfix.classloading.ModernFixResourceFinder; import org.embeddedt.modernfix.core.config.ModernFixEarlyConfig; import org.embeddedt.modernfix.core.config.Option; -import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.*; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; diff --git a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixConfig.java b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixConfig.java index c4e6d610..1963ad9a 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixConfig.java @@ -23,7 +23,7 @@ public class ModernFixConfig { public static ForgeConfigSpec.ConfigValue> BLACKLIST_ASYNC_JEI_PLUGINS; public static ForgeConfigSpec.IntValue INTEGRATED_SERVER_PRIORITY; - public static ForgeConfigSpec.IntValue BACKGROUND_WORKER_PRIORITY; + public static ForgeConfigSpec.BooleanValue ENABLE_DEBUG_RELOADER; public static ForgeConfigSpec.BooleanValue REBUILD_BLOCKSTATES_ASYNC; @@ -39,6 +39,9 @@ public class ModernFixConfig { "jepb:jei_plugin" ), locationValidator); INTEGRATED_SERVER_PRIORITY = COMMON_BUILDER.comment("Thread priority to use for the integrated server. By default this is one less than the client thread, to help prevent the server from lowering FPS.").defineInRange("integratedServerPriority", 4, 1, 10); + ENABLE_DEBUG_RELOADER = COMMON_BUILDER + .comment("Whether Minecraft's built-in profiling logic should be enabled for resource reloading. Can help with diagnosing world load times.") + .define("enable_debug_reloader", false); REBUILD_BLOCKSTATES_ASYNC = COMMON_BUILDER .comment("Rebuild blockstate cache asynchronously. Should work with most mods, but can be disabled.") .define("rebuild_blockstate_cache_async", true); diff --git a/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/ProfiledReloadInstanceMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/ProfiledReloadInstanceMixin.java new file mode 100644 index 00000000..9d93fc83 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/ProfiledReloadInstanceMixin.java @@ -0,0 +1,24 @@ +package org.embeddedt.modernfix.mixin.feature.measure_time; + +import net.minecraft.server.packs.resources.PreparableReloadListener; +import net.minecraft.server.packs.resources.ProfiledReloadInstance; +import org.embeddedt.modernfix.util.NamedPreparableResourceListener; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +import java.util.ArrayList; +import java.util.List; + +@Mixin(ProfiledReloadInstance.class) +public class ProfiledReloadInstanceMixin { + @ModifyVariable(method = "", at = @At("HEAD"), argsOnly = true, ordinal = 0) + private static List getWrappedListeners(List listeners) { + List newList = new ArrayList<>(listeners.size()); + for(PreparableReloadListener listener : listeners) { + newList.add(new NamedPreparableResourceListener(listener)); + } + return newList; + } +} diff --git a/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/SimpleReloadableResourceManagerMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/SimpleReloadableResourceManagerMixin.java new file mode 100644 index 00000000..26c2a67f --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/SimpleReloadableResourceManagerMixin.java @@ -0,0 +1,23 @@ +package org.embeddedt.modernfix.mixin.feature.measure_time; + +import net.minecraft.server.packs.resources.SimpleReloadableResourceManager; +import org.apache.logging.log4j.Logger; +import org.embeddedt.modernfix.core.config.ModernFixConfig; +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.Redirect; + +@Mixin(SimpleReloadableResourceManager.class) +public class SimpleReloadableResourceManagerMixin { + + /** + * @author embeddedt + * @reason add ability to use this feature in modpacks + */ + @Redirect(method = "createReload", at = @At(value = "INVOKE", target = "Lorg/apache/logging/log4j/Logger;isDebugEnabled()Z", remap = false)) + private boolean enableDebugReloader(Logger logger) { + return logger.isDebugEnabled() || ModernFixConfig.ENABLE_DEBUG_RELOADER.get(); + } +} diff --git a/src/main/java/org/embeddedt/modernfix/util/NamedPreparableResourceListener.java b/src/main/java/org/embeddedt/modernfix/util/NamedPreparableResourceListener.java new file mode 100644 index 00000000..a8729114 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/util/NamedPreparableResourceListener.java @@ -0,0 +1,25 @@ +package org.embeddedt.modernfix.util; + +import net.minecraft.server.packs.resources.PreparableReloadListener; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.util.profiling.ProfilerFiller; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; + +public class NamedPreparableResourceListener implements PreparableReloadListener { + private final PreparableReloadListener delegate; + public NamedPreparableResourceListener(PreparableReloadListener delegate) { + this.delegate = delegate; + } + + @Override + public CompletableFuture reload(PreparationBarrier stage, ResourceManager resourceManager, ProfilerFiller preparationsProfiler, ProfilerFiller reloadProfiler, Executor backgroundExecutor, Executor gameExecutor) { + return this.delegate.reload(stage, resourceManager, preparationsProfiler, reloadProfiler, backgroundExecutor, gameExecutor); + } + + @Override + public String getName() { + return this.delegate.getName() + " [" + this.delegate.getClass().getName() + "]"; + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index 909005af..59a193dd 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -39,7 +39,9 @@ "perf.async_locator.MapItemAccess", "perf.async_locator.MerchantOfferAccess", "perf.async_locator.TreasureMapForEmeraldsMixin", - "feature.measure_time.BootstrapMixin" + "feature.measure_time.BootstrapMixin", + "feature.measure_time.SimpleReloadableResourceManagerMixin", + "feature.measure_time.ProfiledReloadInstanceMixin" ], "client": [ "feature.measure_time.MinecraftMixin",