diff --git a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java index 791bc274..7e647e5f 100644 --- a/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java +++ b/fabric/src/main/java/org/embeddedt/modernfix/fabric/mixin/perf/dynamic_resources/ModelBakeryMixin.java @@ -98,6 +98,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { private Cache loadedModels; private HashMap smallLoadingCache = new HashMap<>(); + private Map vanillaUnbakedStorage; private boolean inTextureGatheringPass; @@ -121,11 +122,11 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { .softValues() .build(); // temporarily replace this map to capture models into the small loading cache - Map oldMap = this.unbakedCache; + vanillaUnbakedStorage = this.unbakedCache; this.unbakedCache = new ForwardingMap() { @Override protected Map delegate() { - return oldMap; + return vanillaUnbakedStorage; } @Override @@ -313,6 +314,31 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { ModernFix.LOGGER.info("Early model bake took {}", watch); ModernFix.LOGGER.info("{} unbaked models, {} baked models loaded permanently", this.unbakedCache.size(), this.bakedCache.size()); this.unbakedCache = new LayeredForwardingMap<>(new Map[] { this.unbakedCache, mutableBackingMap }); + // prevent writes from hitting the vanilla map, which prevents GC of models + Map oldVanillaStorage = vanillaUnbakedStorage; + vanillaUnbakedStorage = new ForwardingMap() { + @Override + protected Map delegate() { + return oldVanillaStorage; + } + + @Override + public UnbakedModel put(ResourceLocation key, UnbakedModel value) { + UnbakedModel old = get(key); + if(old != null) + remove(key); + return old; + } + + @Override + public void putAll(Map map) { + + } + + @Override + public void clear() { + } + }; this.bakedTopLevelModels = new DynamicBakedModelProvider((ModelBakery)(Object)this, bakedCache); if(this.bakedMissingModel != null) ((DynamicBakedModelProvider)this.bakedTopLevelModels).setMissingModel(this.bakedMissingModel);