Fully parallel entities ticking
This commit is contained in:
@@ -57,7 +57,7 @@ public abstract class Akari {
|
|||||||
/**
|
/**
|
||||||
* A common tick pool
|
* A common tick pool
|
||||||
*/
|
*/
|
||||||
public static final ExecutorCompletionService<?> STAGE_TICK = new ExecutorCompletionService<>(Executors.newSingleThreadExecutor(new AssignableFactory()));
|
public static final ExecutorCompletionService<?> STAGE_TICK = new ExecutorCompletionService<>(Executors.newFixedThreadPool(4, new AssignableFactory()));
|
||||||
|
|
||||||
public static boolean isPrimaryThread() {
|
public static boolean isPrimaryThread() {
|
||||||
return isPrimaryThread(true);
|
return isPrimaryThread(true);
|
||||||
|
|||||||
@@ -207,19 +207,19 @@ public abstract class MixinMinecraftServer {
|
|||||||
world.timings.doTick.startTiming();
|
world.timings.doTick.startTiming();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Akari.STAGE_TICK.submit(() -> {
|
|
||||||
// Never tick one world concurrently!
|
// Never tick one world concurrently!
|
||||||
for (int i = 1; i <= worlds.size(); ++i) {
|
for (int i = 0; i < worlds.size(); i++) {
|
||||||
WorldServer world = worlds.get(i < worlds.size() ? i : 0);
|
int interlace = i + 1;
|
||||||
synchronized (((IMixinLockProvider) world).lock()) {
|
WorldServer entitiesWorld = worlds.get(interlace < worlds.size() ? interlace : 0);
|
||||||
tickEntities(world);
|
Akari.STAGE_TICK.submit(() -> {
|
||||||
world.getTracker().updatePlayers();
|
synchronized (((IMixinLockProvider) entitiesWorld).lock()) {
|
||||||
world.explosionDensityCache.clear(); // Paper - Optimize explosions
|
tickEntities(entitiesWorld);
|
||||||
}
|
entitiesWorld.getTracker().updatePlayers();
|
||||||
|
entitiesWorld.explosionDensityCache.clear(); // Paper - Optimize explosions
|
||||||
}
|
}
|
||||||
}, null);
|
}, null);
|
||||||
|
|
||||||
for (int i = 0; i < worlds.size(); ++i) {
|
|
||||||
WorldServer world = worlds.get(i);
|
WorldServer world = worlds.get(i);
|
||||||
synchronized (((IMixinLockProvider) world).lock()) {
|
synchronized (((IMixinLockProvider) world).lock()) {
|
||||||
tickWorld(world);
|
tickWorld(world);
|
||||||
@@ -227,7 +227,7 @@ public abstract class MixinMinecraftServer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Akari.entityCallbackTiming.startTiming();
|
Akari.entityCallbackTiming.startTiming();
|
||||||
Akari.STAGE_TICK.take();
|
for (int i = worlds.size(); i --> 0 ;) Akari.STAGE_TICK.take();
|
||||||
Akari.entityCallbackTiming.stopTiming();
|
Akari.entityCallbackTiming.stopTiming();
|
||||||
|
|
||||||
Akari.worldTiming.stopTiming();
|
Akari.worldTiming.stopTiming();
|
||||||
|
|||||||
Reference in New Issue
Block a user