From 5a9c49f8d405502c5c1e50a42cf27a8597e541a0 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 28 Mar 2026 20:02:30 -0400 Subject: [PATCH] Add option to reduce memory usage of entity models --- .../CubeDefinitionMixin.java | 40 +++++++++++++++++++ .../core/config/ModernFixEarlyConfig.java | 9 +++-- 2 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/embeddedt/modernfix/common/mixin/perf/compact_entity_models/CubeDefinitionMixin.java diff --git a/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compact_entity_models/CubeDefinitionMixin.java b/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compact_entity_models/CubeDefinitionMixin.java new file mode 100644 index 00000000..29ee0411 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compact_entity_models/CubeDefinitionMixin.java @@ -0,0 +1,40 @@ +package org.embeddedt.modernfix.common.mixin.perf.compact_entity_models; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.builders.CubeDefinition; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.List; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +@Mixin(CubeDefinition.class) +@ClientOnlyMixin +public class CubeDefinitionMixin { + @Unique + private static final ConcurrentHashMap, ModelPart.Cube> MFIX_CUBE_CACHE = new ConcurrentHashMap<>(); + + /** + * @author embeddedt + * @reason deduplicate creation of Cube objects + */ + @WrapOperation(method = "bake", at = @At(value = "NEW", target = "(IIFFFFFFFFFZFFLjava/util/Set;)Lnet/minecraft/client/model/geom/ModelPart$Cube;")) + private ModelPart.Cube modernfix$deduplicateCube(int texCoordU, int texCoordV, float originX, float originY, float originZ, + float dimensionX, float dimensionY, float dimensionZ, float gtowX, + float growY, float growZ, boolean mirror, float texScaleU, + float texScaleV, Set visibleFaces, + Operation original) { + List cacheKey = List.of(texCoordU, texCoordV, originX, originY, originZ, dimensionX, dimensionY, dimensionZ, gtowX, growY, growZ, mirror, texScaleU, texScaleV, visibleFaces); + var cube = MFIX_CUBE_CACHE.get(cacheKey); + if (cube == null) { + cube = original.call((Object[])cacheKey.toArray()); + MFIX_CUBE_CACHE.put(cacheKey, cube); + } + return cube; + } +} 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 1b31f3b5..6b8473e5 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -174,15 +174,12 @@ public class ModernFixEarlyConfig { .put("mixin.feature.blockentity_incorrect_thread", false) .put("mixin.perf.clear_mixin_classinfo", false) .put("mixin.perf.deduplicate_climate_parameters", false) - .put("mixin.perf.faster_capabilities.bytecode_analysis", false) .put("mixin.bugfix.packet_leak", false) .put("mixin.perf.deduplicate_location", false) .put("mixin.perf.dynamic_entity_renderers", false) .put("mixin.feature.integrated_server_watchdog", true) .put("mixin.perf.faster_item_rendering", false) - .put("mixin.perf.ingredient_item_deduplication", false) .put("mixin.feature.spam_thread_dump", false) - .put("mixin.feature.disable_unihex_font", false) .put("mixin.feature.remove_chat_signing", false) .put("mixin.bugfix.skip_redundant_saves", false) .put("mixin.feature.snapshot_easter_egg", true) @@ -195,7 +192,11 @@ public class ModernFixEarlyConfig { .putConditionally(() -> !isFabric, "mixin.bugfix.fix_config_crashes", true) .putConditionally(() -> !isFabric, "mixin.bugfix.forge_at_inject_error", true) .putConditionally(() -> !isFabric, "mixin.feature.registry_event_progress", false) - .putConditionally(() -> isFabric, "mixin.perf.clear_fabric_mapping_tables", false) + // Beta (promote on next release) + .put("mixin.perf.compact_entity_models", false) + .put("mixin.perf.faster_capabilities.bytecode_analysis", false) + .put("mixin.perf.ingredient_item_deduplication", false) + // END .build(); private ModernFixEarlyConfig(File file) {