diff --git a/divinemc-server/src/main/java/org/bxteam/divinemc/async/AsyncChunkSend.java b/divinemc-server/src/main/java/org/bxteam/divinemc/async/AsyncChunkSend.java index ae34e3d..bb2e435 100644 --- a/divinemc-server/src/main/java/org/bxteam/divinemc/async/AsyncChunkSend.java +++ b/divinemc-server/src/main/java/org/bxteam/divinemc/async/AsyncChunkSend.java @@ -1,5 +1,6 @@ package org.bxteam.divinemc.async; +import org.bxteam.divinemc.config.DivineConfig; import org.bxteam.divinemc.util.NamedAgnosticThreadFactory; import java.util.concurrent.ExecutorService; @@ -9,7 +10,7 @@ import java.util.concurrent.TimeUnit; public class AsyncChunkSend { public static final ExecutorService POOL = new ThreadPoolExecutor( - 1, 1, 0L, TimeUnit.MILLISECONDS, + 1, DivineConfig.AsyncCategory.asyncChunkSendingMaxThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), new NamedAgnosticThreadFactory<>("Async Chunk Sending", AsyncChunkSendThread::new, Thread.NORM_PRIORITY), new ThreadPoolExecutor.CallerRunsPolicy() diff --git a/divinemc-server/src/main/java/org/bxteam/divinemc/config/DivineConfig.java b/divinemc-server/src/main/java/org/bxteam/divinemc/config/DivineConfig.java index 592c589..1f02175 100644 --- a/divinemc-server/src/main/java/org/bxteam/divinemc/config/DivineConfig.java +++ b/divinemc-server/src/main/java/org/bxteam/divinemc/config/DivineConfig.java @@ -222,6 +222,7 @@ public class DivineConfig { // Async chunk sending settings public static boolean asyncChunkSendingEnabled = true; + public static int asyncChunkSendingMaxThreads = 1; // Async mob spawning settings public static boolean enableAsyncSpawning = true; @@ -338,6 +339,13 @@ public class DivineConfig { private static void asyncChunkSending() { asyncChunkSendingEnabled = getBoolean(ConfigCategory.ASYNC.key("chunk-sending.enable"), asyncChunkSendingEnabled, "Makes chunk sending asynchronous, which can significantly reduce main thread load when many players are loading chunks."); + asyncChunkSendingMaxThreads = getInt(ConfigCategory.ASYNC.key("chunk-sending.max-threads"), asyncChunkSendingMaxThreads); + + if (asyncChunkSendingMaxThreads < 0) { + asyncChunkSendingMaxThreads = Math.max(Runtime.getRuntime().availableProcessors() + asyncChunkSendingMaxThreads, 1); + } else if (asyncChunkSendingMaxThreads == 0) { + asyncChunkSendingMaxThreads = Math.max(Runtime.getRuntime().availableProcessors() / 4, 1); + } } private static void asyncMobSpawning() {