Disable Vanilla last chunk access cache, use ours
Also fixes some bugs in ours Ultimately they both are near the same, but ours is behind the synchronized gate. Mojangs is mixed behind 2 different synchronization contexts (chunks can lock 2 different objects) Mojang also blindly unsets the ref on any chunk unload, not just if its the one being pointed to.
This commit is contained in:
@@ -9,9 +9,17 @@ getChunkAt is called for the same chunk multiple times in a row, often from getT
|
||||
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 4e51bd301a..7100ec7747 100644
|
||||
index fbebd4591c..b941676829 100644
|
||||
--- a/src/main/java/net/minecraft/server/ChunkMap.java
|
||||
+++ b/src/main/java/net/minecraft/server/ChunkMap.java
|
||||
@@ -0,0 +0,0 @@ public class ChunkMap extends Long2ObjectOpenHashMap<Chunk> {
|
||||
|
||||
public Chunk a(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);
|
||||
|
||||
@@ -0,0 +0,0 @@ public class ChunkMap extends Long2ObjectOpenHashMap<Chunk> {
|
||||
}
|
||||
}
|
||||
@@ -22,17 +30,59 @@ index 4e51bd301a..7100ec7747 100644
|
||||
+ }
|
||||
return chunk;
|
||||
}
|
||||
+ private Chunk lastChunkByPos = null; // Paper
|
||||
+ private Chunk lastChunkByPos = null;
|
||||
+
|
||||
+ @Override
|
||||
+ public Chunk get(long l) {
|
||||
+ if (lastChunkByPos != null && l == lastChunkByPos.chunkKey) {
|
||||
+ return lastChunkByPos;
|
||||
+ }
|
||||
+ return super.get(l);
|
||||
+ return lastChunkByPos = super.get(l);
|
||||
+ }
|
||||
+ // Paper end
|
||||
|
||||
public Chunk a(Object object) {
|
||||
return this.a(((Long) object).longValue());
|
||||
diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
||||
index 6b041f06e4..1a1daf36b7 100644
|
||||
--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
||||
@@ -0,0 +0,0 @@ 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;
|
||||
}
|
||||
|
||||
@@ -0,0 +0,0 @@ public class ChunkProviderServer implements IChunkProvider {
|
||||
}
|
||||
|
||||
this.chunks.put(k, chunk);
|
||||
- this.lastChunk = chunk;
|
||||
+ //this.lastChunk = chunk; // Paper
|
||||
}
|
||||
|
||||
this.asyncTaskHandler.postToMainThread(chunk::addEntities);
|
||||
@@ -0,0 +0,0 @@ public class ChunkProviderServer implements IChunkProvider {
|
||||
this.saveChunk(chunk, true); // Spigot
|
||||
}
|
||||
this.chunks.remove(chunk.chunkKey);
|
||||
- this.lastChunk = null;
|
||||
+ //this.lastChunk = null; // Paper
|
||||
return true;
|
||||
}
|
||||
// CraftBukkit end
|
||||
--
|
||||
Reference in New Issue
Block a user