mirror of
https://github.com/SparklyPower/SparklyPaper.git
synced 2025-12-23 00:49:28 +00:00
67 lines
4.6 KiB
Diff
67 lines
4.6 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: MrPowerGamerBR <git@mrpowergamerbr.com>
|
|
Date: Wed, 22 Nov 2023 11:07:07 -0300
|
|
Subject: [PATCH] Cache coordinate key used for nearby players when ticking
|
|
chunks
|
|
|
|
The "getChunkKey(...)" call is a bit expensive, using 0.24% of CPU time with 19k chunks loaded
|
|
|
|
So instead of paying the price on each tick, we pay the price when the chunk is loaded
|
|
|
|
Which, if you think about it, is actually better, since we tick chunks more than we load chunks
|
|
|
|
diff --git a/src/main/java/io/papermc/paper/util/player/NearbyPlayers.java b/src/main/java/io/papermc/paper/util/player/NearbyPlayers.java
|
|
index 17ba07cbd4792f63d88ce29d00da280f30c4abff..8e8aad958c96fa1df3d906ec120a89adecae38c4 100644
|
|
--- a/src/main/java/io/papermc/paper/util/player/NearbyPlayers.java
|
|
+++ b/src/main/java/io/papermc/paper/util/player/NearbyPlayers.java
|
|
@@ -106,6 +106,14 @@ public final class NearbyPlayers {
|
|
return chunk == null ? null : chunk.players[type.ordinal()];
|
|
}
|
|
|
|
+ // SparklyPaper start - cache coordinate key used for nearby players
|
|
+ public ReferenceList<ServerPlayer> getPlayers(final long nearbyPlayersCoordinateKey, final NearbyMapType type) {
|
|
+ final TrackedChunk chunk = this.byChunk.get(nearbyPlayersCoordinateKey);
|
|
+
|
|
+ return chunk == null ? null : chunk.players[type.ordinal()];
|
|
+ }
|
|
+ // SparklyPaper end
|
|
+
|
|
public ReferenceList<ServerPlayer> getPlayersByChunk(final int chunkX, final int chunkZ, final NearbyMapType type) {
|
|
final TrackedChunk chunk = this.byChunk.get(CoordinateUtils.getChunkKey(chunkX, chunkZ));
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
|
|
index 8c33a12ca879c46893150d6adfb8aa4d397c6b4c..66d9358c30b827a1299e9d9b0d3793a0eb62d67b 100644
|
|
--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
|
|
@@ -621,7 +621,7 @@ public class ServerChunkCache extends ChunkSource {
|
|
|
|
// Paper start - optimise chunk tick iteration
|
|
com.destroystokyo.paper.util.maplist.ReferenceList<ServerPlayer> playersNearby
|
|
- = nearbyPlayers.getPlayers(chunkcoordintpair, io.papermc.paper.util.player.NearbyPlayers.NearbyMapType.SPAWN_RANGE);
|
|
+ = nearbyPlayers.getPlayers(chunk1.nearbyPlayersCoordinateKey, io.papermc.paper.util.player.NearbyPlayers.NearbyMapType.SPAWN_RANGE); // nearbyPlayers.getPlayers(chunkcoordintpair, io.papermc.paper.util.player.NearbyPlayers.NearbyMapType.SPAWN_RANGE); // SparklyPaper - cache coordinate key used for nearby players
|
|
if (playersNearby == null) {
|
|
continue;
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java b/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java
|
|
index f7e5e016a7028a9196e689e950805b0d5b31fe38..d0285843920f78e05ce07b1b0b2d8ce97ec8041e 100644
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java
|
|
@@ -62,7 +62,7 @@ public abstract class ChunkAccess implements BlockGetter, BiomeManager.NoiseBiom
|
|
protected final ShortList[] postProcessing;
|
|
protected volatile boolean unsaved;
|
|
private volatile boolean isLightCorrect;
|
|
- protected final ChunkPos chunkPos; public final long coordinateKey; public final int locX; public final int locZ; // Paper - cache coordinate key
|
|
+ protected final ChunkPos chunkPos; public final long coordinateKey; public final long nearbyPlayersCoordinateKey; public final int locX; public final int locZ; // Paper - cache coordinate key // SparklyPaper - cache coordinate key used for nearby players
|
|
private long inhabitedTime;
|
|
/** @deprecated */
|
|
@Nullable
|
|
@@ -136,7 +136,7 @@ public abstract class ChunkAccess implements BlockGetter, BiomeManager.NoiseBiom
|
|
}
|
|
// Paper end - rewrite light engine
|
|
this.locX = pos.x; this.locZ = pos.z; // Paper - reduce need for field lookups
|
|
- this.chunkPos = pos; this.coordinateKey = ChunkPos.asLong(locX, locZ); // Paper - cache long key
|
|
+ this.chunkPos = pos; this.coordinateKey = ChunkPos.asLong(locX, locZ); this.nearbyPlayersCoordinateKey = io.papermc.paper.util.CoordinateUtils.getChunkKey(locX, locZ); // Paper - cache long key // SparklyPaper - cache coordinate key used for nearby players
|
|
this.upgradeData = upgradeData;
|
|
this.levelHeightAccessor = heightLimitView;
|
|
this.sections = new LevelChunkSection[heightLimitView.getSectionsCount()];
|