From 596159a81d8b128c9783640e5a8a6bd08d0b68de Mon Sep 17 00:00:00 2001 From: Voidsong Dragonfly Date: Sat, 19 Jul 2025 21:28:29 -0400 Subject: [PATCH] Initial implementation of removal of unnecessary surface rule caching --- .../SurfaceRulesMixin.java | 147 ++++++++++++++++++ .../main/resources/modernfix.accesswidener | 24 ++- 2 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/worldgen_allocation/SurfaceRulesMixin.java diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/worldgen_allocation/SurfaceRulesMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/worldgen_allocation/SurfaceRulesMixin.java new file mode 100644 index 00000000..6bb9d16d --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/worldgen_allocation/SurfaceRulesMixin.java @@ -0,0 +1,147 @@ +package org.embeddedt.modernfix.common.mixin.perf.worldgen_allocation; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.PositionalRandomFactory; +import net.minecraft.world.level.levelgen.SurfaceRules; +import net.minecraft.world.level.levelgen.VerticalAnchor; +import net.minecraft.world.level.levelgen.placement.CaveSurface; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.function.Predicate; + +@Mixin(SurfaceRules.class) +public class SurfaceRulesMixin { + @Mixin(value = SurfaceRules.BiomeConditionSource.class, priority = 100) + public static final class BiomeConditionSource { + @Final + @Shadow + Predicate> biomeNameTest; + /** + * @author VoidsongDragonfly + * @reason Replacing Vanilla's use of {@link SurfaceRules.LazyYCondition LazyYCondition} that causes performance detriments due to unused caching behavior + */ + @Overwrite + public SurfaceRules.Condition apply(final SurfaceRules.Context pContext) { + class BiomeCondition implements SurfaceRules.Condition { + @Override + public boolean test() { + return pContext.biome.get().is(biomeNameTest); + } + } + + return new BiomeCondition(); + } + } + + @Mixin(value = SurfaceRules.StoneDepthCheck.class, priority = 100) + public record StoneDepthCheck(int offset, boolean addSurfaceDepth, int secondaryDepthRange, CaveSurface surfaceType) { + /** + * @author VoidsongDragonfly + * @reason Replacing Vanilla's use of {@link SurfaceRules.LazyYCondition LazyYCondition} that causes performance detriments due to unused caching behavior + */ + @Overwrite + public SurfaceRules.Condition apply(final SurfaceRules.Context pContext) { + // Copied Vanilla variables + final boolean flag = this.surfaceType == CaveSurface.CEILING; + + class StoneDepthCondition implements SurfaceRules.Condition { + @Override + public boolean test() { + int i = flag ? pContext.stoneDepthBelow : pContext.stoneDepthAbove; + int j = addSurfaceDepth ? pContext.surfaceDepth : 0; + int k = secondaryDepthRange == 0 + ? 0 + : (int) Mth.map(pContext.getSurfaceSecondary(), -1.0, 1.0, 0.0, secondaryDepthRange); + return i <= 1 + offset + j + k; + } + } + + return new StoneDepthCondition(); + } + } + + @Mixin(value = SurfaceRules.VerticalGradientConditionSource.class, priority = 100) + public record VerticalGradientConditionSource(ResourceLocation randomName, VerticalAnchor trueAtAndBelow, VerticalAnchor falseAtAndAbove) { + /** + * @author VoidsongDragonfly + * @reason Replacing Vanilla's use of {@link SurfaceRules.LazyYCondition LazyYCondition} that causes performance detriments due to unused caching behavior + */ + @Overwrite + public SurfaceRules.Condition apply(final SurfaceRules.Context pContext) { + // Copied Vanilla variables + final int i = this.trueAtAndBelow().resolveY(pContext.context); + final int j = this.falseAtAndAbove().resolveY(pContext.context); + final PositionalRandomFactory positionalrandomfactory = pContext.randomState.getOrCreateRandomFactory(this.randomName()); + + class VerticalGradientCondition implements SurfaceRules.Condition { + @Override + public boolean test() { + int k = pContext.blockY; + if (k <= i) { + return true; + } else if (k >= j) { + return false; + } else { + double d0 = Mth.map(k, i, j, 1.0, 0.0); + RandomSource randomsource = positionalrandomfactory.at(pContext.blockX, k, pContext.blockZ); + return (double)randomsource.nextFloat() < d0; + } + } + } + + return new VerticalGradientCondition(); + } + } + + @Mixin(value = SurfaceRules.WaterConditionSource.class, priority = 100) + public record WaterConditionSource(int offset, int surfaceDepthMultiplier, boolean addStoneDepth) { + /** + * @author VoidsongDragonfly + * @reason Replacing Vanilla's use of {@link SurfaceRules.LazyYCondition LazyYCondition} that causes performance detriments due to unused caching behavior + */ + @Overwrite + public SurfaceRules.Condition apply(final SurfaceRules.Context pContext) { + class WaterCondition implements SurfaceRules.Condition { + @Override + public boolean test() { + return pContext.waterHeight == Integer.MIN_VALUE + || pContext.blockY + (addStoneDepth ? pContext.stoneDepthAbove : 0) + >= pContext.waterHeight + + offset + + pContext.surfaceDepth * surfaceDepthMultiplier; + } + } + + return new WaterCondition(); + } + + } + + @Mixin(value = SurfaceRules.YConditionSource.class, priority = 100) + public record YConditionSource(VerticalAnchor anchor, int surfaceDepthMultiplier, boolean addStoneDepth) { + /** + * @author VoidsongDragonfly + * @reason Replacing Vanilla's use of {@link SurfaceRules.LazyYCondition LazyYCondition} that causes performance detriments due to unused caching behavior + */ + @Overwrite + public SurfaceRules.Condition apply(final SurfaceRules.Context pContext) { + class YCondition implements SurfaceRules.Condition { + @Override + public boolean test() { + return pContext.blockY + (addStoneDepth ? pContext.stoneDepthAbove : 0) + >= anchor.resolveY(pContext.context) + + pContext.surfaceDepth * surfaceDepthMultiplier; + } + } + + return new YCondition(); + } + } +} diff --git a/common/src/main/resources/modernfix.accesswidener b/common/src/main/resources/modernfix.accesswidener index 57322acc..4e2d26e2 100644 --- a/common/src/main/resources/modernfix.accesswidener +++ b/common/src/main/resources/modernfix.accesswidener @@ -11,8 +11,30 @@ accessible field net/minecraft/world/level/Level blockEntityTickers Ljava/util/L accessible class net/minecraft/client/renderer/RenderType$CompositeRenderType accessible method net/minecraft/nbt/CompoundTag (Ljava/util/Map;)V +# Non-context access necessary +accessible class net/minecraft/world/level/levelgen/SurfaceRules$Condition +accessible class net/minecraft/world/level/levelgen/SurfaceRules$LazyYCondition +accessible class net/minecraft/world/level/levelgen/SurfaceRules$StoneDepthCheck +accessible class net/minecraft/world/level/levelgen/SurfaceRules$WaterConditionSource +accessible class net/minecraft/world/level/levelgen/SurfaceRules$VerticalGradientConditionSource +accessible class net/minecraft/world/level/levelgen/SurfaceRules$YConditionSource +accessible class net/minecraft/world/level/levelgen/SurfaceRules$BiomeConditionSource accessible class net/minecraft/world/level/levelgen/SurfaceRules$SequenceRule accessible class net/minecraft/world/level/levelgen/SurfaceRules$SurfaceRule +# Access to allow working with Context +accessible class net/minecraft/world/level/levelgen/SurfaceRules$Context +accessible field net/minecraft/world/level/levelgen/SurfaceRules$Context context Lnet/minecraft/world/level/levelgen/SurfaceRules$Context; +accessible field net/minecraft/world/level/levelgen/SurfaceRules$Context biome Ljava/util/function/Supplier; +accessible field net/minecraft/world/level/levelgen/SurfaceRules$Context blockX I +accessible field net/minecraft/world/level/levelgen/SurfaceRules$Context blockY I +accessible field net/minecraft/world/level/levelgen/SurfaceRules$Context blockZ I +accessible field net/minecraft/world/level/levelgen/SurfaceRules$Context stoneDepthBelow I +accessible field net/minecraft/world/level/levelgen/SurfaceRules$Context randomState Lnet/minecraft/world/level/levelgen/RandomState; +accessible field net/minecraft/world/level/levelgen/SurfaceRules$Context waterHeight I +accessible field net/minecraft/world/level/levelgen/SurfaceRules$Context stoneDepthAbove I +accessible field net/minecraft/world/level/levelgen/SurfaceRules$Context surfaceDepth I +accessible method net/minecraft/world/level/levelgen/SurfaceRules$Context getSurfaceSecondary ()D +# Density function access accessible class net/minecraft/world/level/levelgen/DensityFunctions$Marker accessible class net/minecraft/world/level/levelgen/DensityFunctions$Marker$Type accessible method net/minecraft/world/level/levelgen/DensityFunctions$Marker (Lnet/minecraft/world/level/levelgen/DensityFunctions$Marker$Type;Lnet/minecraft/world/level/levelgen/DensityFunction;)V @@ -69,4 +91,4 @@ accessible class net/minecraft/world/item/crafting/Ingredient$Value accessible field net/minecraft/world/item/crafting/Ingredient$TagValue tag Lnet/minecraft/tags/TagKey; accessible field net/minecraft/world/item/crafting/Ingredient$ItemValue item Lnet/minecraft/world/item/ItemStack; accessible class net/minecraft/world/item/crafting/Ingredient$ItemValue -accessible class net/minecraft/client/searchtree/SearchRegistry$TreeEntry \ No newline at end of file +accessible class net/minecraft/client/searchtree/SearchRegistry$TreeEntry