diff --git a/patches/server/0040-Hearse-Multithreaded-tracker.patch b/patches/server/0040-Hearse-Multithreaded-tracker.patch index 735580ff..cce1cc0e 100644 --- a/patches/server/0040-Hearse-Multithreaded-tracker.patch +++ b/patches/server/0040-Hearse-Multithreaded-tracker.patch @@ -28,7 +28,7 @@ index e9a114a4431cedaafef4b427a8baf5030ab60751..c45e8de3a2d46e06f2a5eaa85c789420 this.tickStep_tickConnection(); this.tickStep_tickPlayerList(); diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index 1ff00b202b759095661617242749091b532a6711..04e869e31fce1e0f0ad0690894bcdc6597e00b85 100644 +index 1ff00b202b759095661617242749091b532a6711..ac082d8b565ecae32ce14ca75113f7fd6f779f2f 100644 --- a/src/main/java/net/minecraft/server/level/ChunkMap.java +++ b/src/main/java/net/minecraft/server/level/ChunkMap.java @@ -2,6 +2,10 @@ package net.minecraft.server.level; @@ -340,7 +340,7 @@ index 1ff00b202b759095661617242749091b532a6711..04e869e31fce1e0f0ad0690894bcdc65 // Paper end if (!(entity instanceof EnderDragonPart)) { EntityType entitytypes = entity.getType(); -@@ -1204,77 +1213,92 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider +@@ -1204,16 +1213,48 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider entity.tracker = null; // Paper - We're no longer tracked } @@ -376,23 +376,28 @@ index 1ff00b202b759095661617242749091b532a6711..04e869e31fce1e0f0ad0690894bcdc65 + // Paper start - optimised tracker private final void processTrackQueue() { - this.level.timings.tracker1.startTiming(); +- this.level.timings.tracker1.startTiming(); - try { -+ tryInitIfNotInited(); -+ -+ if (!enabled.get()) { - for (TrackedEntity tracker : this.entityMap.values()) { +- for (TrackedEntity tracker : this.entityMap.values()) { - // update tracker entry - tracker.updatePlayers(tracker.entity.getPlayersInTrackRange()); +- tracker.updatePlayers(tracker.entity.getPlayersInTrackRange()); ++ tryInitIfNotInited(); ++ if (!enabled.get()) { ++ this.level.timings.tracker1.startTiming(); ++ try { ++ for (TrackedEntity tracker : this.entityMap.values()) { ++ tracker.updatePlayers(tracker.entity.getPlayersInTrackRange()); ++ } ++ } finally { ++ this.level.timings.tracker1.stopTiming(); } - } finally { - this.level.timings.tracker1.stopTiming(); -- } + } -- this.level.timings.tracker2.startTiming(); -- try { -+ this.level.timings.tracker2.startTiming(); +@@ -1221,60 +1262,49 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider + try { for (TrackedEntity tracker : this.entityMap.values()) { tracker.serverEntity.sendChanges(); + return; @@ -400,42 +405,41 @@ index 1ff00b202b759095661617242749091b532a6711..04e869e31fce1e0f0ad0690894bcdc65 + if (this.totalRunning.get() > 0) { + return; } -- } finally { -- this.level.timings.tracker2.stopTiming(); -+ + } finally { + this.level.timings.tracker2.stopTiming(); +- } + this.totalRunning.set(2); ++ } + -+ this.asyncTrackWorker.execute(() -> { -+ //this.level.timings.tracker1.startTiming(); // Purpur -+ try { -+ CompletableFuture.allOf(this.entityMap.values() -+ .stream() -+ .map(tracker -> CompletableFuture.runAsync(() -> { -+ tracker.updatePlayers(tracker.entity.getPlayersInTrackRange()); -+ }, concurrentTrackWorker)) -+ .toArray(CompletableFuture[]::new)).join(); -+ } finally { -+ //this.level.timings.tracker1.stopTiming(); // Purpur -+ this.totalRunning.getAndDecrement(); -+ } -+ }); ++ this.asyncTrackWorker.execute(() -> { ++ this.level.timings.tracker1.startTiming(); ++ try { ++ CompletableFuture.allOf(this.entityMap.values() ++ .stream() ++ .map(tracker -> CompletableFuture.runAsync(() -> { ++ tracker.updatePlayers(tracker.entity.getPlayersInTrackRange()); ++ }, concurrentTrackWorker)) ++ .toArray(CompletableFuture[]::new)).join(); ++ } finally { ++ this.level.timings.tracker1.stopTiming(); ++ this.totalRunning.getAndDecrement(); ++ } ++ }); + -+ this.asyncTrackWorker.execute(() -> { -+ //this.level.timings.tracker2.startTiming(); // Purpur -+ try { -+ for (TrackedEntity tracker : this.entityMap.values()) { -+ tracker.serverEntity.sendChanges(); -+ } -+ } finally { -+ //this.level.timings.tracker2.stopTiming(); // Purpur -+ this.totalRunning.getAndDecrement(); ++ this.asyncTrackWorker.execute(() -> { ++ this.level.timings.tracker2.startTiming(); ++ try { ++ for (TrackedEntity tracker : this.entityMap.values()) { ++ tracker.serverEntity.sendChanges(); + } -+ }); - } ++ } finally { ++ this.level.timings.tracker2.stopTiming(); ++ this.totalRunning.getAndDecrement(); ++ } ++ }); } -- // Paper end - optimised tracker + // Paper end - optimised tracker -+ // Paper end - optimised tracker protected void tick() { // Paper start - optimized tracker - if (true) { @@ -487,7 +491,7 @@ index 1ff00b202b759095661617242749091b532a6711..04e869e31fce1e0f0ad0690894bcdc65 } -@@ -1456,7 +1480,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider +@@ -1456,7 +1486,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider final Entity entity; private final int range; SectionPos lastSectionPos; @@ -496,7 +500,7 @@ index 1ff00b202b759095661617242749091b532a6711..04e869e31fce1e0f0ad0690894bcdc65 public TrackedEntity(Entity entity, int i, int j, boolean flag) { this.serverEntity = new ServerEntity(ChunkMap.this.level, entity, j, flag, this::broadcast, this.seenBy); // CraftBukkit -@@ -1474,12 +1498,11 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider +@@ -1474,12 +1504,11 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider if (newTrackerCandidates != null) { Object[] rawData = newTrackerCandidates.getBackingSet(); @@ -511,7 +515,7 @@ index 1ff00b202b759095661617242749091b532a6711..04e869e31fce1e0f0ad0690894bcdc65 this.updatePlayer(player); } } -@@ -1510,14 +1533,9 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider +@@ -1510,14 +1539,9 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider } public void broadcast(Packet packet) { @@ -527,7 +531,7 @@ index 1ff00b202b759095661617242749091b532a6711..04e869e31fce1e0f0ad0690894bcdc65 } public void broadcastAndSend(Packet packet) { -@@ -1529,14 +1547,9 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider +@@ -1529,14 +1553,9 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider } public void broadcastRemoved() { @@ -543,7 +547,7 @@ index 1ff00b202b759095661617242749091b532a6711..04e869e31fce1e0f0ad0690894bcdc65 } public void removePlayer(ServerPlayer player) { -@@ -1544,7 +1557,6 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider +@@ -1544,7 +1563,6 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider if (this.seenBy.remove(player.connection)) { this.serverEntity.removePairing(player); }