9
0
mirror of https://github.com/Winds-Studio/Leaf.git synced 2025-12-31 04:46:38 +00:00
Files
Leaf/patches/server/0043-Faster-sequencing-of-futures-for-chunk-structure-gen.patch
2024-12-14 01:21:12 -05:00

111 lines
6.3 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com>
Date: Tue, 2 Jan 2024 21:13:53 -0500
Subject: [PATCH] Faster sequencing of futures for chunk structure gen
Replace `thenApply` with `thenCompose`. Once one task is completed then the next task starts immediately,
to prevent blocking threads while waiting to complete all tasks. But may cause the sequence of future compose disorder.
diff --git a/src/main/java/net/minecraft/Util.java b/src/main/java/net/minecraft/Util.java
index 1360aa8202542d3d0f32247f1123575fc2c38ff1..8701e64aa7287093f8cac3921e0189f94c62cae9 100644
--- a/src/main/java/net/minecraft/Util.java
+++ b/src/main/java/net/minecraft/Util.java
@@ -586,17 +586,44 @@ public class Util {
return enumMap;
}
+ // Leaf start - Faster sequencing of futures for chunk structure gen
public static <V> CompletableFuture<List<V>> sequence(List<? extends CompletableFuture<V>> futures) {
+ return sequence(futures, false);
+ }
+ public static <V> CompletableFuture<List<V>> sequence(List<? extends CompletableFuture<V>> futures, boolean useFaster) {
+ // Leaf end - Faster sequencing of futures for chunk structure gen
if (futures.isEmpty()) {
return CompletableFuture.completedFuture(List.of());
} else if (futures.size() == 1) {
return futures.get(0).thenApply(List::of);
} else {
CompletableFuture<Void> completableFuture = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
+ // Leaf start - Faster sequencing of futures for chunk structure gen
+ if (org.dreeam.leaf.config.modules.opt.FasterStructureGenFutureSequencing.enabled && useFaster) {
+ return sequenceFaster(futures, completableFuture);
+ }
+ // Leaf end - Faster sequencing of futures for chunk structure gen
+
return completableFuture.thenApply(void_ -> futures.stream().map(CompletableFuture::join).toList());
}
}
+ // Leaf start - Faster sequencing of futures for chunk structure gen
+ private static <V> CompletableFuture<List<V>> sequenceFaster(List<? extends CompletableFuture<V>> futures, CompletableFuture<Void> completableFuture) {
+ return completableFuture.thenCompose(void_ ->
+ CompletableFuture.supplyAsync(() -> {
+ List<V> list = new java.util.ArrayList<>();
+
+ for (CompletableFuture<V> future : futures) {
+ list.add(future.join());
+ }
+
+ return list;
+ }
+ ));
+ }
+ // Leaf end - Faster sequencing of futures for chunk structure gen
+
public static <V> CompletableFuture<List<V>> sequenceFailFast(List<? extends CompletableFuture<? extends V>> futures) {
CompletableFuture<List<V>> completableFuture = new CompletableFuture<>();
return fallibleSequence(futures, completableFuture::completeExceptionally).applyToEither(completableFuture, Function.identity());
diff --git a/src/main/java/net/minecraft/server/ReloadableServerRegistries.java b/src/main/java/net/minecraft/server/ReloadableServerRegistries.java
index ea1cbd7a3897ea4a86877a557da264387ef78a38..d551d9c00ef0eec405f78c9caa482d3bbaf23538 100644
--- a/src/main/java/net/minecraft/server/ReloadableServerRegistries.java
+++ b/src/main/java/net/minecraft/server/ReloadableServerRegistries.java
@@ -54,7 +54,7 @@ public class ReloadableServerRegistries {
List<CompletableFuture<WritableRegistry<?>>> list2 = LootDataType.values()
.map(type -> scheduleRegistryLoad((LootDataType<?>)type, registryOps, resourceManager, prepareExecutor, conversions)) // Paper
.toList();
- CompletableFuture<List<WritableRegistry<?>>> completableFuture = Util.sequence(list2);
+ CompletableFuture<List<WritableRegistry<?>>> completableFuture = Util.sequence(list2, false); // Leaf - Faster sequencing of futures for chunk structure gen
return completableFuture.thenApplyAsync(
registries -> createAndValidateFullContext(dynamicRegistries, provider, (List<WritableRegistry<?>>)registries), prepareExecutor
);
diff --git a/src/main/java/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java b/src/main/java/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java
index a20520a6bd28bae1cee82258ac49d9753faba2bd..b4d9e43b524b9cc6da4bb50d28ce1e854f5abcce 100644
--- a/src/main/java/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java
+++ b/src/main/java/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java
@@ -270,7 +270,7 @@ public class ChunkGeneratorStructureState {
}
}
- return Util.sequence(list).thenApply((list1) -> {
+ return Util.sequence(list, true).thenApply((list1) -> { // Leaf - Faster sequencing of futures for chunk structure gen
double d2 = (double) stopwatch.stop().elapsed(TimeUnit.MILLISECONDS) / 1000.0D;
ChunkGeneratorStructureState.LOGGER.debug("Calculation for {} took {}s", structureSetEntry, d2);
diff --git a/src/main/java/org/dreeam/leaf/config/modules/opt/FasterStructureGenFutureSequencing.java b/src/main/java/org/dreeam/leaf/config/modules/opt/FasterStructureGenFutureSequencing.java
new file mode 100644
index 0000000000000000000000000000000000000000..97a730047491c4ada75963185bb8b2e6f56c56a2
--- /dev/null
+++ b/src/main/java/org/dreeam/leaf/config/modules/opt/FasterStructureGenFutureSequencing.java
@@ -0,0 +1,21 @@
+package org.dreeam.leaf.config.modules.opt;
+
+import org.dreeam.leaf.config.ConfigModules;
+import org.dreeam.leaf.config.EnumConfigCategory;
+
+public class FasterStructureGenFutureSequencing extends ConfigModules {
+
+ public String getBasePath() {
+ return EnumConfigCategory.PERF.getBaseKeyName();
+ }
+
+ public static boolean enabled = true;
+
+ @Override
+ public void onLoaded() {
+ enabled = config.getBoolean(getBasePath() + ".faster-structure-gen-future-sequencing", enabled,
+ config.pickStringRegionBased(
+ "May cause the inconsistent order of future compose tasks.",
+ "更快的结构生成任务分段."));
+ }
+}