diff --git a/sources/src/main/java/io/akarin/api/internal/Akari.java b/sources/src/main/java/io/akarin/api/internal/Akari.java index dee62ee81..1bf2197b4 100644 --- a/sources/src/main/java/io/akarin/api/internal/Akari.java +++ b/sources/src/main/java/io/akarin/api/internal/Akari.java @@ -57,7 +57,7 @@ public abstract class Akari { /** * A common tick pool */ - public static final ExecutorCompletionService STAGE_TICK = new ExecutorCompletionService<>(Executors.newFixedThreadPool(4, new AssignableFactory())); + public static ExecutorCompletionService STAGE_TICK; public static boolean isPrimaryThread() { return isPrimaryThread(true); diff --git a/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java b/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java index de3b886f5..ee2fd5337 100644 --- a/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java +++ b/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java @@ -41,6 +41,7 @@ import net.minecraft.server.WorldServer; @Mixin(value = MinecraftServer.class, remap = false) public abstract class MixinMinecraftServer { @Shadow @Final public Thread primaryThread; + private int cachedWorlds; @Overwrite public String getServerModName() { @@ -53,6 +54,8 @@ public abstract class MixinMinecraftServer { shift = At.Shift.BEFORE )) private void prerun(CallbackInfo info) { + Akari.STAGE_TICK = new ExecutorCompletionService<>(Executors.newFixedThreadPool((cachedWorlds = worlds.size()), new AssignableFactory())); + primaryThread.setPriority(AkarinGlobalConfig.primaryThreadPriority < Thread.NORM_PRIORITY ? Thread.NORM_PRIORITY : (AkarinGlobalConfig.primaryThreadPriority > Thread.MAX_PRIORITY ? 10 : AkarinGlobalConfig.primaryThreadPriority)); @@ -178,6 +181,8 @@ public abstract class MixinMinecraftServer { @Overwrite public void D() throws InterruptedException { + if (worlds.size() != cachedWorlds) Akari.STAGE_TICK = new ExecutorCompletionService<>(Executors.newFixedThreadPool(cachedWorlds, new AssignableFactory())); // Resize + Runnable runnable; MinecraftTimings.bukkitSchedulerTimer.startTiming(); this.server.getScheduler().mainThreadHeartbeat(this.ticks); @@ -210,7 +215,7 @@ public abstract class MixinMinecraftServer { // Never tick one world concurrently! for (int i = 0; i < worlds.size(); i++) { - int interlace = i + 1; + int interlace = i + 1; WorldServer entitiesWorld = worlds.get(interlace < worlds.size() ? interlace : 0); Akari.STAGE_TICK.submit(() -> { synchronized (((IMixinLockProvider) entitiesWorld).lock()) { @@ -220,14 +225,14 @@ public abstract class MixinMinecraftServer { } }, null); - WorldServer world = worlds.get(i); + WorldServer world = worlds.get(i); synchronized (((IMixinLockProvider) world).lock()) { tickWorld(world); } } Akari.entityCallbackTiming.startTiming(); - for (int i = worlds.size(); i --> 0 ;) Akari.STAGE_TICK.take(); + for (int i = worlds.size(); i --> 0 ;) Akari.STAGE_TICK.take(); Akari.entityCallbackTiming.stopTiming(); Akari.worldTiming.stopTiming();