mirror of
https://github.com/BX-Team/DivineMC.git
synced 2025-12-19 14:59:25 +00:00
async noise fill
This commit is contained in:
@@ -22,6 +22,7 @@ public net.minecraft.world.level.chunk.LevelChunkSection tickingBlockCount
|
|||||||
public net.minecraft.world.level.chunk.LevelChunkSection tickingFluidCount
|
public net.minecraft.world.level.chunk.LevelChunkSection tickingFluidCount
|
||||||
public net.minecraft.world.level.chunk.PalettedContainer palette
|
public net.minecraft.world.level.chunk.PalettedContainer palette
|
||||||
public net.minecraft.world.level.chunk.PalettedContainer strategy
|
public net.minecraft.world.level.chunk.PalettedContainer strategy
|
||||||
|
public net.minecraft.world.level.chunk.PalettedContainer$Data palette
|
||||||
public net.minecraft.world.level.levelgen.DensityFunctions$BlendAlpha
|
public net.minecraft.world.level.levelgen.DensityFunctions$BlendAlpha
|
||||||
public net.minecraft.world.level.levelgen.DensityFunctions$BlendDensity
|
public net.minecraft.world.level.levelgen.DensityFunctions$BlendDensity
|
||||||
public net.minecraft.world.level.levelgen.DensityFunctions$BlendOffset
|
public net.minecraft.world.level.levelgen.DensityFunctions$BlendOffset
|
||||||
|
|||||||
@@ -102,6 +102,19 @@ index cf3172be76fa4c7987ed569138439ff42f92fa7f..bfc65a4d8d1e64f42ff13508020e5e02
|
|||||||
}
|
}
|
||||||
+ // DivineMC end - World gen optimizations
|
+ // DivineMC end - World gen optimizations
|
||||||
}
|
}
|
||||||
|
diff --git a/net/minecraft/world/level/chunk/ChunkGenerator.java b/net/minecraft/world/level/chunk/ChunkGenerator.java
|
||||||
|
index 7e0b602e9fd9e3b3f60014ab179b3a82e3bf5c2a..a440b90e203ab6521bc45dbb1931e6a737c979fa 100644
|
||||||
|
--- a/net/minecraft/world/level/chunk/ChunkGenerator.java
|
||||||
|
+++ b/net/minecraft/world/level/chunk/ChunkGenerator.java
|
||||||
|
@@ -116,7 +116,7 @@ public abstract class ChunkGenerator {
|
||||||
|
return CompletableFuture.supplyAsync(() -> {
|
||||||
|
chunk.fillBiomesFromNoise(this.biomeSource, randomState.sampler());
|
||||||
|
return chunk;
|
||||||
|
- }, Runnable::run); // Paper - rewrite chunk system
|
||||||
|
+ }, net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator.EXECUTOR); // Paper - rewrite chunk system // DivineMC - Optimize noise fill
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void applyCarvers(
|
||||||
diff --git a/net/minecraft/world/level/chunk/LevelChunkSection.java b/net/minecraft/world/level/chunk/LevelChunkSection.java
|
diff --git a/net/minecraft/world/level/chunk/LevelChunkSection.java b/net/minecraft/world/level/chunk/LevelChunkSection.java
|
||||||
index c83d0667b19830304f22319a46a23422a8766790..5bc74d860923d6485593cacb67d4c18e20db2634 100644
|
index c83d0667b19830304f22319a46a23422a8766790..5bc74d860923d6485593cacb67d4c18e20db2634 100644
|
||||||
--- a/net/minecraft/world/level/chunk/LevelChunkSection.java
|
--- a/net/minecraft/world/level/chunk/LevelChunkSection.java
|
||||||
@@ -806,10 +819,22 @@ index c67168517774a0ad9ca43422a79ef14a8ea0c2e8..026dfbbb6c3fd5cd274dcbf721e5cf3a
|
|||||||
public RandomSource at(int x, int y, int z) {
|
public RandomSource at(int x, int y, int z) {
|
||||||
long seed = Mth.getSeed(x, y, z);
|
long seed = Mth.getSeed(x, y, z);
|
||||||
diff --git a/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java b/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java
|
diff --git a/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java b/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java
|
||||||
index 65728ef17e63d71833677fdcbd5bb90794b4822b..6ef91bd952d4a0c1ffa6f534e4fcdd5c0a9db40b 100644
|
index 65728ef17e63d71833677fdcbd5bb90794b4822b..f79db926dc154dae3dd5405aee4582f9b10e873e 100644
|
||||||
--- a/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java
|
--- a/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java
|
||||||
+++ b/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java
|
+++ b/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java
|
||||||
@@ -65,11 +65,13 @@ public final class NoiseBasedChunkGenerator extends ChunkGenerator {
|
@@ -57,6 +57,11 @@ public final class NoiseBasedChunkGenerator extends ChunkGenerator {
|
||||||
|
private static final BlockState AIR = Blocks.AIR.defaultBlockState();
|
||||||
|
public final Holder<NoiseGeneratorSettings> settings;
|
||||||
|
private final Supplier<Aquifer.FluidPicker> globalFluidPicker;
|
||||||
|
+ // DivineMC start - Optimize noise fill
|
||||||
|
+ public static final java.util.concurrent.Executor EXECUTOR = org.bxteam.divinemc.DivineConfig.enableAsyncNoiseFill
|
||||||
|
+ ? java.util.concurrent.Executors.newThreadPerTaskExecutor(Thread.ofVirtual().name("worldgen_fill").factory())
|
||||||
|
+ : Runnable::run;
|
||||||
|
+ // DivineMC end - Optimize noise fill
|
||||||
|
|
||||||
|
public NoiseBasedChunkGenerator(BiomeSource biomeSource, Holder<NoiseGeneratorSettings> settings) {
|
||||||
|
super(biomeSource);
|
||||||
|
@@ -65,11 +70,13 @@ public final class NoiseBasedChunkGenerator extends ChunkGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Aquifer.FluidPicker createFluidPicker(NoiseGeneratorSettings settings) {
|
private static Aquifer.FluidPicker createFluidPicker(NoiseGeneratorSettings settings) {
|
||||||
@@ -828,6 +853,107 @@ index 65728ef17e63d71833677fdcbd5bb90794b4822b..6ef91bd952d4a0c1ffa6f534e4fcdd5c
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -77,7 +84,7 @@ public final class NoiseBasedChunkGenerator extends ChunkGenerator {
|
||||||
|
return CompletableFuture.supplyAsync(() -> {
|
||||||
|
this.doCreateBiomes(blender, randomState, structureManager, chunk);
|
||||||
|
return chunk;
|
||||||
|
- }, Runnable::run); // Paper - rewrite chunk system
|
||||||
|
+ }, EXECUTOR); // Paper - rewrite chunk system // DivineMC - Optimize noise fill
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doCreateBiomes(Blender blender, RandomState random, StructureManager structureManager, ChunkAccess chunk) {
|
||||||
|
@@ -294,30 +301,35 @@ public final class NoiseBasedChunkGenerator extends ChunkGenerator {
|
||||||
|
public CompletableFuture<ChunkAccess> fillFromNoise(Blender blender, RandomState randomState, StructureManager structureManager, ChunkAccess chunk) {
|
||||||
|
NoiseSettings noiseSettings = this.settings.value().noiseSettings().clampToHeightAccessor(chunk.getHeightAccessorForGeneration());
|
||||||
|
int minY = noiseSettings.minY();
|
||||||
|
- int i = Mth.floorDiv(minY, noiseSettings.getCellHeight());
|
||||||
|
- int i1 = Mth.floorDiv(noiseSettings.height(), noiseSettings.getCellHeight());
|
||||||
|
- return i1 <= 0 ? CompletableFuture.completedFuture(chunk) : CompletableFuture.supplyAsync(() -> {
|
||||||
|
- int sectionIndex = chunk.getSectionIndex(i1 * noiseSettings.getCellHeight() - 1 + minY);
|
||||||
|
- int sectionIndex1 = chunk.getSectionIndex(minY);
|
||||||
|
- Set<LevelChunkSection> set = Sets.newHashSet();
|
||||||
|
-
|
||||||
|
- for (int i2 = sectionIndex; i2 >= sectionIndex1; i2--) {
|
||||||
|
- LevelChunkSection section = chunk.getSection(i2);
|
||||||
|
- section.acquire();
|
||||||
|
- set.add(section);
|
||||||
|
- }
|
||||||
|
+ // DivineMC start - Optimize noise fill
|
||||||
|
+ int minYDiv = Mth.floorDiv(minY, noiseSettings.getCellHeight());
|
||||||
|
+ int cellHeightDiv = Mth.floorDiv(noiseSettings.height(), noiseSettings.getCellHeight());
|
||||||
|
+
|
||||||
|
+ if (cellHeightDiv <= 0) {
|
||||||
|
+ return CompletableFuture.completedFuture(chunk);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- ChunkAccess var20;
|
||||||
|
+ return CompletableFuture.supplyAsync(() -> {
|
||||||
|
try {
|
||||||
|
- var20 = this.doFill(blender, structureManager, randomState, chunk, i, i1);
|
||||||
|
- } finally {
|
||||||
|
- for (LevelChunkSection levelChunkSection1 : set) {
|
||||||
|
- levelChunkSection1.release();
|
||||||
|
+ int startIndex = chunk.getSectionIndex(cellHeightDiv * noiseSettings.getCellHeight() - 1 + minY);
|
||||||
|
+ int minYIndex = chunk.getSectionIndex(minY);
|
||||||
|
+ LevelChunkSection[] sections = chunk.getSections();
|
||||||
|
+
|
||||||
|
+ for (int i = startIndex; i >= minYIndex; --i) {
|
||||||
|
+ sections[i].acquire();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ChunkAccess access = this.doFill(blender, structureManager, randomState, chunk, minYDiv, cellHeightDiv);
|
||||||
|
+ for (int i = startIndex; i >= minYIndex; --i) {
|
||||||
|
+ sections[i].release();
|
||||||
|
}
|
||||||
|
- }
|
||||||
|
|
||||||
|
- return var20;
|
||||||
|
- }, Runnable::run); // Paper - rewrite chunk system
|
||||||
|
+ return access;
|
||||||
|
+ } catch (Throwable throwable) {
|
||||||
|
+ throw new RuntimeException("Unexpected error when running noise fill", throwable);
|
||||||
|
+ }
|
||||||
|
+ }, EXECUTOR); // Paper - rewrite chunk system
|
||||||
|
+ // DivineMC end - Optimize noise fill
|
||||||
|
}
|
||||||
|
|
||||||
|
private ChunkAccess doFill(Blender blender, StructureManager structureManager, RandomState random, ChunkAccess chunk, int minCellY, int cellCountY) {
|
||||||
|
@@ -375,7 +387,7 @@ public final class NoiseBasedChunkGenerator extends ChunkGenerator {
|
||||||
|
|
||||||
|
interpolatedState = this.debugPreliminarySurfaceLevel(noiseChunk, i10, i7, i13, interpolatedState);
|
||||||
|
if (interpolatedState != AIR && !SharedConstants.debugVoidTerrain(chunk.getPos())) {
|
||||||
|
- section.setBlockState(i11, i8, i14, interpolatedState, false);
|
||||||
|
+ optimizedBlockSetOp(section, i11, i8, i14, interpolatedState, false); // DivineMC - Optimize noise fill
|
||||||
|
heightmapUnprimed.update(i11, i7, i14, interpolatedState);
|
||||||
|
heightmapUnprimed1.update(i11, i7, i14, interpolatedState);
|
||||||
|
if (aquifer.shouldScheduleFluidUpdate() && !interpolatedState.getFluidState().isEmpty()) {
|
||||||
|
@@ -396,6 +408,26 @@ public final class NoiseBasedChunkGenerator extends ChunkGenerator {
|
||||||
|
return chunk;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // DivineMC start - Optimize noise fill
|
||||||
|
+ private void optimizedBlockSetOp(@org.jetbrains.annotations.NotNull LevelChunkSection chunkSection, int chunkSectionBlockPosX, int chunkSectionBlockPosY, int chunkSectionBlockPosZ, @org.jetbrains.annotations.NotNull BlockState blockState, boolean lock) {
|
||||||
|
+ chunkSection.nonEmptyBlockCount += 1;
|
||||||
|
+
|
||||||
|
+ if (!blockState.getFluidState().isEmpty()) {
|
||||||
|
+ chunkSection.tickingFluidCount += 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (blockState.isRandomlyTicking()) {
|
||||||
|
+ chunkSection.tickingBlockCount += 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ var blockStateId = chunkSection.states.data.palette.idFor(blockState);
|
||||||
|
+ chunkSection.states.data.storage().set(
|
||||||
|
+ chunkSection.states.strategy.getIndex(chunkSectionBlockPosX, chunkSectionBlockPosY,
|
||||||
|
+ chunkSectionBlockPosZ
|
||||||
|
+ ), blockStateId);
|
||||||
|
+ }
|
||||||
|
+ // DivineMC end - Optimize noise fill
|
||||||
|
+
|
||||||
|
private BlockState debugPreliminarySurfaceLevel(NoiseChunk chunk, int x, int y, int z, BlockState state) {
|
||||||
|
return state;
|
||||||
|
}
|
||||||
diff --git a/net/minecraft/world/level/levelgen/NoiseSettings.java b/net/minecraft/world/level/levelgen/NoiseSettings.java
|
diff --git a/net/minecraft/world/level/levelgen/NoiseSettings.java b/net/minecraft/world/level/levelgen/NoiseSettings.java
|
||||||
index 4cf3a364595ba5f81f741295695cb9a449bdf672..44df2ac0bd972c4d97fc89cd0c2d2d83480ca3e1 100644
|
index 4cf3a364595ba5f81f741295695cb9a449bdf672..44df2ac0bd972c4d97fc89cd0c2d2d83480ca3e1 100644
|
||||||
--- a/net/minecraft/world/level/levelgen/NoiseSettings.java
|
--- a/net/minecraft/world/level/levelgen/NoiseSettings.java
|
||||||
|
|||||||
@@ -175,6 +175,7 @@ public class DivineConfig {
|
|||||||
public static int maxViewDistance = 32;
|
public static int maxViewDistance = 32;
|
||||||
public static ChunkSystemAlgorithms chunkWorkerAlgorithm = ChunkSystemAlgorithms.C2ME;
|
public static ChunkSystemAlgorithms chunkWorkerAlgorithm = ChunkSystemAlgorithms.C2ME;
|
||||||
public static int threadPoolPriority = Thread.NORM_PRIORITY + 1;
|
public static int threadPoolPriority = Thread.NORM_PRIORITY + 1;
|
||||||
|
public static boolean enableAsyncNoiseFill = false;
|
||||||
public static boolean enableSecureSeed = false;
|
public static boolean enableSecureSeed = false;
|
||||||
public static boolean smoothBedrockLayer = false;
|
public static boolean smoothBedrockLayer = false;
|
||||||
public static boolean slopesVisualFix = false;
|
public static boolean slopesVisualFix = false;
|
||||||
@@ -208,6 +209,8 @@ public class DivineConfig {
|
|||||||
" - C2ME_NEW: Modern algorithm used by C2ME"));
|
" - C2ME_NEW: Modern algorithm used by C2ME"));
|
||||||
threadPoolPriority = getInt("settings.chunk-generation.thread-pool-priority", threadPoolPriority,
|
threadPoolPriority = getInt("settings.chunk-generation.thread-pool-priority", threadPoolPriority,
|
||||||
"Sets the priority of the thread pool used for chunk generation");
|
"Sets the priority of the thread pool used for chunk generation");
|
||||||
|
enableAsyncNoiseFill = getBoolean("settings.chunk-generation.enable-async-noise-fill", enableAsyncNoiseFill,
|
||||||
|
"Runs noise filling and biome populating in a virtual thread executor. If disabled, it will run sync.");
|
||||||
|
|
||||||
enableSecureSeed = getBoolean("settings.chunk-generation.enable-secure-seed", enableSecureSeed,
|
enableSecureSeed = getBoolean("settings.chunk-generation.enable-secure-seed", enableSecureSeed,
|
||||||
"This feature is based on Secure Seed mod by Earthcomputer.",
|
"This feature is based on Secure Seed mod by Earthcomputer.",
|
||||||
|
|||||||
Reference in New Issue
Block a user