103 lines
6.1 KiB
Diff
103 lines
6.1 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Andrew Steinborn <git@steinborn.me>
|
|
Date: Sat, 3 Oct 2020 04:15:09 -0400
|
|
Subject: [PATCH] Lazily track plugin scoreboards by default
|
|
|
|
On servers with plugins that constantly churn through scoreboards, there is a risk of
|
|
degraded GC performance due to the number of scoreboards held on by weak references.
|
|
Most plugins don't even need the (vanilla) functionality that requires all plugin
|
|
scoreboards to be tracked by the server. Instead, only track scoreboards when an
|
|
objective is added with a non-dummy criteria.
|
|
|
|
This is a breaking change, however the change is a much more sensible default. In case
|
|
this breaks your workflow you can always force all scoreboards to be tracked with
|
|
settings.track-plugin-scoreboards in paper.yml.
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
|
index 545948f20efd6c8dd42140b565af94cd6b52b661..7d50aded88f5b7dfebaea1aebc86231f7b5c4e25 100644
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
|
@@ -462,4 +462,9 @@ public class PaperConfig {
|
|
private static void maxJoinsPerTick() {
|
|
maxJoinsPerTick = getInt("settings.max-joins-per-tick", 3);
|
|
}
|
|
+
|
|
+ public static boolean trackPluginScoreboards;
|
|
+ private static void trackPluginScoreboards() {
|
|
+ trackPluginScoreboards = getBoolean("settings.track-plugin-scoreboards", false);
|
|
+ }
|
|
}
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java
|
|
index 4c93be31fd95d731327479519ecb34a08785c1ca..57537b8871dd5c54d97f3effe1802a3396644e46 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java
|
|
@@ -18,6 +18,7 @@ import org.bukkit.scoreboard.Team;
|
|
|
|
public final class CraftScoreboard implements org.bukkit.scoreboard.Scoreboard {
|
|
final Scoreboard board;
|
|
+ boolean registeredGlobally = false; // Paper
|
|
|
|
CraftScoreboard(Scoreboard board) {
|
|
this.board = board;
|
|
@@ -44,6 +45,12 @@ public final class CraftScoreboard implements org.bukkit.scoreboard.Scoreboard {
|
|
Validate.isTrue(name.length() <= 16, "The name '" + name + "' is longer than the limit of 16 characters");
|
|
Validate.isTrue(board.getObjective(name) == null, "An objective of name '" + name + "' already exists");
|
|
CraftCriteria craftCriteria = CraftCriteria.getFromBukkit(criteria);
|
|
+ // Paper start - the block comment from the old registerNewObjective didnt cause a conflict when rebasing, so this block wasn't added to the adventure registerNewObjective
|
|
+ if (craftCriteria.criteria != net.minecraft.world.scores.criteria.ObjectiveCriteria.DUMMY && !registeredGlobally) {
|
|
+ net.minecraft.server.MinecraftServer.getServer().server.getScoreboardManager().registerScoreboardForVanilla(this);
|
|
+ registeredGlobally = true;
|
|
+ }
|
|
+ // Paper end
|
|
net.minecraft.world.scores.Objective objective = board.registerObjective(name, craftCriteria.criteria, io.papermc.paper.adventure.PaperAdventure.asVanilla(displayName), CraftScoreboardTranslations.fromBukkitRender(renderType));
|
|
return new CraftObjective(this, objective);
|
|
}
|
|
@@ -65,6 +72,12 @@ public final class CraftScoreboard implements org.bukkit.scoreboard.Scoreboard {
|
|
Validate.isTrue(board.getObjective(name) == null, "An objective of name '" + name + "' already exists");
|
|
|
|
CraftCriteria craftCriteria = CraftCriteria.getFromBukkit(criteria);
|
|
+ // Paper start
|
|
+ if (craftCriteria.criteria != net.minecraft.server.IScoreboardCriteria.DUMMY && !registeredGlobally) {
|
|
+ net.minecraft.server.MinecraftServer.getServer().server.getScoreboardManager().registerScoreboardForVanilla(this);
|
|
+ registeredGlobally = true;
|
|
+ }
|
|
+ // Paper end
|
|
ScoreboardObjective objective = board.registerObjective(name, craftCriteria.criteria, CraftChatMessage.fromStringOrNull(displayName), CraftScoreboardTranslations.fromBukkitRender(renderType));
|
|
return new CraftObjective(this, objective);*/ // Paper
|
|
return registerNewObjective(name, criteria, io.papermc.paper.adventure.PaperAdventure.LEGACY_SECTION_UXRC.deserialize(displayName), renderType); // Paper
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java
|
|
index 30b0d4986a7edcf324d94d9304d66d0567098855..8217e35f5a3093e63a165ee8c8b30bf3f28f3bd3 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java
|
|
@@ -30,6 +30,7 @@ public final class CraftScoreboardManager implements ScoreboardManager {
|
|
|
|
public CraftScoreboardManager(MinecraftServer minecraftserver, net.minecraft.world.scores.Scoreboard scoreboardServer) {
|
|
mainScoreboard = new CraftScoreboard(scoreboardServer);
|
|
+ mainScoreboard.registeredGlobally = true; // Paper
|
|
server = minecraftserver;
|
|
scoreboards.add(mainScoreboard);
|
|
}
|
|
@@ -43,10 +44,22 @@ public final class CraftScoreboardManager implements ScoreboardManager {
|
|
public CraftScoreboard getNewScoreboard() {
|
|
org.spigotmc.AsyncCatcher.catchOp("scoreboard creation"); // Spigot
|
|
CraftScoreboard scoreboard = new CraftScoreboard(new ServerScoreboard(server));
|
|
+ // Paper start
|
|
+ if (com.destroystokyo.paper.PaperConfig.trackPluginScoreboards) {
|
|
+ scoreboard.registeredGlobally = true;
|
|
scoreboards.add(scoreboard);
|
|
+ }
|
|
+ // Paper end
|
|
return scoreboard;
|
|
}
|
|
|
|
+ // Paper start
|
|
+ public void registerScoreboardForVanilla(CraftScoreboard scoreboard) {
|
|
+ org.spigotmc.AsyncCatcher.catchOp("scoreboard registration");
|
|
+ scoreboards.add(scoreboard);
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
// CraftBukkit method
|
|
public CraftScoreboard getPlayerBoard(CraftPlayer player) {
|
|
CraftScoreboard board = playerBoards.get(player);
|