a2ad49b22f
Note to other developers: This commit may require you to wipe your workspace as a result of the changes to BD. --- work/BuildData Submodule work/BuildData f527a8ff..d56672db: > Mappings Update --- work/Bukkit Submodule work/Bukkit 0c1d258bb..db06c80d7: > Add list of entities to EntityTransformEvent > SPIGOT-4347: Add API to allow storing arbitrary values on ItemStacks ---work/CraftBukkit Submodule work/CraftBukkit 6a398ac44..068dab5be: > Enable optional source JAR shading via profile shadeSourcesJar > Use ImmutableList rather than AbstractList for CraftMetaBook > Fix setRecipes(List) not setting Knowledge Book recipes. > Mappings Update > Add list of entities to EntityTransformEvent & move die calls > SPIGOT-4347: Add API to allow storing arbitrary values on ItemStacks > Add Vanilla help to default permissions --- work/Spigot Submodule work/Spigot a1f2566f6..e769fe4d9: > Mappings Update > Rebuild patches
125 lines
5.4 KiB
Diff
125 lines
5.4 KiB
Diff
From 9d894a3b3e3aee3b5cdd072ead5de268498b1191 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 ca18901df..2ebb2d834 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 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);
|
|
|
|
@@ -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 a(Object object) {
|
|
return this.a((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.19.2
|
|
|