From d407c928958ff7c65ac1277c325f0c4d987ba709 Mon Sep 17 00:00:00 2001 From: Steveplays28 Date: Sun, 12 Nov 2023 16:08:29 +0100 Subject: [PATCH] feat: Add micro-opimisation for populating biomes in chunk sections This optimisations swaps the order of the Y and Z axis `fori` loops. This is taken from [Rho](https://github.com/jaskarth/rho/blob/main/src/main/java/supercoder79/rho/mixin/MixinNoiseChunkGenerator.java). --- .../noisium/mixin/ChunkSectionMixin.java | 41 +++++++++++++++++++ src/main/resources/noisium.mixins.json | 1 + 2 files changed, 42 insertions(+) create mode 100644 src/main/java/io/github/steveplays28/noisium/mixin/ChunkSectionMixin.java diff --git a/src/main/java/io/github/steveplays28/noisium/mixin/ChunkSectionMixin.java b/src/main/java/io/github/steveplays28/noisium/mixin/ChunkSectionMixin.java new file mode 100644 index 0000000..c41e37e --- /dev/null +++ b/src/main/java/io/github/steveplays28/noisium/mixin/ChunkSectionMixin.java @@ -0,0 +1,41 @@ +package io.github.steveplays28.noisium.mixin; + +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.source.BiomeSupplier; +import net.minecraft.world.biome.source.util.MultiNoiseUtil; +import net.minecraft.world.chunk.ChunkSection; +import net.minecraft.world.chunk.PalettedContainer; +import net.minecraft.world.chunk.ReadableContainer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; + +@Mixin(ChunkSection.class) +public class ChunkSectionMixin { + @Unique + private static final int sliceSize = 4; + + @Shadow + private ReadableContainer> biomeContainer; + + /** + * @author Steveplays28 + * @reason Axis order micro-optimisation + */ + @Overwrite + public void populateBiomes(BiomeSupplier biomeSupplier, MultiNoiseUtil.MultiNoiseSampler sampler, int x, int y, int z) { + PalettedContainer> palettedContainer = this.biomeContainer.slice(); + + for (int posX = 0; posX < sliceSize; ++posX) { + for (int posZ = 0; posZ < sliceSize; ++posZ) { + for (int posY = 0; posY < sliceSize; ++posY) { + palettedContainer.swapUnsafe(posX, posY, posZ, biomeSupplier.getBiome(x + posX, y + posY, z + posZ, sampler)); + } + } + } + + this.biomeContainer = palettedContainer; + } +} diff --git a/src/main/resources/noisium.mixins.json b/src/main/resources/noisium.mixins.json index be96a35..a72cad8 100644 --- a/src/main/resources/noisium.mixins.json +++ b/src/main/resources/noisium.mixins.json @@ -5,6 +5,7 @@ "compatibilityLevel": "JAVA_17", "mixins": [ "ChainedBlockSourceMixin", + "ChunkSectionMixin", "NoiseChunkGeneratorMixin" ], "client": [