diff --git a/patches/server/0088-c2me-optimization.math.patch b/patches/server/0088-c2me-optimization.math.patch index 3ec24f4..847b32b 100644 --- a/patches/server/0088-c2me-optimization.math.patch +++ b/patches/server/0088-c2me-optimization.math.patch @@ -9,7 +9,7 @@ Original code by RelativityMC, licensed under MIT You can find the original code on https://github.com/RelativityMC/C2ME-fabric (Yarn mappings) diff --git a/src/main/java/net/minecraft/world/level/levelgen/synth/ImprovedNoise.java b/src/main/java/net/minecraft/world/level/levelgen/synth/ImprovedNoise.java -index 765b56776e457109ddea9f7dbfd0b17beefee51e..8a9783a15e1bd1a1c82ec221d662f71cd71f8371 100644 +index 765b56776e457109ddea9f7dbfd0b17beefee51e..0b2c02891c240626f2f274c1fc854648801996f4 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/synth/ImprovedNoise.java +++ b/src/main/java/net/minecraft/world/level/levelgen/synth/ImprovedNoise.java @@ -11,6 +11,27 @@ public final class ImprovedNoise { @@ -17,23 +17,23 @@ index 765b56776e457109ddea9f7dbfd0b17beefee51e..8a9783a15e1bd1a1c82ec221d662f71c public final double zo; + // Mirai start - c2me: optimization.math -+ private static final double[][] SIMPLEX_NOISE_GRADIENTS = new double[][]{ -+ {1, 1, 0}, -+ {-1, 1, 0}, -+ {1, -1, 0}, -+ {-1, -1, 0}, -+ {1, 0, 1}, -+ {-1, 0, 1}, -+ {1, 0, -1}, -+ {-1, 0, -1}, -+ {0, 1, 1}, -+ {0, -1, 1}, -+ {0, 1, -1}, -+ {0, -1, -1}, -+ {1, 1, 0}, -+ {0, -1, 1}, -+ {-1, 1, 0}, -+ {0, -1, -1} ++ private static final double[] FLAT_SIMPLEX_GRAD = new double[]{ ++ 1, 1, 0, 0, ++ -1, 1, 0, 0, ++ 1, -1, 0, 0, ++ -1, -1, 0, 0, ++ 1, 0, 1, 0, ++ -1, 0, 1, 0, ++ 1, 0, -1, 0, ++ -1, 0, -1, 0, ++ 0, 1, 1, 0, ++ 0, -1, 1, 0, ++ 0, 1, -1, 0, ++ 0, -1, -1, 0, ++ 1, 1, 0, 0, ++ 0, -1, 1, 0, ++ -1, 1, 0, 0, ++ 0, -1, -1, 0, + }; + // Mirai end + @@ -92,14 +92,14 @@ index 765b56776e457109ddea9f7dbfd0b17beefee51e..8a9783a15e1bd1a1c82ec221d662f71c public double noiseWithDerivative(double x, double y, double z, double[] ds) { double d = x + this.xo; -@@ -84,26 +109,107 @@ public final class ImprovedNoise { +@@ -84,26 +109,75 @@ public final class ImprovedNoise { return this.p[hash & 255] & 255; } + // Mirai start - c2me: optimization.math + /** + * @author ishland -+ * @reason inline Mth & small optimization: remove frequent type conversions and redundant ops ++ * @reason inline math & small optimization: remove frequent type conversions and redundant ops + */ private double sampleAndLerp(int sectionX, int sectionY, int sectionZ, double localX, double localY, double localZ, double fadeLocalX) { - int i = this.p(sectionX); @@ -120,7 +120,7 @@ index 765b56776e457109ddea9f7dbfd0b17beefee51e..8a9783a15e1bd1a1c82ec221d662f71c - double s = Mth.smoothstep(fadeLocalX); - double t = Mth.smoothstep(localZ); - return Mth.lerp3(r, s, t, d, e, f, g, h, o, p, q); -+ // TODO [VanillaCopy] but inlined ++ // TODO [VanillaCopy] but optimized + final int var0 = sectionX & 0xFF; + final int var1 = (sectionX + 1) & 0xFF; + final int var2 = this.p[var0] & 0xFF; @@ -142,57 +142,25 @@ index 765b56776e457109ddea9f7dbfd0b17beefee51e..8a9783a15e1bd1a1c82ec221d662f71c + final int var17 = (var10 + sectionZ + 1) & 0xFF; + final int var18 = (var9 + sectionZ + 1) & 0xFF; + final int var19 = (var11 + sectionZ + 1) & 0xFF; -+ final int var20 = this.p[var12] & 15; -+ final int var21 = this.p[var13] & 15; -+ final int var22 = this.p[var14] & 15; -+ final int var23 = this.p[var15] & 15; -+ final int var24 = this.p[var16] & 15; -+ final int var25 = this.p[var17] & 15; -+ final int var26 = this.p[var18] & 15; -+ final int var27 = this.p[var19] & 15; -+ final double[] var28 = SIMPLEX_NOISE_GRADIENTS[var20]; -+ final double[] var29 = SIMPLEX_NOISE_GRADIENTS[var21]; -+ final double[] var30 = SIMPLEX_NOISE_GRADIENTS[var22]; -+ final double[] var31 = SIMPLEX_NOISE_GRADIENTS[var23]; -+ final double[] var32 = SIMPLEX_NOISE_GRADIENTS[var24]; -+ final double[] var33 = SIMPLEX_NOISE_GRADIENTS[var25]; -+ final double[] var34 = SIMPLEX_NOISE_GRADIENTS[var26]; -+ final double[] var35 = SIMPLEX_NOISE_GRADIENTS[var27]; -+ final double var36 = var28[0]; -+ final double var37 = var28[1]; -+ final double var38 = var28[2]; -+ final double var39 = var29[0]; -+ final double var40 = var29[1]; -+ final double var41 = var29[2]; -+ final double var42 = var30[0]; -+ final double var43 = var30[1]; -+ final double var44 = var30[2]; -+ final double var45 = var31[0]; -+ final double var46 = var31[1]; -+ final double var47 = var31[2]; -+ final double var48 = var32[0]; -+ final double var49 = var32[1]; -+ final double var50 = var32[2]; -+ final double var51 = var33[0]; -+ final double var52 = var33[1]; -+ final double var53 = var33[2]; -+ final double var54 = var34[0]; -+ final double var55 = var34[1]; -+ final double var56 = var34[2]; -+ final double var57 = var35[0]; -+ final double var58 = var35[1]; -+ final double var59 = var35[2]; ++ final int var20 = (this.p[var12] & 15) << 2; ++ final int var21 = (this.p[var13] & 15) << 2; ++ final int var22 = (this.p[var14] & 15) << 2; ++ final int var23 = (this.p[var15] & 15) << 2; ++ final int var24 = (this.p[var16] & 15) << 2; ++ final int var25 = (this.p[var17] & 15) << 2; ++ final int var26 = (this.p[var18] & 15) << 2; ++ final int var27 = (this.p[var19] & 15) << 2; + final double var60 = localX - 1.0; + final double var61 = localY - 1.0; + final double var62 = localZ - 1.0; -+ final double var87 = var36 * localX + var37 * localY + var38 * localZ; -+ final double var88 = var39 * var60 + var40 * localY + var41 * localZ; -+ final double var89 = var42 * localX + var43 * var61 + var44 * localZ; -+ final double var90 = var45 * var60 + var46 * var61 + var47 * localZ; -+ final double var91 = var48 * localX + var49 * localY + var50 * var62; -+ final double var92 = var51 * var60 + var52 * localY + var53 * var62; -+ final double var93 = var54 * localX + var55 * var61 + var56 * var62; -+ final double var94 = var57 * var60 + var58 * var61 + var59 * var62; ++ final double var87 = FLAT_SIMPLEX_GRAD[(var20) | 0] * localX + FLAT_SIMPLEX_GRAD[(var20) | 1] * localY + FLAT_SIMPLEX_GRAD[(var20) | 2] * localZ; ++ final double var88 = FLAT_SIMPLEX_GRAD[(var21) | 0] * var60 + FLAT_SIMPLEX_GRAD[(var21) | 1] * localY + FLAT_SIMPLEX_GRAD[(var21) | 2] * localZ; ++ final double var89 = FLAT_SIMPLEX_GRAD[(var22) | 0] * localX + FLAT_SIMPLEX_GRAD[(var22) | 1] * var61 + FLAT_SIMPLEX_GRAD[(var22) | 2] * localZ; ++ final double var90 = FLAT_SIMPLEX_GRAD[(var23) | 0] * var60 + FLAT_SIMPLEX_GRAD[(var23) | 1] * var61 + FLAT_SIMPLEX_GRAD[(var23) | 2] * localZ; ++ final double var91 = FLAT_SIMPLEX_GRAD[(var24) | 0] * localX + FLAT_SIMPLEX_GRAD[(var24) | 1] * localY + FLAT_SIMPLEX_GRAD[(var24) | 2] * var62; ++ final double var92 = FLAT_SIMPLEX_GRAD[(var25) | 0] * var60 + FLAT_SIMPLEX_GRAD[(var25) | 1] * localY + FLAT_SIMPLEX_GRAD[(var25) | 2] * var62; ++ final double var93 = FLAT_SIMPLEX_GRAD[(var26) | 0] * localX + FLAT_SIMPLEX_GRAD[(var26) | 1] * var61 + FLAT_SIMPLEX_GRAD[(var26) | 2] * var62; ++ final double var94 = FLAT_SIMPLEX_GRAD[(var27) | 0] * var60 + FLAT_SIMPLEX_GRAD[(var27) | 1] * var61 + FLAT_SIMPLEX_GRAD[(var27) | 2] * var62; + + final double var95 = localX * 6.0 - 15.0; + final double var96 = fadeLocalX * 6.0 - 15.0; @@ -219,10 +187,68 @@ index 765b56776e457109ddea9f7dbfd0b17beefee51e..8a9783a15e1bd1a1c82ec221d662f71c private double sampleWithDerivative(int sectionX, int sectionY, int sectionZ, double localX, double localY, double localZ, double[] ds) { int i = this.p(sectionX); diff --git a/src/main/java/net/minecraft/world/level/levelgen/synth/PerlinNoise.java b/src/main/java/net/minecraft/world/level/levelgen/synth/PerlinNoise.java -index b6b56a3db74e07ca015deb7a8ebddc97f6228025..510e83b92028a6d338407c7b428be3daa2355932 100644 +index b6b56a3db74e07ca015deb7a8ebddc97f6228025..b7fab2ae8abb3092e7bde138f7ca6253cecfaa75 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/synth/PerlinNoise.java +++ b/src/main/java/net/minecraft/world/level/levelgen/synth/PerlinNoise.java -@@ -164,9 +164,15 @@ public class PerlinNoise { +@@ -25,6 +25,11 @@ public class PerlinNoise { + private final double lowestFreqValueFactor; + private final double lowestFreqInputFactor; + ++ // Mirai start - c2me: optimization.math ++ private int noiseLevelsCount = 0; ++ private double[] amplitudesArray = null; ++ // Mirai end ++ + /** @deprecated */ + @Deprecated + public static PerlinNoise createLegacyForBlendedNoise(RandomSource random, IntStream intStream) { +@@ -84,6 +89,10 @@ public class PerlinNoise { + int i = this.amplitudes.size(); + int j = -this.firstOctave; + this.noiseLevels = new ImprovedNoise[i]; ++ // Mirai start - c2me: optimization.math ++ this.noiseLevelsCount = this.noiseLevels.length; ++ this.amplitudesArray = this.amplitudes.toDoubleArray(); ++ // Mirai end + if (xoroshiro) { + PositionalRandomFactory positionalRandomFactory = random.forkPositional(); + +@@ -134,9 +143,33 @@ public class PerlinNoise { + random.consumeCount(262); + } + ++ // Mirai start - c2me: optimization.math ++ /** ++ * @author ishland ++ * @reason optimize for common cases ++ */ + public double getValue(double x, double y, double z) { +- return this.getValue(x, y, z, 0.0D, 0.0D, false); ++ double d = 0.0; ++ double e = this.lowestFreqInputFactor; ++ double f = this.lowestFreqValueFactor; ++ ++ for(int i = 0; i < this.noiseLevelsCount; ++i) { ++ ImprovedNoise improvedNoise = this.noiseLevels[i]; ++ if (improvedNoise != null) { ++ @SuppressWarnings("deprecation") ++ double g = improvedNoise.noise( ++ wrap(x * e), wrap(y * e), wrap(z * e), 0.0, 0.0 ++ ); ++ d += this.amplitudesArray[i] * g * f; ++ } ++ ++ e *= 2.0; ++ f /= 2.0; ++ } ++ ++ return d; + } ++ // Mirai end + + /** @deprecated */ + @Deprecated +@@ -164,9 +197,15 @@ public class PerlinNoise { return this.noiseLevels[this.noiseLevels.length - 1 - octave]; }