Fully parallel entities ticking

This commit is contained in:
Sotr
2018-08-07 16:25:29 +08:00
parent c2748ea2df
commit 241a8ffefa
2 changed files with 16 additions and 16 deletions

View File

@@ -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);

View File

@@ -207,27 +207,27 @@ public abstract class MixinMinecraftServer {
world.timings.doTick.startTiming(); world.timings.doTick.startTiming();
} }
} }
Akari.STAGE_TICK.submit(() -> {
// Never tick one world concurrently!
for (int i = 1; i <= worlds.size(); ++i) {
WorldServer world = worlds.get(i < worlds.size() ? i : 0);
synchronized (((IMixinLockProvider) world).lock()) {
tickEntities(world);
world.getTracker().updatePlayers();
world.explosionDensityCache.clear(); // Paper - Optimize explosions
}
}
}, null);
for (int i = 0; i < worlds.size(); ++i) { // Never tick one world concurrently!
WorldServer world = worlds.get(i); for (int i = 0; i < worlds.size(); i++) {
int interlace = i + 1;
WorldServer entitiesWorld = worlds.get(interlace < worlds.size() ? interlace : 0);
Akari.STAGE_TICK.submit(() -> {
synchronized (((IMixinLockProvider) entitiesWorld).lock()) {
tickEntities(entitiesWorld);
entitiesWorld.getTracker().updatePlayers();
entitiesWorld.explosionDensityCache.clear(); // Paper - Optimize explosions
}
}, null);
WorldServer world = worlds.get(i);
synchronized (((IMixinLockProvider) world).lock()) { synchronized (((IMixinLockProvider) world).lock()) {
tickWorld(world); tickWorld(world);
} }
} }
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();