From 86629e77730613939873765a995b7a6419f38dec Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 24 Apr 2023 10:35:22 -0400 Subject: [PATCH 1/7] Move resource reloading to dedicated executor Allows benefiting from Smooth Boot in-game (as intended) while not slowing down launch --- .../org/embeddedt/modernfix/ModernFix.java | 27 ++++++++++++++++--- .../core/config/ModernFixEarlyConfig.java | 1 + .../MinecraftMixin.java | 17 ++++++++++++ .../MinecraftServerMixin.java | 17 ++++++++++++ .../dynamic_resources/ModelBakeryMixin.java | 2 +- src/main/resources/modernfix.mixins.json | 2 ++ 6 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/MinecraftMixin.java create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/MinecraftServerMixin.java diff --git a/src/main/java/org/embeddedt/modernfix/ModernFix.java b/src/main/java/org/embeddedt/modernfix/ModernFix.java index 5d91a669..5a761ba3 100644 --- a/src/main/java/org/embeddedt/modernfix/ModernFix.java +++ b/src/main/java/org/embeddedt/modernfix/ModernFix.java @@ -1,6 +1,7 @@ package org.embeddedt.modernfix; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import net.minecraft.Util; import net.minecraft.server.level.ChunkHolder; import net.minecraft.server.level.ChunkMap; import net.minecraft.server.level.ServerLevel; @@ -24,6 +25,7 @@ import org.apache.commons.lang3.tuple.Pair; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.embeddedt.modernfix.classloading.ModFileScanDataDeduplicator; +import org.embeddedt.modernfix.core.ModernFixMixinPlugin; import org.embeddedt.modernfix.core.config.ModernFixConfig; import org.embeddedt.modernfix.entity.EntityDataIDSyncHandler; import org.embeddedt.modernfix.packet.PacketHandler; @@ -34,9 +36,8 @@ import org.embeddedt.modernfix.util.KubeUtil; import java.lang.management.ManagementFactory; import java.lang.reflect.Field; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.Semaphore; -import java.util.concurrent.TimeUnit; +import java.lang.reflect.Method; +import java.util.concurrent.*; import java.util.function.BooleanSupplier; // The value here should match an entry in the META-INF/mods.toml file @@ -55,6 +56,26 @@ public class ModernFix { public static CountDownLatch worldLoadSemaphore = null; + private static Executor resourceReloadService = null; + + static { + try { + if(ModernFixMixinPlugin.instance.isOptionEnabled("perf.dedicated_reload_executor.ReloadExecutor")) { + Method makeExecutorMethod = ObfuscationReflectionHelper.findMethod(Util.class, "func_240979_a_", String.class); + resourceReloadService = (Executor)makeExecutorMethod.invoke(null, "ResourceReload"); + } else { + resourceReloadService = Util.backgroundExecutor(); + } + } catch(RuntimeException | ReflectiveOperationException e) { + LOGGER.error("Could not create resource reload executor", e); + resourceReloadService = Util.backgroundExecutor(); + } + } + + public static Executor resourceReloadExecutor() { + return resourceReloadService; + } + /** * Simple mechanism used to delay some background processes until the client is actually in-game, to reduce * launch time. 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 b92d790a..f7a3692d 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -38,6 +38,7 @@ public class ModernFixEarlyConfig { this.addMixinRule("perf.reuse_datapacks", true); this.addMixinRule("perf.model_optimizations", true); this.addMixinRule("perf.dynamic_resources", false); + this.addMixinRule("perf.dedicated_reload_executor", true); /* Use a simpler ArrayMap if FerriteCore is using the map intelligently anyway */ this.addMixinRule("perf.state_definition_construct", modPresent("ferritecore")); this.addMixinRule("perf.cache_strongholds", true); diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/MinecraftMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/MinecraftMixin.java new file mode 100644 index 00000000..296c7fd0 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/MinecraftMixin.java @@ -0,0 +1,17 @@ +package org.embeddedt.modernfix.mixin.perf.dedicated_reload_executor; + +import net.minecraft.client.Minecraft; +import org.embeddedt.modernfix.ModernFix; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.concurrent.Executor; + +@Mixin(Minecraft.class) +public class MinecraftMixin { + @Redirect(method = { "", "makeServerStem", "reloadResourcePacks" }, at = @At(value = "INVOKE", target = "Lnet/minecraft/Util;backgroundExecutor()Ljava/util/concurrent/Executor;", ordinal = 0)) + private Executor getResourceReloadExecutor() { + return ModernFix.resourceReloadExecutor(); + } +} diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/MinecraftServerMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/MinecraftServerMixin.java new file mode 100644 index 00000000..64204521 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/MinecraftServerMixin.java @@ -0,0 +1,17 @@ +package org.embeddedt.modernfix.mixin.perf.dedicated_reload_executor; + +import net.minecraft.server.MinecraftServer; +import org.embeddedt.modernfix.ModernFix; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +import java.util.concurrent.Executor; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin { + @ModifyArg(method = "*", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/ServerResources;loadResources(Ljava/util/List;Lnet/minecraft/commands/Commands$CommandSelection;ILjava/util/concurrent/Executor;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"), index = 3) + private Executor getReloadExecutor(Executor asyncExecutor) { + return ModernFix.resourceReloadExecutor(); + } +} diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ModelBakeryMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ModelBakeryMixin.java index 8aac2731..8bcb5820 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ModelBakeryMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ModelBakeryMixin.java @@ -208,7 +208,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { ModernFix.LOGGER.error("Error reading blockstate {}: {}", blockstate, e); } return Pair.of(blockstate, null); - }, Util.backgroundExecutor())); + }, ModernFix.resourceReloadExecutor())); } blockStateFiles = null; CompletableFuture.allOf(blockStateData.toArray(new CompletableFuture[0])).join(); diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index 814136ad..e091cdb4 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -18,6 +18,7 @@ "bugfix.refinedstorage.te_bug.ItemExternalStorageMixin", "bugfix.chunk_deadlock.ServerChunkCacheMixin", "bugfix.chunk_deadlock.valhesia.BlockStateBaseMixin", + "perf.dedicated_reload_executor.MinecraftServerMixin", "perf.remove_biome_temperature_cache.BiomeMixin", "perf.resourcepacks.ModFileResourcePackMixin", "perf.resourcepacks.VanillaPackMixin", @@ -79,6 +80,7 @@ "bugfix.concurrency.RenderTypeMixin", "bugfix.concurrency.MinecraftMixin", "bugfix.concurrency.StaticTagHelperMixin", + "perf.dedicated_reload_executor.MinecraftMixin", "perf.dynamic_resources.BlockElementFaceDeserializerMixin", "perf.dynamic_resources.BlockModelShaperMixin", "perf.dynamic_resources.ItemModelShaperMixin", From ee8eb02e6d5e9bf093e79e6d671ccf3d6af6127a Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 24 Apr 2023 10:46:17 -0400 Subject: [PATCH 2/7] Replace mod work manager queue during vanilla bootstrap instead of in mixin plugin --- .../modernfix/core/ModernFixMixinPlugin.java | 1 - .../modernfix/mixin/core/BootstrapMixin.java | 26 +++++++++++++++++++ src/main/resources/modernfix.mixins.json | 1 + 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/core/BootstrapMixin.java diff --git a/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java b/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java index 27a12e99..1c696258 100644 --- a/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java +++ b/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java @@ -85,7 +85,6 @@ public class ModernFixMixinPlugin implements IMixinConfigPlugin { } FastAccessTransformerList.attemptReplace(); - ModWorkManagerQueue.replace(); DFUBlaster.blastMaps(); /* https://github.com/FabricMC/Mixin/pull/99 */ diff --git a/src/main/java/org/embeddedt/modernfix/mixin/core/BootstrapMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/core/BootstrapMixin.java new file mode 100644 index 00000000..4ec57d04 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/core/BootstrapMixin.java @@ -0,0 +1,26 @@ +package org.embeddedt.modernfix.mixin.core; + +import net.minecraft.server.Bootstrap; +import org.apache.logging.log4j.Logger; +import org.embeddedt.modernfix.load.ModWorkManagerQueue; +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; + +@Mixin(Bootstrap.class) +public class BootstrapMixin { + @Shadow private static boolean isBootstrapped; + + @Shadow @Final private static Logger LOGGER; + + @Inject(method = "bootStrap", at = @At("HEAD")) + private static void doModernFixBootstrap(CallbackInfo ci) { + if(!isBootstrapped) { + LOGGER.info("ModernFix bootstrap"); + ModWorkManagerQueue.replace(); + } + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index e091cdb4..5cb83fa3 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -6,6 +6,7 @@ "compatibilityLevel": "JAVA_8", "refmap": "modernfix.refmap.json", "mixins": [ + "core.BootstrapMixin", "bugfix.edge_chunk_not_saved.ChunkManagerMixin", "bugfix.starlight_emptiness.StarLightEngineMixin", "perf.dynamic_structure_manager.StructureManagerMixin", From fdbf8d621ea9206e251773d0a4601d7454540d57 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 24 Apr 2023 10:49:32 -0400 Subject: [PATCH 3/7] Fix additional use of backgroundExecutor in dynamic resources --- .../mixin/perf/dynamic_resources/ModelBakeryMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ModelBakeryMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ModelBakeryMixin.java index 8bcb5820..240cffce 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ModelBakeryMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/dynamic_resources/ModelBakeryMixin.java @@ -279,7 +279,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { ModernFix.LOGGER.error("Error reading model {}: {}", fileLocation, e); return Pair.of(fileLocation, null); } - }, Util.backgroundExecutor())); + }, ModernFix.resourceReloadExecutor())); } modelFiles.clear(); CompletableFuture.allOf(modelBytes.toArray(new CompletableFuture[0])).join(); From 8cdee4826e661e57c9423cd5a654f181e1c50481 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 24 Apr 2023 10:50:01 -0400 Subject: [PATCH 4/7] Disable boost worker count when Smooth Boot is installed --- .../embeddedt/modernfix/core/config/ModernFixEarlyConfig.java | 1 + 1 file changed, 1 insertion(+) 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 f7a3692d..27c986b7 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -82,6 +82,7 @@ public class ModernFixEarlyConfig { /* Mod compat */ disableIfModPresent("mixin.perf.thread_priorities", "smoothboot"); + disableIfModPresent("mixin.perf.boost_worker_count", "smoothboot"); disableIfModPresent("mixin.perf.async_jei", "modernui"); disableIfModPresent("mixin.perf.compress_biome_container", "chocolate", "betterendforge"); disableIfModPresent("mixin.bugfix.mc218112", "performant"); From b0c4719cb61e44ac6f21e27caa0739e45655297f Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 24 Apr 2023 11:15:22 -0400 Subject: [PATCH 5/7] Stricter mixin target --- .../mixin/perf/dedicated_reload_executor/MinecraftMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/MinecraftMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/MinecraftMixin.java index c8f169c6..432a4f5b 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/MinecraftMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/dedicated_reload_executor/MinecraftMixin.java @@ -11,7 +11,7 @@ import java.util.concurrent.ExecutorService; @Mixin(Minecraft.class) public class MinecraftMixin { - @Redirect(method = { "", "makeWorldStem(Lnet/minecraft/server/packs/repository/PackRepository;ZLnet/minecraft/server/WorldStem$DataPackConfigSupplier;Lnet/minecraft/server/WorldStem$WorldDataSupplier;)Lnet/minecraft/server/WorldStem;", "reloadResourcePacks" }, at = @At(value = "INVOKE", target = "Lnet/minecraft/Util;backgroundExecutor()Ljava/util/concurrent/ExecutorService;", ordinal = 0)) + @Redirect(method = { "", "makeWorldStem(Lnet/minecraft/server/packs/repository/PackRepository;ZLnet/minecraft/server/WorldStem$DataPackConfigSupplier;Lnet/minecraft/server/WorldStem$WorldDataSupplier;)Lnet/minecraft/server/WorldStem;", "reloadResourcePacks(Z)Ljava/util/concurrent/CompletableFuture;" }, at = @At(value = "INVOKE", target = "Lnet/minecraft/Util;backgroundExecutor()Ljava/util/concurrent/ExecutorService;", ordinal = 0)) private ExecutorService getResourceReloadExecutor() { return ModernFix.resourceReloadExecutor(); } From 4c36f04f56bfce8927f99ccace309bfeb6fdb617 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 24 Apr 2023 11:49:56 -0400 Subject: [PATCH 6/7] Fix the Minecraft window teleporting back to the center of the screen when early load finishes --- .../core/config/ModernFixEarlyConfig.java | 1 + .../WindowMixin.java | 68 +++++++++++++++++++ src/main/resources/modernfix.mixins.json | 1 + 3 files changed, 70 insertions(+) create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/bugfix/preserve_early_window_pos/WindowMixin.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 27c986b7..23ed4ede 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -48,6 +48,7 @@ public class ModernFixEarlyConfig { this.addMixinRule("perf.biome_zoomer", true); this.addMixinRule("perf.compress_blockstate", false); this.addMixinRule("bugfix.concurrency", true); + this.addMixinRule("bugfix.preserve_early_window_pos", true); this.addMixinRule("bugfix.edge_chunk_not_saved", true); this.addMixinRule("bugfix.starlight_emptiness", modPresent("starlight")); this.addMixinRule("bugfix.packet_leak", false); diff --git a/src/main/java/org/embeddedt/modernfix/mixin/bugfix/preserve_early_window_pos/WindowMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/bugfix/preserve_early_window_pos/WindowMixin.java new file mode 100644 index 00000000..1333440b --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/bugfix/preserve_early_window_pos/WindowMixin.java @@ -0,0 +1,68 @@ +package org.embeddedt.modernfix.mixin.bugfix.preserve_early_window_pos; + +import com.mojang.blaze3d.platform.Monitor; +import com.mojang.blaze3d.platform.ScreenManager; +import com.mojang.blaze3d.platform.Window; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; +import net.minecraftforge.fml.loading.progress.EarlyProgressVisualization; +import org.lwjgl.glfw.GLFW; +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; + +import java.util.function.IntSupplier; +import java.util.function.LongSupplier; +import java.util.function.Supplier; + +@Mixin(Window.class) +public class WindowMixin { + @Shadow private boolean fullscreen; + @Shadow private int width; + @Shadow private int height; + @Shadow private int windowedWidth; + @Shadow private int windowedHeight; + private static Class VISUALIZER; + + static { + try { + VISUALIZER = Class.forName("net.minecraftforge.fml.loading.progress.ClientVisualization"); + } catch(ClassNotFoundException e) { + VISUALIZER = null; + } + } + + private Object getEarlyProgressVisualizer() { + if(VISUALIZER == null || this.fullscreen) + return null; + Object o = ObfuscationReflectionHelper.getPrivateValue(EarlyProgressVisualization.class, EarlyProgressVisualization.INSTANCE, "visualization"); + return VISUALIZER.isAssignableFrom(o.getClass()) ? o : null; + } + + /** + * Return a null monitor if not in fullscreen and the visualizer is present, so that the code grabs the + * original X/Y position of the window. + */ + @Redirect(method = "", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/ScreenManager;getMonitor(J)Lcom/mojang/blaze3d/platform/Monitor;")) + private Monitor getMonitor(ScreenManager manager, long id) { + return getEarlyProgressVisualizer() != null ? null : manager.getMonitor(id); + } + + /** + * Grab the original width/height from the window and inject them into our state variables. + */ + @SuppressWarnings("unchecked") + @Redirect(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/fml/loading/progress/EarlyProgressVisualization;handOffWindow(Ljava/util/function/IntSupplier;Ljava/util/function/IntSupplier;Ljava/util/function/Supplier;Ljava/util/function/LongSupplier;)J")) + private long performHandoff(EarlyProgressVisualization instance, IntSupplier width, IntSupplier height, Supplier title, LongSupplier monitor) { + Object visualizer = getEarlyProgressVisualizer(); + if(visualizer != null) { + long windowId = ObfuscationReflectionHelper.getPrivateValue((Class)visualizer.getClass(), visualizer, "window"); + int[] w = new int[1]; + int[] h = new int[1]; + GLFW.glfwGetWindowSize(windowId, w, h); + this.windowedWidth = this.width = w[0]; + this.windowedHeight = this.height = h[0]; + } + return instance.handOffWindow(width, height, title, monitor); + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index 5cb83fa3..776cbbbf 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -78,6 +78,7 @@ "feature.measure_time.MinecraftMixin", "feature.reduce_loading_screen_freezes.ModelBakeryMixin", "perf.skip_first_datapack_reload.MinecraftMixin", + "bugfix.preserve_early_window_pos.WindowMixin", "bugfix.concurrency.RenderTypeMixin", "bugfix.concurrency.MinecraftMixin", "bugfix.concurrency.StaticTagHelperMixin", From da33aa7ef92f4f000d53eee1c0216f04dd9cbf6f Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 24 Apr 2023 13:46:07 -0400 Subject: [PATCH 7/7] Clear vanilla memory reserve --- src/main/java/org/embeddedt/modernfix/ModernFixClient.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/embeddedt/modernfix/ModernFixClient.java b/src/main/java/org/embeddedt/modernfix/ModernFixClient.java index 4fce8533..66087dab 100644 --- a/src/main/java/org/embeddedt/modernfix/ModernFixClient.java +++ b/src/main/java/org/embeddedt/modernfix/ModernFixClient.java @@ -6,6 +6,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.DebugScreenOverlay; import net.minecraft.client.gui.screens.ConnectScreen; import net.minecraft.client.gui.screens.TitleScreen; +import net.minecraft.util.MemoryReserve; import net.minecraftforge.client.event.ScreenEvent; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.SynchedEntityData; @@ -48,8 +49,7 @@ public class ModernFixClient { public ModernFixClient() { // clear reserve as it's not needed - // TODO: port 1.18+ - // ObfuscationReflectionHelper.setPrivateValue(Minecraft.class, null, new byte[0], "field_71444_a"); + MemoryReserve.release(); if(ModernFixMixinPlugin.instance.isOptionEnabled("perf.faster_singleplayer_load.ClientEvents")) { MinecraftForge.EVENT_BUS.register(new LoadEvents()); }