diff --git a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java index d35ba62e..e35f18db 100644 --- a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java +++ b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java @@ -2,6 +2,7 @@ package org.embeddedt.modernfix.dynamicresources; import com.google.common.collect.ImmutableSet; import com.mojang.math.Transformation; +import it.unimi.dsi.fastutil.objects.Object2ObjectMaps; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.ItemOverrides; @@ -40,7 +41,8 @@ public class DynamicBakedModelProvider implements Map bakedCache; - private final Map permanentOverrides; + private volatile Map permanentOverridesView = null; + private final Map permanentOverridesMutable; private BakedModel missingModel; private static final BakedModel SENTINEL = new BakedModel() { @Override @@ -87,7 +89,7 @@ public class DynamicBakedModelProvider implements Map cache) { this.bakery = bakery; this.bakedCache = cache; - this.permanentOverrides = Collections.synchronizedMap(new Object2ObjectOpenHashMap<>()); + this.permanentOverridesMutable = new Object2ObjectOpenHashMap<>(); if(currentInstance == null) currentInstance = this; } @@ -110,14 +112,27 @@ public class DynamicBakedModelProvider implements Map getPermanentOverrides() { + Map map = permanentOverridesView; + if(map == null) { + synchronized (this) { + map = permanentOverridesView; + if(map == null) { + permanentOverridesView = map = Object2ObjectMaps.unmodifiable(new Object2ObjectOpenHashMap<>(permanentOverridesMutable)); + } + } + } + return map; + } + @Override public boolean containsKey(Object o) { - return permanentOverrides.getOrDefault(o, SENTINEL) != null; + return getPermanentOverrides().getOrDefault(o, SENTINEL) != null; } @Override public boolean containsValue(Object o) { - return permanentOverrides.containsValue(o) || bakedCache.containsValue(o); + return getPermanentOverrides().containsValue(o) || bakedCache.containsValue(o); } private static boolean isVanillaTopLevelModel(ResourceLocation location) { @@ -143,7 +158,7 @@ public class DynamicBakedModelProvider implements Map map) { - permanentOverrides.putAll(map); + synchronized (this) { + permanentOverridesMutable.putAll(map); + permanentOverridesView = null; + } } @Override @@ -213,23 +239,27 @@ public class DynamicBakedModelProvider implements Map function) { - Set overridenLocations = permanentOverrides.keySet(); - permanentOverrides.replaceAll(function); + synchronized (this) { + permanentOverridesMutable.replaceAll(function); + permanentOverridesView = null; + } boolean uvLock = BlockModelRotation.X0_Y0.isUvLocked(); Transformation rotation = BlockModelRotation.X0_Y0.getRotation(); bakedCache.replaceAll((loc, oldModel) -> { - if(loc.transformation() != rotation || loc.isUvLocked() != uvLock || overridenLocations.contains(loc.id())) + if(loc.transformation() != rotation || loc.isUvLocked() != uvLock || getPermanentOverrides().containsKey(loc.id())) return oldModel; else return function.apply(loc.id(), oldModel); diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java index b1d684c2..99f1ebe5 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java @@ -183,8 +183,11 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { } @Redirect(method = "bakeModels", at = @At(value = "INVOKE", target = "Ljava/util/Map;keySet()Ljava/util/Set;")) - private Set skipBakingModels(Map map) { - return Collections.emptySet(); + private Set skipBakingModels(Map instance) { + Set modelSet = new HashSet<>(instance.keySet()); + if(modelSet.size() > 0) + ModernFix.LOGGER.info("Early baking {} models", modelSet.size()); + return modelSet; } /**