From 588dc1a86ea73ee8ba95a28a9c9d395eabe6b934 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Wed, 4 Jan 2023 20:26:29 -0500 Subject: [PATCH] Add config --- README.md | 3 + .../modernfix/core/ModernFixMixinPlugin.java | 95 ++++++++++ .../core/config/ModernFixConfig.java | 177 ++++++++++++++++++ .../modernfix/core/config/Option.java | 63 +++++++ .../concurrency}/RenderTypeMixin.java | 2 +- .../feature/measure_time/MinecraftMixin.java | 39 ++++ .../boost_worker_count}/UtilMixin.java | 2 +- .../ModelBakeryMixin.java | 7 +- .../AbstractBlockStateMixin.java | 2 +- .../BlockCallbacksMixin.java | 2 +- .../GameDataMixin.java | 2 +- .../BiomeMixin.java | 2 +- .../ModFileResourcePackMixin.java | 2 +- .../resourcepacks}/VanillaPackMixin.java | 2 +- .../LevelSaveMixin.java | 2 +- .../MinecraftMixin.java | 20 +- .../SaveFormatAccessor.java | 2 +- .../trim_model_caches}/ModelManagerMixin.java | 2 +- src/main/resources/modernfix.mixins.json | 28 +-- 19 files changed, 405 insertions(+), 49 deletions(-) create mode 100644 src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java create mode 100644 src/main/java/org/embeddedt/modernfix/core/config/ModernFixConfig.java create mode 100644 src/main/java/org/embeddedt/modernfix/core/config/Option.java rename src/main/java/org/embeddedt/modernfix/mixin/{ => bugfix/concurrency}/RenderTypeMixin.java (94%) create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/MinecraftMixin.java rename src/main/java/org/embeddedt/modernfix/mixin/{ => perf/boost_worker_count}/UtilMixin.java (93%) rename src/main/java/org/embeddedt/modernfix/mixin/{ => perf/parallelize_model_loading}/ModelBakeryMixin.java (93%) rename src/main/java/org/embeddedt/modernfix/mixin/{ => perf/reduce_blockstate_cache_rebuilds}/AbstractBlockStateMixin.java (86%) rename src/main/java/org/embeddedt/modernfix/mixin/{ => perf/reduce_blockstate_cache_rebuilds}/BlockCallbacksMixin.java (92%) rename src/main/java/org/embeddedt/modernfix/mixin/{ => perf/reduce_blockstate_cache_rebuilds}/GameDataMixin.java (97%) rename src/main/java/org/embeddedt/modernfix/mixin/{ => perf/remove_biome_temperature_cache}/BiomeMixin.java (89%) rename src/main/java/org/embeddedt/modernfix/mixin/{ => perf/resourcepacks}/ModFileResourcePackMixin.java (99%) rename src/main/java/org/embeddedt/modernfix/mixin/{ => perf/resourcepacks}/VanillaPackMixin.java (98%) rename src/main/java/org/embeddedt/modernfix/mixin/{ => perf/skip_first_datapack_reload}/LevelSaveMixin.java (95%) rename src/main/java/org/embeddedt/modernfix/mixin/{ => perf/skip_first_datapack_reload}/MinecraftMixin.java (64%) rename src/main/java/org/embeddedt/modernfix/mixin/{ => perf/skip_first_datapack_reload}/SaveFormatAccessor.java (85%) rename src/main/java/org/embeddedt/modernfix/mixin/{ => perf/trim_model_caches}/ModelManagerMixin.java (96%) diff --git a/README.md b/README.md index da2e317b..3e4dde8e 100644 --- a/README.md +++ b/README.md @@ -3,3 +3,6 @@ A Forge 1.16 mod that uses mixins to make the game slightly more performant (and hopefully less buggy too). In the words of asiekierka, questionable "performance improvements" that are not in Forge for probably very good reasons. + +Some fixes are based on prior work in various Forge PRs (check commit history and/or code comments). The config system +is directly derived from Sodium and used under the terms of the LGPL-3.0 license. \ No newline at end of file diff --git a/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java b/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java new file mode 100644 index 00000000..a2bf4725 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/core/ModernFixMixinPlugin.java @@ -0,0 +1,95 @@ +package org.embeddedt.modernfix.core; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.embeddedt.modernfix.core.config.ModernFixConfig; +import org.embeddedt.modernfix.core.config.Option; +import org.objectweb.asm.tree.ClassNode; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import java.io.File; +import java.util.List; +import java.util.Set; + +public class ModernFixMixinPlugin implements IMixinConfigPlugin { + private static final String MIXIN_PACKAGE_ROOT = "org.embeddedt.modernfix.mixin."; + + private final Logger logger = LogManager.getLogger("ModernFix"); + public static ModernFixConfig config = null; + + @Override + public void onLoad(String mixinPackage) { + try { + config = ModernFixConfig.load(new File("./config/modernfix-mixins.properties")); + } catch (Exception e) { + throw new RuntimeException("Could not load configuration file for ModernFix", e); + } + + this.logger.info("Loaded configuration file for ModernFix: {} options available, {} override(s) found", + config.getOptionCount(), config.getOptionOverrideCount()); + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + if (!mixinClassName.startsWith(MIXIN_PACKAGE_ROOT)) { + this.logger.error("Expected mixin '{}' to start with package root '{}', treating as foreign and " + + "disabling!", mixinClassName, MIXIN_PACKAGE_ROOT); + + return false; + } + + String mixin = mixinClassName.substring(MIXIN_PACKAGE_ROOT.length()); + Option option = config.getEffectiveOptionForMixin(mixin); + + if (option == null) { + this.logger.error("No rules matched mixin '{}', treating as foreign and disabling!", mixin); + + return false; + } + + if (option.isOverridden()) { + String source = "[unknown]"; + + if (option.isUserDefined()) { + source = "user configuration"; + } else if (option.isModDefined()) { + source = "mods [" + String.join(", ", option.getDefiningMods()) + "]"; + } + + if (option.isEnabled()) { + this.logger.warn("Force-enabling mixin '{}' as rule '{}' (added by {}) enables it", mixin, + option.getName(), source); + } else { + this.logger.warn("Force-disabling mixin '{}' as rule '{}' (added by {}) disables it and children", mixin, + option.getName(), source); + } + } + + return option.isEnabled(); + } + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { + + } + + @Override + public List getMixins() { + return null; + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } +} \ No newline at end of file diff --git a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixConfig.java b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixConfig.java new file mode 100644 index 00000000..16dc0ea5 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixConfig.java @@ -0,0 +1,177 @@ +package org.embeddedt.modernfix.core.config; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import net.minecraftforge.fml.loading.FMLLoader; + +import java.io.*; +import java.util.*; +import java.util.stream.Collectors; + +public class ModernFixConfig { + private static final Logger LOGGER = LogManager.getLogger("ModernFixConfig"); + + private final Map options = new HashMap<>(); + + private ModernFixConfig() { + // Defines the default rules which can be configured by the user or other mods. + // You must manually add a rule for any new mixins not covered by an existing package rule. + this.addMixinRule("core", true); // TODO: Don't actually allow the user to disable this + this.addMixinRule("feature.measure_time", true); + this.addMixinRule("perf.remove_biome_temperature_cache", true); + this.addMixinRule("perf.resourcepacks", true); + this.addMixinRule("perf.reduce_blockstate_cache_rebuilds", true); + this.addMixinRule("perf.boost_worker_count", true); + this.addMixinRule("perf.skip_first_datapack_reload", true); + this.addMixinRule("perf.parallelize_model_loading", true); + this.addMixinRule("perf.trim_model_caches", true); + this.addMixinRule("bugfix.concurrency", true); + } + + /** + * Defines a Mixin rule which can be configured by users and other mods. + * @throws IllegalStateException If a rule with that name already exists + * @param mixin The name of the mixin package which will be controlled by this rule + * @param enabled True if the rule will be enabled by default, otherwise false + */ + private void addMixinRule(String mixin, boolean enabled) { + String name = getMixinRuleName(mixin); + + if (this.options.putIfAbsent(name, new Option(name, enabled, false)) != null) { + throw new IllegalStateException("Mixin rule already defined: " + mixin); + } + } + + private void readProperties(Properties props) { + for (Map.Entry entry : props.entrySet()) { + String key = (String) entry.getKey(); + String value = (String) entry.getValue(); + + Option option = this.options.get(key); + + if (option == null) { + LOGGER.warn("No configuration key exists with name '{}', ignoring", key); + continue; + } + + boolean enabled; + + if (value.equalsIgnoreCase("true")) { + enabled = true; + } else if (value.equalsIgnoreCase("false")) { + enabled = false; + } else { + LOGGER.warn("Invalid value '{}' encountered for configuration key '{}', ignoring", value, key); + continue; + } + + option.setEnabled(enabled, true); + } + } + + /** + * Returns the effective option for the specified class name. This traverses the package path of the given mixin + * and checks each root for configuration rules. If a configuration rule disables a package, all mixins located in + * that package and its children will be disabled. The effective option is that of the highest-priority rule, either + * a enable rule at the end of the chain or a disable rule at the earliest point in the chain. + * + * @return Null if no options matched the given mixin name, otherwise the effective option for this Mixin + */ + public Option getEffectiveOptionForMixin(String mixinClassName) { + int lastSplit = 0; + int nextSplit; + + Option rule = null; + + while ((nextSplit = mixinClassName.indexOf('.', lastSplit)) != -1) { + String key = getMixinRuleName(mixinClassName.substring(0, nextSplit)); + + Option candidate = this.options.get(key); + + if (candidate != null) { + rule = candidate; + + if (!rule.isEnabled()) { + return rule; + } + } + + lastSplit = nextSplit + 1; + } + + return rule; + } + + /** + * Loads the configuration file from the specified location. If it does not exist, a new configuration file will be + * created. The file on disk will then be updated to include any new options. + */ + public static ModernFixConfig load(File file) { + ModernFixConfig config = new ModernFixConfig(); + Properties props = new Properties(); + if(file.exists()) { + try (FileInputStream fin = new FileInputStream(file)){ + props.load(fin); + } catch (IOException e) { + throw new RuntimeException("Could not load config file", e); + } + config.readProperties(props); + } + + try { + config.writeConfig(file, props); + } catch (IOException e) { + LOGGER.warn("Could not write configuration file", e); + } + + return config; + } + + private void writeConfig(File file, Properties props) throws IOException { + File dir = file.getParentFile(); + + if (!dir.exists()) { + if (!dir.mkdirs()) { + throw new IOException("Could not create parent directories"); + } + } else if (!dir.isDirectory()) { + throw new IOException("The parent file is not a directory"); + } + + try (Writer writer = new FileWriter(file)) { + writer.write("# This is the configuration file for ModernFix.\n"); + writer.write("#\n"); + writer.write("# The following options are enabled by default and should only be disabled if there is a.\n"); + writer.write("# compatibility issue. Add a line mixin.example_name=false without the # sign to disable a rule.\n"); + List lines = this.options.keySet().stream() + .filter(key -> !key.equals("mixin.core")) + .sorted() + .map(key -> "# " + key + "\n") + .collect(Collectors.toList()); + for(String line : lines) { + writer.write(line); + } + for (Map.Entry entry : props.entrySet()) { + String key = (String) entry.getKey(); + String value = (String) entry.getValue(); + writer.write(key + "=" + value + "\n"); + } + } + } + + private static String getMixinRuleName(String name) { + return "mixin." + name; + } + + public int getOptionCount() { + return this.options.size(); + } + + public int getOptionOverrideCount() { + return (int) this.options.values() + .stream() + .filter(Option::isOverridden) + .count(); + } +} diff --git a/src/main/java/org/embeddedt/modernfix/core/config/Option.java b/src/main/java/org/embeddedt/modernfix/core/config/Option.java new file mode 100644 index 00000000..e268ff29 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/core/config/Option.java @@ -0,0 +1,63 @@ +package org.embeddedt.modernfix.core.config; + +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.Set; + +public class Option { + private final String name; + + private Set modDefined = null; + private boolean enabled; + private boolean userDefined; + + public Option(String name, boolean enabled, boolean userDefined) { + this.name = name; + this.enabled = enabled; + this.userDefined = userDefined; + } + + public void setEnabled(boolean enabled, boolean userDefined) { + this.enabled = enabled; + this.userDefined = userDefined; + } + + public void addModOverride(boolean enabled, String modId) { + this.enabled = enabled; + + if (this.modDefined == null) { + this.modDefined = new LinkedHashSet<>(); + } + + this.modDefined.add(modId); + } + + public boolean isEnabled() { + return this.enabled; + } + + public boolean isOverridden() { + return this.isUserDefined() || this.isModDefined(); + } + + public boolean isUserDefined() { + return this.userDefined; + } + + public boolean isModDefined() { + return this.modDefined != null; + } + + public String getName() { + return this.name; + } + + public void clearModsDefiningValue() { + this.modDefined = null; + } + + public Collection getDefiningMods() { + return this.modDefined != null ? Collections.unmodifiableCollection(this.modDefined) : Collections.emptyList(); + } +} \ No newline at end of file diff --git a/src/main/java/org/embeddedt/modernfix/mixin/RenderTypeMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/bugfix/concurrency/RenderTypeMixin.java similarity index 94% rename from src/main/java/org/embeddedt/modernfix/mixin/RenderTypeMixin.java rename to src/main/java/org/embeddedt/modernfix/mixin/bugfix/concurrency/RenderTypeMixin.java index 7d25d2b2..16054830 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/RenderTypeMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/bugfix/concurrency/RenderTypeMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin; +package org.embeddedt.modernfix.mixin.bugfix.concurrency; import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/MinecraftMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/MinecraftMixin.java new file mode 100644 index 00000000..fc9b7f38 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/feature/measure_time/MinecraftMixin.java @@ -0,0 +1,39 @@ +package org.embeddedt.modernfix.mixin.feature.measure_time; + +import com.mojang.datafixers.util.Function4; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.IResourceManager; +import net.minecraft.util.datafix.codec.DatapackCodec; +import net.minecraft.util.registry.DynamicRegistries; +import net.minecraft.world.storage.IServerConfiguration; +import net.minecraft.world.storage.SaveFormat; +import org.embeddedt.modernfix.ModernFix; +import org.embeddedt.modernfix.ModernFixClient; +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.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.function.Function; + +@Mixin(Minecraft.class) +public class MinecraftMixin { + private long datapackReloadStartTime; + + @Inject(method = "makeServerStem", at = @At(value = "HEAD")) + private void recordReloadStart(DynamicRegistries.Impl p_238189_1_, Function p_238189_2_, Function4 p_238189_3_, boolean p_238189_4_, SaveFormat.LevelSave p_238189_5_, CallbackInfoReturnable cir) { + datapackReloadStartTime = System.nanoTime(); + } + + @Inject(method = "makeServerStem", at = @At(value = "RETURN")) + private void recordReloadEnd(DynamicRegistries.Impl p_238189_1_, Function p_238189_2_, Function4 p_238189_3_, boolean p_238189_4_, SaveFormat.LevelSave p_238189_5_, CallbackInfoReturnable cir) { + float timeSpentReloading = ((float)(System.nanoTime() - datapackReloadStartTime) / 1000000000f); + ModernFix.LOGGER.warn("Datapack reload took " + timeSpentReloading + " seconds."); + } + + @Inject(method = "loadWorld(Ljava/lang/String;Lnet/minecraft/util/registry/DynamicRegistries$Impl;Ljava/util/function/Function;Lcom/mojang/datafixers/util/Function4;ZLnet/minecraft/client/Minecraft$WorldSelectionType;Z)V", at = @At("HEAD"), remap = false) + private void recordWorldLoadStart(String worldName, DynamicRegistries.Impl dynamicRegistries, Function levelSaveToDatapackFunction, Function4 quadFunction, boolean vanillaOnly, Minecraft.WorldSelectionType selectionType, boolean creating, CallbackInfo ci) { + ModernFixClient.worldLoadStartTime = System.nanoTime(); + } +} diff --git a/src/main/java/org/embeddedt/modernfix/mixin/UtilMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/boost_worker_count/UtilMixin.java similarity index 93% rename from src/main/java/org/embeddedt/modernfix/mixin/UtilMixin.java rename to src/main/java/org/embeddedt/modernfix/mixin/perf/boost_worker_count/UtilMixin.java index 35818447..e3bdce58 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/UtilMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/boost_worker_count/UtilMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin; +package org.embeddedt.modernfix.mixin.perf.boost_worker_count; import net.minecraft.util.Util; import org.embeddedt.modernfix.ModernFix; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/ModelBakeryMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/parallelize_model_loading/ModelBakeryMixin.java similarity index 93% rename from src/main/java/org/embeddedt/modernfix/mixin/ModelBakeryMixin.java rename to src/main/java/org/embeddedt/modernfix/mixin/perf/parallelize_model_loading/ModelBakeryMixin.java index c1c21359..1be6306d 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/ModelBakeryMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/parallelize_model_loading/ModelBakeryMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin; +package org.embeddedt.modernfix.mixin.perf.parallelize_model_loading; import com.google.common.base.Stopwatch; import com.google.common.collect.Sets; @@ -43,11 +43,6 @@ public abstract class ModelBakeryMixin { @Shadow public abstract IUnbakedModel getModel(ResourceLocation modelLocation); - @Shadow @Final public static BlockModel GENERATION_MARKER; - @Shadow @Final private static ItemModelGenerator ITEM_MODEL_GENERATOR; - @Shadow @Nullable private SpriteMap atlasSet; - @Shadow @Final private Map, IBakedModel> bakedCache; - @Shadow @Final private Map bakedTopLevelModels; @Shadow @Final private Map topLevelModels; private Map deserializedModelCache = null; private boolean useModelCache = false; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/AbstractBlockStateMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/reduce_blockstate_cache_rebuilds/AbstractBlockStateMixin.java similarity index 86% rename from src/main/java/org/embeddedt/modernfix/mixin/AbstractBlockStateMixin.java rename to src/main/java/org/embeddedt/modernfix/mixin/perf/reduce_blockstate_cache_rebuilds/AbstractBlockStateMixin.java index 5832ab59..947e59c0 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/AbstractBlockStateMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/reduce_blockstate_cache_rebuilds/AbstractBlockStateMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin; +package org.embeddedt.modernfix.mixin.perf.reduce_blockstate_cache_rebuilds; import net.minecraft.block.AbstractBlock; import org.embeddedt.modernfix.duck.IBlockState; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/BlockCallbacksMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/reduce_blockstate_cache_rebuilds/BlockCallbacksMixin.java similarity index 92% rename from src/main/java/org/embeddedt/modernfix/mixin/BlockCallbacksMixin.java rename to src/main/java/org/embeddedt/modernfix/mixin/perf/reduce_blockstate_cache_rebuilds/BlockCallbacksMixin.java index f7495442..b3af7950 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/BlockCallbacksMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/reduce_blockstate_cache_rebuilds/BlockCallbacksMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin; +package org.embeddedt.modernfix.mixin.perf.reduce_blockstate_cache_rebuilds; import net.minecraft.block.BlockState; import org.embeddedt.modernfix.ModernFix; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/GameDataMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/reduce_blockstate_cache_rebuilds/GameDataMixin.java similarity index 97% rename from src/main/java/org/embeddedt/modernfix/mixin/GameDataMixin.java rename to src/main/java/org/embeddedt/modernfix/mixin/perf/reduce_blockstate_cache_rebuilds/GameDataMixin.java index 73bca975..71cb50d0 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/GameDataMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/reduce_blockstate_cache_rebuilds/GameDataMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin; +package org.embeddedt.modernfix.mixin.perf.reduce_blockstate_cache_rebuilds; import com.google.common.collect.Multimap; import net.minecraft.util.ResourceLocation; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/BiomeMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/remove_biome_temperature_cache/BiomeMixin.java similarity index 89% rename from src/main/java/org/embeddedt/modernfix/mixin/BiomeMixin.java rename to src/main/java/org/embeddedt/modernfix/mixin/perf/remove_biome_temperature_cache/BiomeMixin.java index 74012c44..bab747ad 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/BiomeMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/remove_biome_temperature_cache/BiomeMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin; +package org.embeddedt.modernfix.mixin.perf.remove_biome_temperature_cache; import net.minecraft.util.math.BlockPos; import net.minecraft.world.biome.Biome; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/ModFileResourcePackMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/resourcepacks/ModFileResourcePackMixin.java similarity index 99% rename from src/main/java/org/embeddedt/modernfix/mixin/ModFileResourcePackMixin.java rename to src/main/java/org/embeddedt/modernfix/mixin/perf/resourcepacks/ModFileResourcePackMixin.java index 19a596d1..33fcc98a 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/ModFileResourcePackMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/resourcepacks/ModFileResourcePackMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin; +package org.embeddedt.modernfix.mixin.perf.resourcepacks; import com.google.common.base.Joiner; import net.minecraft.resources.ResourcePackType; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/VanillaPackMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/resourcepacks/VanillaPackMixin.java similarity index 98% rename from src/main/java/org/embeddedt/modernfix/mixin/VanillaPackMixin.java rename to src/main/java/org/embeddedt/modernfix/mixin/perf/resourcepacks/VanillaPackMixin.java index d9f0e1ed..8d0eae75 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/VanillaPackMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/resourcepacks/VanillaPackMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin; +package org.embeddedt.modernfix.mixin.perf.resourcepacks; import com.google.common.base.Joiner; import com.google.common.cache.CacheBuilder; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/LevelSaveMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/skip_first_datapack_reload/LevelSaveMixin.java similarity index 95% rename from src/main/java/org/embeddedt/modernfix/mixin/LevelSaveMixin.java rename to src/main/java/org/embeddedt/modernfix/mixin/perf/skip_first_datapack_reload/LevelSaveMixin.java index b68dec79..873f8bf4 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/LevelSaveMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/skip_first_datapack_reload/LevelSaveMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin; +package org.embeddedt.modernfix.mixin.perf.skip_first_datapack_reload; import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundNBT; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/MinecraftMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/skip_first_datapack_reload/MinecraftMixin.java similarity index 64% rename from src/main/java/org/embeddedt/modernfix/mixin/MinecraftMixin.java rename to src/main/java/org/embeddedt/modernfix/mixin/perf/skip_first_datapack_reload/MinecraftMixin.java index 31208e3c..8df9315e 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/MinecraftMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/skip_first_datapack_reload/MinecraftMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin; +package org.embeddedt.modernfix.mixin.perf.skip_first_datapack_reload; import com.mojang.datafixers.util.Function4; import net.minecraft.client.Minecraft; @@ -25,24 +25,6 @@ import java.util.function.Function; public abstract class MinecraftMixin { @Shadow public abstract Minecraft.PackManager makeServerStem(DynamicRegistries.Impl dynamicRegistries, Function worldStorageToDatapackFunction, Function4 quadFunction, boolean vanillaOnly, SaveFormat.LevelSave worldStorage) throws InterruptedException, ExecutionException; - private long datapackReloadStartTime; - private int registryHash; - @Inject(method = "makeServerStem", at = @At(value = "HEAD")) - private void recordReloadStart(DynamicRegistries.Impl p_238189_1_, Function p_238189_2_, Function4 p_238189_3_, boolean p_238189_4_, SaveFormat.LevelSave p_238189_5_, CallbackInfoReturnable cir) { - datapackReloadStartTime = System.nanoTime(); - } - - @Inject(method = "makeServerStem", at = @At(value = "RETURN")) - private void recordReloadEnd(DynamicRegistries.Impl p_238189_1_, Function p_238189_2_, Function4 p_238189_3_, boolean p_238189_4_, SaveFormat.LevelSave p_238189_5_, CallbackInfoReturnable cir) { - float timeSpentReloading = ((float)(System.nanoTime() - datapackReloadStartTime) / 1000000000f); - ModernFix.LOGGER.warn("Datapack reload took " + timeSpentReloading + " seconds."); - } - - @Inject(method = "loadWorld(Ljava/lang/String;Lnet/minecraft/util/registry/DynamicRegistries$Impl;Ljava/util/function/Function;Lcom/mojang/datafixers/util/Function4;ZLnet/minecraft/client/Minecraft$WorldSelectionType;Z)V", at = @At("HEAD"), remap = false) - private void recordWorldLoadStart(String worldName, DynamicRegistries.Impl dynamicRegistries, Function levelSaveToDatapackFunction, Function4 quadFunction, boolean vanillaOnly, Minecraft.WorldSelectionType selectionType, boolean creating, CallbackInfo ci) { - ModernFixClient.worldLoadStartTime = System.nanoTime(); - } - @Redirect(method = "loadLevel(Ljava/lang/String;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/registry/DynamicRegistries;builtin()Lnet/minecraft/util/registry/DynamicRegistries$Impl;")) private DynamicRegistries.Impl useNullRegistry() { return null; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/SaveFormatAccessor.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/skip_first_datapack_reload/SaveFormatAccessor.java similarity index 85% rename from src/main/java/org/embeddedt/modernfix/mixin/SaveFormatAccessor.java rename to src/main/java/org/embeddedt/modernfix/mixin/perf/skip_first_datapack_reload/SaveFormatAccessor.java index bef9b5c8..d66e878e 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/SaveFormatAccessor.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/skip_first_datapack_reload/SaveFormatAccessor.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin; +package org.embeddedt.modernfix.mixin.perf.skip_first_datapack_reload; import com.mojang.datafixers.DataFixer; import net.minecraft.world.storage.SaveFormat; diff --git a/src/main/java/org/embeddedt/modernfix/mixin/ModelManagerMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/trim_model_caches/ModelManagerMixin.java similarity index 96% rename from src/main/java/org/embeddedt/modernfix/mixin/ModelManagerMixin.java rename to src/main/java/org/embeddedt/modernfix/mixin/perf/trim_model_caches/ModelManagerMixin.java index e46b647f..d6145415 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/ModelManagerMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/trim_model_caches/ModelManagerMixin.java @@ -1,4 +1,4 @@ -package org.embeddedt.modernfix.mixin; +package org.embeddedt.modernfix.mixin.perf.trim_model_caches; import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.client.renderer.model.ModelManager; diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index 6930eb79..b1787807 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -2,24 +2,26 @@ "required": true, "minVersion": "0.8", "package": "org.embeddedt.modernfix.mixin", + "plugin": "org.embeddedt.modernfix.core.ModernFixMixinPlugin", "compatibilityLevel": "JAVA_8", "refmap": "modernfix.refmap.json", "mixins": [ - "BiomeMixin", - "ModFileResourcePackMixin", - "VanillaPackMixin", - "LevelSaveMixin", - "SaveFormatAccessor", - "AbstractBlockStateMixin", - "GameDataMixin", - "BlockCallbacksMixin", - "UtilMixin" + "feature.measure_time.MinecraftMixin", + "perf.remove_biome_temperature_cache.BiomeMixin", + "perf.resourcepacks.ModFileResourcePackMixin", + "perf.resourcepacks.VanillaPackMixin", + "perf.skip_first_datapack_reload.LevelSaveMixin", + "perf.skip_first_datapack_reload.SaveFormatAccessor", + "perf.reduce_blockstate_cache_rebuilds.AbstractBlockStateMixin", + "perf.reduce_blockstate_cache_rebuilds.GameDataMixin", + "perf.reduce_blockstate_cache_rebuilds.BlockCallbacksMixin", + "perf.boost_worker_count.UtilMixin" ], "client": [ - "MinecraftMixin", - "RenderTypeMixin", - "ModelBakeryMixin", - "ModelManagerMixin" + "perf.skip_first_datapack_reload.MinecraftMixin", + "bugfix.concurrency.RenderTypeMixin", + "perf.parallelize_model_loading.ModelBakeryMixin", + "perf.trim_model_caches.ModelManagerMixin" ], "injectors": { "defaultRequire": 1