mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-31 04:46:38 +00:00
111 lines
6.3 KiB
Diff
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.",
|
|
+ "更快的结构生成任务分段."));
|
|
+ }
|
|
+}
|