mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-30 12:11:47 +01:00
e9950b70d3
This greatly extends the timings improvements I've done in recent commits, and brings timings to fully cover the entire tick. The timings system also now tracks when specific timings causes the server to lose TPS. The timings are also able to be turned on "on demand", meaning you do not need to restart the server to enable them. This commit also overhauls the Entity Activation Range feature, fixing bugs, adding more immunities, and improving the performance of it. It also fixes a regression with a recent Spigot commit that broke the entire Entity Activation Range feature. This commit had to move the Tick Loop patch before timings because there was a change done there to time the entire tick, so lots of renames. These 2 commits had to be bundled together to simplify applying them and reduce redundant conflict resolution.
140 lines
6 KiB
Diff
140 lines
6 KiB
Diff
From fa1eeb2d804ba81c94d259d60df735627eae989f Mon Sep 17 00:00:00 2001
|
|
From: md_5 <md_5@live.com.au>
|
|
Date: Sun, 3 Feb 2013 12:28:17 +1100
|
|
Subject: [PATCH] Tick loop optimization - sleep for as long as possible.
|
|
|
|
---
|
|
.../java/net/minecraft/server/MinecraftServer.java | 50 +++++++++-------------
|
|
src/main/java/org/bukkit/craftbukkit/Spigot.java | 2 +
|
|
.../craftbukkit/command/TicksPerSecondCommand.java | 35 +++++++++++++++
|
|
3 files changed, 57 insertions(+), 30 deletions(-)
|
|
create mode 100644 src/main/java/org/bukkit/craftbukkit/command/TicksPerSecondCommand.java
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
index 4bdf8aa..128016f 100644
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
@@ -86,6 +86,12 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo
|
|
public java.util.Queue<Runnable> processQueue = new java.util.concurrent.ConcurrentLinkedQueue<Runnable>();
|
|
public int autosavePeriod;
|
|
// CraftBukkit end
|
|
+ // Spigot start
|
|
+ private static final int TPS = 20;
|
|
+ private static final int TICK_TIME = 1000000000 / TPS;
|
|
+ public static double currentTPS = 0;
|
|
+ private static long catchupTime = 0;
|
|
+ // Spigot end
|
|
|
|
public MinecraftServer(OptionSet options) { // CraftBukkit - signature file -> OptionSet
|
|
l = this;
|
|
@@ -397,39 +403,23 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo
|
|
public void run() {
|
|
try {
|
|
if (this.init()) {
|
|
- long i = System.currentTimeMillis();
|
|
-
|
|
- for (long j = 0L; this.isRunning; this.Q = true) {
|
|
- long k = System.currentTimeMillis();
|
|
- long l = k - i;
|
|
-
|
|
- if (l > 2000L && i - this.R >= 15000L) {
|
|
- if (this.server.getWarnOnOverload()) // CraftBukkit - Added option to suppress warning messages
|
|
- log.warning("Can\'t keep up! Did the system time change, or is the server overloaded?");
|
|
- l = 2000L;
|
|
- this.R = i;
|
|
- }
|
|
-
|
|
- if (l < 0L) {
|
|
- log.warning("Time ran backwards! Did the system time change?");
|
|
- l = 0L;
|
|
- }
|
|
-
|
|
- j += l;
|
|
- i = k;
|
|
- if (this.worlds.get(0).everyoneDeeplySleeping()) { // CraftBukkit
|
|
- this.q();
|
|
- j = 0L;
|
|
+ // Spigot start
|
|
+ for (long lastTick = 0L; this.isRunning; this.Q = true) {
|
|
+ long curTime = System.nanoTime();
|
|
+ long wait = TICK_TIME - (curTime - lastTick) - catchupTime;
|
|
+ if (wait > 0) {
|
|
+ Thread.sleep(wait / 1000000);
|
|
+ catchupTime = 0;
|
|
+ continue;
|
|
} else {
|
|
- while (j > 50L) {
|
|
- MinecraftServer.currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit
|
|
- j -= 50L;
|
|
- this.q();
|
|
- }
|
|
+ catchupTime = Math.min(TICK_TIME * TPS, Math.abs(wait));
|
|
}
|
|
-
|
|
- Thread.sleep(1L);
|
|
+ currentTPS = (currentTPS * 0.95) + (1E9 / (curTime - lastTick) * 0.05);
|
|
+ lastTick = curTime;
|
|
+ MinecraftServer.currentTick++;
|
|
+ this.q();
|
|
}
|
|
+ // Spigot end
|
|
} else {
|
|
this.a((CrashReport) null);
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/Spigot.java b/src/main/java/org/bukkit/craftbukkit/Spigot.java
|
|
index 4a4f949..db46037 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/Spigot.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/Spigot.java
|
|
@@ -6,6 +6,8 @@ import org.bukkit.configuration.file.YamlConfiguration;
|
|
public class Spigot {
|
|
|
|
public static void initialize(CraftServer server, SimpleCommandMap commandMap, YamlConfiguration configuration) {
|
|
+ commandMap.register("bukkit", new org.bukkit.craftbukkit.command.TicksPerSecondCommand("tps"));
|
|
+
|
|
server.whitelistMessage = configuration.getString("settings.whitelist-message", server.whitelistMessage);
|
|
server.stopMessage = configuration.getString("settings.stop-message", server.stopMessage);
|
|
server.logCommands = configuration.getBoolean("settings.log-commands", true);
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/command/TicksPerSecondCommand.java b/src/main/java/org/bukkit/craftbukkit/command/TicksPerSecondCommand.java
|
|
new file mode 100644
|
|
index 0000000..f114a31
|
|
--- /dev/null
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/command/TicksPerSecondCommand.java
|
|
@@ -0,0 +1,35 @@
|
|
+package org.bukkit.craftbukkit.command;
|
|
+
|
|
+import net.minecraft.server.MinecraftServer;
|
|
+import org.bukkit.ChatColor;
|
|
+import org.bukkit.command.Command;
|
|
+import org.bukkit.command.CommandSender;
|
|
+
|
|
+public class TicksPerSecondCommand extends Command {
|
|
+
|
|
+ public TicksPerSecondCommand(String name) {
|
|
+ super(name);
|
|
+ this.description = "Gets the current ticks per second for the server";
|
|
+ this.usageMessage = "/tps";
|
|
+ this.setPermission("bukkit.command.tps");
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean execute(CommandSender sender, String currentAlias, String[] args) {
|
|
+ if (!testPermission(sender)) return true;
|
|
+
|
|
+ double tps = Math.min(20, Math.round(MinecraftServer.currentTPS * 10) / 10.0);
|
|
+ ChatColor color;
|
|
+ if (tps > 19.2D) {
|
|
+ color = ChatColor.GREEN;
|
|
+ } else if (tps > 17.4D) {
|
|
+ color = ChatColor.YELLOW;
|
|
+ } else {
|
|
+ color = ChatColor.RED;
|
|
+ }
|
|
+
|
|
+ sender.sendMessage(ChatColor.GOLD + "[TPS] " + color + tps);
|
|
+
|
|
+ return true;
|
|
+ }
|
|
+}
|
|
--
|
|
1.8.1.1
|
|
|