Optimize PlayerChunkMap

This commit is contained in:
William Blake Galbreath
2020-03-01 20:17:22 -06:00
parent 024dc406b8
commit c283ffe6bd

View File

@@ -0,0 +1,137 @@
From 235e99cdb51be4e62e987dd223824f900f3495d7 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Sun, 1 Mar 2020 20:07:54 -0600
Subject: [PATCH] Optimize PlayerChunkMap
---
.../net/minecraft/server/ChunkMapDistance.java | 12 ++++++++++--
.../minecraft/server/ChunkProviderServer.java | 17 +++++------------
.../net/minecraft/server/PlayerChunkMap.java | 17 ++++++-----------
3 files changed, 21 insertions(+), 25 deletions(-)
diff --git a/src/main/java/net/minecraft/server/ChunkMapDistance.java b/src/main/java/net/minecraft/server/ChunkMapDistance.java
index 73d1570765..78735ba56e 100644
--- a/src/main/java/net/minecraft/server/ChunkMapDistance.java
+++ b/src/main/java/net/minecraft/server/ChunkMapDistance.java
@@ -31,7 +31,7 @@ public abstract class ChunkMapDistance {
private final Long2ObjectMap<ObjectSet<EntityPlayer>> c = new Long2ObjectOpenHashMap();
public final Long2ObjectOpenHashMap<ArraySetSorted<Ticket<?>>> tickets = new Long2ObjectOpenHashMap();
private final ChunkMapDistance.a e = new ChunkMapDistance.a();
- private final ChunkMapDistance.b f = new ChunkMapDistance.b(8);
+ private final ChunkMapDistance.b f = new ChunkMapDistance.b(8); private ChunkMapDistance.b getPlayerDistanceChunkMap() { return f; } // Purpur - OBFHELPER
private final ChunkMapDistance.c g = new ChunkMapDistance.c(33);
private final java.util.Queue<PlayerChunk> pendingChunkUpdates = new java.util.LinkedList<>(); // PAIL pendingChunkUpdates // Paper - use a queue
private final ChunkTaskQueueSorter i;
@@ -258,6 +258,13 @@ public abstract class ChunkMapDistance {
return this.f.a.size();
}
+ // Purpur start
+ public boolean hasPlayersNearby(long chunk, boolean update) {
+ if (update) getPlayerDistanceChunkMap().update();
+ return getPlayerDistanceChunkMap().getChunks().containsKey(chunk);
+ }
+ // Purpur end
+
public boolean d(long i) {
this.f.a();
return this.f.a.containsKey(i);
@@ -425,7 +432,7 @@ public abstract class ChunkMapDistance {
class b extends ChunkMap {
- protected final Long2ByteMap a = new Long2ByteOpenHashMap();
+ protected final Long2ByteMap a = new Long2ByteOpenHashMap(); protected Long2ByteMap getChunks() { return a; } // Purpur - OBFHELPER
protected final int b;
protected b(int i) {
@@ -465,6 +472,7 @@ public abstract class ChunkMapDistance {
return objectset != null && !objectset.isEmpty();
}
+ public void update() { a(); } // Purpur - OBFHELPER
public void a() {
this.b(Integer.MAX_VALUE);
}
diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java
index 0ea0d1cff8..1bc961a61d 100644
--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
+++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
@@ -648,19 +648,17 @@ public class ChunkProviderServer extends IChunkProvider {
this.world.timings.countNaturalMobs.stopTiming(); // Paper - timings
this.world.getMethodProfiler().exit();
//Paper start - call player naturally spawn event
- int chunkRange = world.spigotConfig.mobSpawnRange;
- chunkRange = (chunkRange > world.spigotConfig.viewDistance) ? (byte) world.spigotConfig.viewDistance : chunkRange;
- chunkRange = Math.min(chunkRange, 8);
+ byte chunkRange = (byte) Math.min(Math.min(world.spigotConfig.mobSpawnRange, world.spigotConfig.viewDistance), 8); // Purpur
for (EntityPlayer entityPlayer : this.world.players) {
- entityPlayer.playerNaturallySpawnedEvent = new com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent(entityPlayer.getBukkitEntity(), (byte) chunkRange);
+ entityPlayer.playerNaturallySpawnedEvent = new com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent(entityPlayer.getBukkitEntity(), chunkRange); // Purpur - remove pointless cast
entityPlayer.playerNaturallySpawnedEvent.callEvent();
};
// Paper end
this.playerChunkMap.f().forEach((playerchunk) -> {
- Optional<Chunk> optional = ((Either) playerchunk.b().getNow(PlayerChunk.UNLOADED_CHUNK)).left();
+ Optional<Chunk> optional = playerchunk.b().getNow(PlayerChunk.UNLOADED_CHUNK).left(); // Purpur - remove pointless cast
if (optional.isPresent()) {
- Chunk chunk = (Chunk) optional.get();
+ Chunk chunk = optional.get(); // Purpur - remove pointless cast
this.world.getMethodProfiler().enter("broadcast");
this.world.timings.broadcastChunkUpdates.startTiming(); // Paper - timings
@@ -686,12 +684,7 @@ public class ChunkProviderServer extends IChunkProvider {
// Paper end
this.world.getMethodProfiler().enter("spawner");
this.world.timings.mobSpawn.startTiming(); // Spigot
- EnumCreatureType[] aenumcreaturetype1 = aenumcreaturetype;
- int i1 = aenumcreaturetype.length;
-
- for (int j1 = 0; j1 < i1; ++j1) {
- EnumCreatureType enumcreaturetype = aenumcreaturetype1[j1];
-
+ for (EnumCreatureType enumcreaturetype : aenumcreaturetype) { // Purpur
// CraftBukkit start - Use per-world spawn limits
int limit = enumcreaturetype.b();
switch (enumcreaturetype) {
diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java
index 57bea926a6..44c2ca1184 100644
--- a/src/main/java/net/minecraft/server/PlayerChunkMap.java
+++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java
@@ -1266,26 +1266,21 @@ public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d {
}
boolean isOutsideOfRange(ChunkCoordIntPair chunkcoordintpair, boolean reducedRange) {
- int chunkRange = world.spigotConfig.mobSpawnRange;
- chunkRange = (chunkRange > world.spigotConfig.viewDistance) ? (byte) world.spigotConfig.viewDistance : chunkRange;
- chunkRange = (chunkRange > 8) ? 8 : chunkRange;
-
- final int finalChunkRange = chunkRange; // Paper for lambda below
- //double blockRange = (reducedRange) ? Math.pow(chunkRange << 4, 2) : 16384.0D; // Paper - use from event
+ // Purpur - removed a bunch of crap not used anymore
// Spigot end
long i = chunkcoordintpair.pair();
- return !this.chunkDistanceManager.d(i) ? true : this.playerMap.a(i).noneMatch((entityplayer) -> {
+ return !this.chunkDistanceManager.hasPlayersNearby(i, !reducedRange) || this.playerMap.a(i).noneMatch((entityplayer) -> { // Purpur
// Paper start -
- com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event;
+ // com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event // Purpur - moved down
double blockRange = 16384.0D;
if (reducedRange) {
- event = entityplayer.playerNaturallySpawnedEvent;
+ com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event = entityplayer.playerNaturallySpawnedEvent; // Purpur
if (event == null || event.isCancelled()) return false;
- blockRange = (double) ((event.getSpawnRadius() << 4) * (event.getSpawnRadius() << 4));
+ blockRange = (event.getSpawnRadius() << 4) * (event.getSpawnRadius() << 4); // Purpur - removed pointless cast
}
- return (!entityplayer.isSpectator() && a(chunkcoordintpair, (Entity) entityplayer) < blockRange); // Spigot
+ return !entityplayer.isSpectator() && a(chunkcoordintpair, entityplayer) < blockRange; // Spigot // Purpur - remove pointless cast
// Paper end
});
}
--
2.24.0