mirror of
https://github.com/PaperMC/Paper.git
synced 2024-09-12 15:08:27 +02:00
Developers!: You will need to clean up your work/Minecraft/1.13.2 folder for this Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: b850a822 SPIGOT-4526: Add conversion time API for Zombie & subclasses CraftBukkit Changes:38cf676e
SPIGOT-4534: CreatureSpawnEvent not being called for CHUNK_GENb446cb5d
SPIGOT-4527: Fix sponges with waterlogged blocks6ec8ea5c
SPIGOT-4526: Add conversion time API for Zombie & subclassesc64fe508
Mappings Updatea3c2ec03
Fix missing ServerListPingEvent call for legacy pings Spigot Changes: 1dc156ce Rebuild patches 140f654d Mappings Update
126 lines
5.4 KiB
Diff
126 lines
5.4 KiB
Diff
From f5810f944e68391b4e1b8c35968b89a54f6ee177 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Thu, 27 Aug 2015 01:15:02 -0400
|
|
Subject: [PATCH] Optimize Chunk Access
|
|
|
|
getting a loaded chunk is one of the most hottest pieces of code in the game.
|
|
getChunkAt is called for the same chunk multiple times in a row, often from getType();
|
|
|
|
Optimize this look up by using a Last Access cache.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/ChunkMap.java b/src/main/java/net/minecraft/server/ChunkMap.java
|
|
index 732c8793e..8b3738c8f 100644
|
|
--- a/src/main/java/net/minecraft/server/ChunkMap.java
|
|
+++ b/src/main/java/net/minecraft/server/ChunkMap.java
|
|
@@ -15,6 +15,7 @@ public class ChunkMap extends Long2ObjectOpenHashMap<Chunk> {
|
|
|
|
public Chunk put(long i, Chunk chunk) {
|
|
chunk.world.timings.syncChunkLoadPostTimer.startTiming(); // Paper
|
|
+ lastChunkByPos = chunk; // Paper
|
|
Chunk chunk1 = (Chunk) super.put(i, chunk);
|
|
ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i);
|
|
|
|
@@ -22,7 +23,7 @@ public class ChunkMap extends Long2ObjectOpenHashMap<Chunk> {
|
|
for (int k = chunkcoordintpair.z - 1; k <= chunkcoordintpair.z + 1; ++k) {
|
|
if (j != chunkcoordintpair.x || k != chunkcoordintpair.z) {
|
|
long l = ChunkCoordIntPair.a(j, k);
|
|
- Chunk chunk2 = (Chunk) this.get(l);
|
|
+ Chunk chunk2 = (Chunk) super.get(l); // Paper - use super to avoid polluting last access cache
|
|
|
|
if (chunk2 != null) {
|
|
chunk.H();
|
|
@@ -40,7 +41,7 @@ public class ChunkMap extends Long2ObjectOpenHashMap<Chunk> {
|
|
continue;
|
|
}
|
|
|
|
- Chunk neighbor = this.get(ChunkCoordIntPair.a(chunkcoordintpair.x + x, chunkcoordintpair.z + z));
|
|
+ Chunk neighbor = super.get(ChunkCoordIntPair.a(chunkcoordintpair.x + x, chunkcoordintpair.z + z)); // Paper - use super to avoid polluting last access cache
|
|
if (neighbor != null) {
|
|
neighbor.setNeighborLoaded(-x, -z);
|
|
chunk.setNeighborLoaded(x, z);
|
|
@@ -64,7 +65,7 @@ public class ChunkMap extends Long2ObjectOpenHashMap<Chunk> {
|
|
for (int j = chunkcoordintpair.x - 1; j <= chunkcoordintpair.x + 1; ++j) {
|
|
for (int k = chunkcoordintpair.z - 1; k <= chunkcoordintpair.z + 1; ++k) {
|
|
if (j != chunkcoordintpair.x || k != chunkcoordintpair.z) {
|
|
- Chunk chunk1 = (Chunk) this.get(ChunkCoordIntPair.a(j, k));
|
|
+ Chunk chunk1 = (Chunk) super.get(ChunkCoordIntPair.a(j, k)); // Paper - use super to avoid polluting last access cache
|
|
|
|
if (chunk1 != null) {
|
|
chunk1.I();
|
|
@@ -73,8 +74,22 @@ public class ChunkMap extends Long2ObjectOpenHashMap<Chunk> {
|
|
}
|
|
}
|
|
|
|
+ // Paper start
|
|
+ if (lastChunkByPos != null && i == lastChunkByPos.chunkKey) {
|
|
+ lastChunkByPos = null;
|
|
+ }
|
|
return chunk;
|
|
}
|
|
+ private Chunk lastChunkByPos = null;
|
|
+
|
|
+ @Override
|
|
+ public Chunk get(long l) {
|
|
+ if (lastChunkByPos != null && l == lastChunkByPos.chunkKey) {
|
|
+ return lastChunkByPos;
|
|
+ }
|
|
+ return lastChunkByPos = super.get(l);
|
|
+ }
|
|
+ // Paper end
|
|
|
|
public Chunk remove(Object object) {
|
|
return this.remove((Long) object);
|
|
diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
|
index 557aa5180..1d08ec37f 100644
|
|
--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
|
+++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
|
@@ -78,15 +78,16 @@ public class ChunkProviderServer implements IChunkProvider {
|
|
Chunk chunk;
|
|
|
|
synchronized (this.chunkLoader) {
|
|
- if (this.lastChunk != null && this.lastChunk.getPos().x == i && this.lastChunk.getPos().z == j) {
|
|
+ // Paper start - remove vanilla lastChunk, we do it more accurately
|
|
+ /* if (this.lastChunk != null && this.lastChunk.locX == i && this.lastChunk.locZ == j) {
|
|
return this.lastChunk;
|
|
- }
|
|
+ }*/ // Paper end
|
|
|
|
long k = ChunkCoordIntPair.a(i, j);
|
|
|
|
chunk = (Chunk) this.chunks.get(k);
|
|
if (chunk != null) {
|
|
- this.lastChunk = chunk;
|
|
+ //this.lastChunk = chunk; // Paper remove vanilla lastChunk
|
|
return chunk;
|
|
}
|
|
|
|
@@ -198,7 +199,7 @@ public class ChunkProviderServer implements IChunkProvider {
|
|
}
|
|
|
|
this.chunks.put(k, chunk);
|
|
- this.lastChunk = chunk;
|
|
+ //this.lastChunk = chunk; // Paper
|
|
}
|
|
|
|
this.asyncTaskHandler.postToMainThread(chunk::addEntities);
|
|
@@ -345,7 +346,7 @@ public class ChunkProviderServer implements IChunkProvider {
|
|
this.saveChunk(chunk, true); // Spigot
|
|
}
|
|
this.chunks.remove(chunk.chunkKey);
|
|
- this.lastChunk = null;
|
|
+ // this.lastChunk = null; // Paper
|
|
}
|
|
return true;
|
|
}
|
|
@@ -381,6 +382,6 @@ public class ChunkProviderServer implements IChunkProvider {
|
|
}
|
|
|
|
public boolean isLoaded(int i, int j) {
|
|
- return this.chunks.containsKey(ChunkCoordIntPair.a(i, j));
|
|
+ return this.chunks.get(ChunkCoordIntPair.asLong(i, j)) != null; // Paper - use get for last access
|
|
}
|
|
}
|
|
--
|
|
2.20.0
|
|
|