From ce6270f9c8629d39a639d8c2eac9787c23d51b7d Mon Sep 17 00:00:00 2001 From: Sotr Date: Thu, 28 Mar 2019 13:52:46 +0800 Subject: [PATCH] Move player list tick to off-main thread w/ thread sleep time fix --- .../server/core/AkarinAsyncScheduler.java | 25 ++++++++++++++++--- .../net/minecraft/server/MinecraftServer.java | 12 ++++++--- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/main/java/io/akarin/server/core/AkarinAsyncScheduler.java b/src/main/java/io/akarin/server/core/AkarinAsyncScheduler.java index e8f5756a8..fd7e130ee 100644 --- a/src/main/java/io/akarin/server/core/AkarinAsyncScheduler.java +++ b/src/main/java/io/akarin/server/core/AkarinAsyncScheduler.java @@ -5,10 +5,14 @@ import java.util.List; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; + import net.minecraft.server.EntityHuman; import net.minecraft.server.EntityPlayer; import net.minecraft.server.MinecraftServer; import net.minecraft.server.NetworkManager; +import net.minecraft.server.PacketPlayOutPlayerInfo; import net.minecraft.server.PacketPlayOutUpdateTime; import net.minecraft.server.WorldServer; @@ -32,6 +36,8 @@ public class AkarinAsyncScheduler extends Thread { } } + private int playerListTick; + @Override public void run() { MinecraftServer server = MinecraftServer.getServer(); @@ -39,6 +45,7 @@ public class AkarinAsyncScheduler extends Thread { while (server.isRunning()) { long currentLoop = System.currentTimeMillis(); + // Send pending chunk packets List networkManagers = server.getServerConnection().getNetworkManagers(); if (!networkManagers.isEmpty()) { synchronized (networkManagers) { @@ -48,7 +55,6 @@ public class AkarinAsyncScheduler extends Thread { } // Send time updates to everyone, it will get the right time from the world the player is in. - // Paper start - optimize time updates for (final WorldServer world : server.getWorlds()) { final boolean doDaylight = world.getGameRules().getBoolean("doDaylightCycle"); final long dayTime = world.getDayTime(); @@ -65,11 +71,24 @@ public class AkarinAsyncScheduler extends Thread { entityplayer.playerConnection.sendPacket(packet); // Add support for per player time } } - // Paper end + + // Send player latency update packets + if (++playerListTick > 600) { + List players = server.getPlayerList().players; + for (EntityPlayer target : players) { + target.playerConnection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.UPDATE_LATENCY, Iterables.filter(players, new Predicate() { + @Override + public boolean apply(EntityPlayer input) { + return target.getBukkitEntity().canSee(input.getBukkitEntity()); + } + }))); + } + playerListTick = 0; + } try { long sleepFixed = STD_TICK_TIME - (System.currentTimeMillis() - currentLoop); - Thread.sleep(sleepFixed); + if (sleepFixed > 0) Thread.sleep(sleepFixed); } catch (InterruptedException interrupted) { continue; } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java index bcd145494..337693353 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -1037,7 +1037,7 @@ public abstract class MinecraftServer implements IAsyncTaskHandler, IMojangStati // Akarin start /* - MinecraftTimings.timeUpdateTimer.startTimingUnsafe(); // Spigot + MinecraftTimings.timeUpdateTimer.startTiming(); // Spigot // Send time updates to everyone, it will get the right time from the world the player is in. // Paper start - optimize time updates for (final WorldServer world : this.getWorlds()) { @@ -1057,7 +1057,7 @@ public abstract class MinecraftServer implements IAsyncTaskHandler, IMojangStati } } // Paper end - MinecraftTimings.timeUpdateTimer.stopTimingUnsafe(); // Spigot + MinecraftTimings.timeUpdateTimer.stopTiming(); // Spigot */ // Akarin end @@ -1137,9 +1137,13 @@ public abstract class MinecraftServer implements IAsyncTaskHandler, IMojangStati this.getServerConnection().c(); MinecraftTimings.connectionTimer.stopTimingUnsafe(); // Spigot // Akarin //this.methodProfiler.exitEnter("players"); // Akarin - MinecraftTimings.playerListTimer.startTimingUnsafe(); // Spigot // Akarin + // Akarin start + /* + MinecraftTimings.playerListTimer.startTiming(); // Spigot this.playerList.tick(); - MinecraftTimings.playerListTimer.stopTimingUnsafe(); // Spigot // Akarin + MinecraftTimings.playerListTimer.stopTiming(); // Spigot + */ + // Akarin end //this.methodProfiler.exitEnter("tickables"); // Akarin MinecraftTimings.tickablesTimer.startTimingUnsafe(); // Spigot // Akarin