From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: nostalgic853 Date: Tue, 25 Oct 2022 00:28:35 +0800 Subject: [PATCH] Carpet-Fixes: Optimized getBiome method Original license: MIT Original project: https://github.com/fxmorin/carpet-fixes Optimized the getBiome call to be 25% - 75% faster This is a fully vanilla optimization. diff --git a/net/minecraft/world/level/biome/BiomeManager.java b/net/minecraft/world/level/biome/BiomeManager.java index 73962e79a0f3d892e3155443a1b84508b0f4042e..a48175a7ebb1788ace46395621ed78d910178a53 100644 --- a/net/minecraft/world/level/biome/BiomeManager.java +++ b/net/minecraft/world/level/biome/BiomeManager.java @@ -14,6 +14,7 @@ public class BiomeManager { private static final int ZOOM_MASK = 3; private final BiomeManager.NoiseBiomeSource noiseBiomeSource; private final long biomeZoomSeed; + private static final double maxOffset = 0.4500000001D; // Leaf - Carpet-Fixes - Optimized getBiome method public BiomeManager(BiomeManager.NoiseBiomeSource noiseBiomeSource, long biomeZoomSeed) { this.noiseBiomeSource = noiseBiomeSource; @@ -29,39 +30,67 @@ public class BiomeManager { } public Holder getBiome(BlockPos pos) { - int i = pos.getX() - 2; - int i1 = pos.getY() - 2; - int i2 = pos.getZ() - 2; - int i3 = i >> 2; - int i4 = i1 >> 2; - int i5 = i2 >> 2; - double d = (i & 3) / 4.0; - double d1 = (i1 & 3) / 4.0; - double d2 = (i2 & 3) / 4.0; - int i6 = 0; - double d3 = Double.POSITIVE_INFINITY; + // Leaf start - Carpet-Fixes - Optimized getBiome method + int xMinus2 = pos.getX() - 2; + int yMinus2 = pos.getY() - 2; + int zMinus2 = pos.getZ() - 2; + int x = xMinus2 >> 2; // BlockPos to BiomePos + int y = yMinus2 >> 2; + int z = zMinus2 >> 2; + double quartX = (double) (xMinus2 & 3) / 4.0; // quartLocal divided by 4 + double quartY = (double) (yMinus2 & 3) / 4.0; // 0/4, 1/4, 2/4, 3/4 + double quartZ = (double) (zMinus2 & 3) / 4.0; // [0, 0.25, 0.5, 0.75] + int smallestX = 0; + double smallestDist = Double.POSITIVE_INFINITY; + for (int biomeX = 0; biomeX < 8; ++biomeX) { + boolean everyOtherQuad = (biomeX & 4) == 0; // 1 1 1 1 0 0 0 0 + boolean everyOtherPair = (biomeX & 2) == 0; // 1 1 0 0 1 1 0 0 + boolean everyOther = (biomeX & 1) == 0; // 1 0 1 0 1 0 1 0 + double quartXX = everyOtherQuad ? quartX : quartX - 1.0; //[-1.0,-0.75,-0.5,-0.25,0.0,0.25,0.5,0.75] + double quartYY = everyOtherPair ? quartY : quartY - 1.0; + double quartZZ = everyOther ? quartZ : quartZ - 1.0; - for (int i7 = 0; i7 < 8; i7++) { - boolean flag = (i7 & 4) == 0; - boolean flag1 = (i7 & 2) == 0; - boolean flag2 = (i7 & 1) == 0; - int i8 = flag ? i3 : i3 + 1; - int i9 = flag1 ? i4 : i4 + 1; - int i10 = flag2 ? i5 : i5 + 1; - double d4 = flag ? d : d - 1.0; - double d5 = flag1 ? d1 : d1 - 1.0; - double d6 = flag2 ? d2 : d2 - 1.0; - double fiddledDistance = getFiddledDistance(this.biomeZoomSeed, i8, i9, i10, d4, d5, d6); - if (d3 > fiddledDistance) { - i6 = i7; - d3 = fiddledDistance; + //This code block is new + double maxQuartYY = 0.0, maxQuartZZ = 0.0; + if (biomeX != 0) { + maxQuartYY = Mth.square(Math.max(quartYY + maxOffset, Math.abs(quartYY - maxOffset))); + maxQuartZZ = Mth.square(Math.max(quartZZ + maxOffset, Math.abs(quartZZ - maxOffset))); + double maxQuartXX = Mth.square(Math.max(quartXX + maxOffset, Math.abs(quartXX - maxOffset))); + if (smallestDist < maxQuartXX + maxQuartYY + maxQuartZZ) continue; } - } + int xx = everyOtherQuad ? x : x + 1; + int yy = everyOtherPair ? y : y + 1; + int zz = everyOther ? z : z + 1; + + //I transferred the code from method_38106 to here, so I could call continue halfway through + long seed = LinearCongruentialGenerator.next(this.biomeZoomSeed, xx); + seed = LinearCongruentialGenerator.next(seed, yy); + seed = LinearCongruentialGenerator.next(seed, zz); + seed = LinearCongruentialGenerator.next(seed, xx); + seed = LinearCongruentialGenerator.next(seed, yy); + seed = LinearCongruentialGenerator.next(seed, zz); + double offsetX = getFiddle(seed); + double sqrX = Mth.square(quartXX + offsetX); + if (biomeX != 0 && smallestDist < sqrX + maxQuartYY + maxQuartZZ) continue; //skip the rest of the loop + seed = LinearCongruentialGenerator.next(seed, this.biomeZoomSeed); + double offsetY = getFiddle(seed); + double sqrY = Mth.square(quartYY + offsetY); + if (biomeX != 0 && smallestDist < sqrX + sqrY + maxQuartZZ) continue; // skip the rest of the loop + seed = LinearCongruentialGenerator.next(seed, this.biomeZoomSeed); + double offsetZ = getFiddle(seed); + double biomeDist = sqrX + sqrY + Mth.square(quartZZ + offsetZ); - int i7x = (i6 & 4) == 0 ? i3 : i3 + 1; - int i11 = (i6 & 2) == 0 ? i4 : i4 + 1; - int i12 = (i6 & 1) == 0 ? i5 : i5 + 1; - return this.noiseBiomeSource.getNoiseBiome(i7x, i11, i12); + if (smallestDist > biomeDist) { + smallestX = biomeX; + smallestDist = biomeDist; + } + } + return this.noiseBiomeSource.getNoiseBiome( + (smallestX & 4) == 0 ? x : x + 1, + (smallestX & 2) == 0 ? y : y + 1, + (smallestX & 1) == 0 ? z : z + 1 + ); + // Leaf end - Carpet-Fixes - Optimized getBiome method } public Holder getNoiseBiomeAtPosition(double x, double y, double z) {