mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-26 18:39:23 +00:00
ClassInstanceMultiMap belongs to Minecraft vanilla entity storage. And is unused, since replaced by spottedleaf's entity storage (rewrite chunk system). However these patches might be useful for vanilla entity storage if is used.
122 lines
5.9 KiB
Diff
122 lines
5.9 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: nostalgic853 <yuu8583@proton.me>
|
|
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<Biome> 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<Biome> getNoiseBiomeAtPosition(double x, double y, double z) {
|