bffb08c2f9
The Paper method was chosen for deprecation because it was more restrictive in that it has an isGliding check.
64 Zeilen
3.8 KiB
Diff
64 Zeilen
3.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: SuperCoder7979 <25208576+SuperCoder7979@users.noreply.github.com>
|
|
Date: Tue, 3 Nov 2020 23:48:05 -0600
|
|
Subject: [PATCH] Significantly improve performance of the end generation
|
|
|
|
This patch implements a noise cache for the end which significantly reduces the computation time of generation. This results in about a 3x improvement.
|
|
|
|
Original code by SuperCoder7979 and Gegy in Lithium, licensed under LGPL-3.0 (Source: https://github.com/jellysquid3/lithium-fabric)
|
|
|
|
Co-authored-by: Gegy <gegy1000@gmail.com>
|
|
Co-authored-by: Dylan Xaldin <Puremin0rez515@gmail.com>
|
|
Co-authored-by: pop4959 <pop4959@gmail.com>
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/levelgen/DensityFunctions.java b/src/main/java/net/minecraft/world/level/levelgen/DensityFunctions.java
|
|
index fac92f37c32e0398ebc05d9a0378446fcabaef1a..1beacd84bb0eee1f3e8f451fc1c514e23cc62826 100644
|
|
--- a/src/main/java/net/minecraft/world/level/levelgen/DensityFunctions.java
|
|
+++ b/src/main/java/net/minecraft/world/level/levelgen/DensityFunctions.java
|
|
@@ -490,6 +490,16 @@ public final class DensityFunctions {
|
|
public static final KeyDispatchDataCodec<DensityFunctions.EndIslandDensityFunction> CODEC = KeyDispatchDataCodec.of(MapCodec.unit(new DensityFunctions.EndIslandDensityFunction(0L)));
|
|
private static final float ISLAND_THRESHOLD = -0.9F;
|
|
private final SimplexNoise islandNoise;
|
|
+ // Paper start
|
|
+ private static final class NoiseCache {
|
|
+ public long[] keys = new long[8192];
|
|
+ public float[] values = new float[8192];
|
|
+ public NoiseCache() {
|
|
+ java.util.Arrays.fill(keys, Long.MIN_VALUE);
|
|
+ }
|
|
+ }
|
|
+ private static final ThreadLocal<java.util.Map<SimplexNoise, NoiseCache>> noiseCache = ThreadLocal.withInitial(java.util.WeakHashMap::new);
|
|
+ // Paper end
|
|
|
|
public EndIslandDensityFunction(long seed) {
|
|
RandomSource randomSource = new LegacyRandomSource(seed);
|
|
@@ -505,12 +515,26 @@ public final class DensityFunctions {
|
|
float f = 100.0F - Mth.sqrt((long) x * (long) x + (long) z * (long) z) * 8.0F; // Paper - cast ints to long to avoid integer overflow
|
|
f = Mth.clamp(f, -100.0F, 80.0F);
|
|
|
|
+ NoiseCache cache = noiseCache.get().computeIfAbsent(sampler, noiseKey -> new NoiseCache()); // Paper
|
|
for(int m = -12; m <= 12; ++m) {
|
|
for(int n = -12; n <= 12; ++n) {
|
|
long o = (long)(i + m);
|
|
long p = (long)(j + n);
|
|
- if (o * o + p * p > 4096L && sampler.getValue((double)o, (double)p) < (double)-0.9F) {
|
|
- float g = (Mth.abs((float)o) * 3439.0F + Mth.abs((float)p) * 147.0F) % 13.0F + 9.0F;
|
|
+ // Paper start - Significantly improve end generation performance by using a noise cache
|
|
+ long key = net.minecraft.world.level.ChunkPos.asLong((int) o, (int) p);
|
|
+ int index = (int) it.unimi.dsi.fastutil.HashCommon.mix(key) & 8191;
|
|
+ float g = Float.MIN_VALUE;
|
|
+ if (cache.keys[index] == key) {
|
|
+ g = cache.values[index];
|
|
+ } else {
|
|
+ if (o * o + p * p > 4096L && sampler.getValue((double)o, (double)p) < (double)-0.9F) {
|
|
+ g = (Mth.abs((float) o) * 3439.0F + Mth.abs((float) p) * 147.0F) % 13.0F + 9.0F;
|
|
+ }
|
|
+ cache.keys[index] = key;
|
|
+ cache.values[index] = g;
|
|
+ }
|
|
+ if (g != Float.MIN_VALUE) {
|
|
+ // Paper end
|
|
float h = (float)(k - m * 2);
|
|
float q = (float)(l - n * 2);
|
|
float r = 100.0F - Mth.sqrt(h * h + q * q) * g;
|