57dd397155
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: b999860d SPIGOT-2304: Add LootGenerateEvent CraftBukkit Changes: 77fd87e4 SPIGOT-2304: Implement LootGenerateEvent a1a705ee SPIGOT-5566: Doused campfires & fires should call EntityChangeBlockEvent 41712edd SPIGOT-5707: PersistentDataHolder not Persistent on API dropped Item
88 lines
3.6 KiB
Diff
88 lines
3.6 KiB
Diff
From ecae8caf37165aba7f2ac5f12f41a882079878da Mon Sep 17 00:00:00 2001
|
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
|
Date: Sat, 25 Jan 2020 17:04:35 -0800
|
|
Subject: [PATCH] Optimise getChunkAt calls for loaded chunks
|
|
|
|
bypass the need to get a player chunk, then get the either,
|
|
then unwrap it...
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
|
index fe894a68bc..e67e006535 100644
|
|
--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
|
+++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java
|
|
@@ -435,6 +435,12 @@ public class ChunkProviderServer extends IChunkProvider {
|
|
return this.getChunkAt(i, j, chunkstatus, flag);
|
|
}, this.serverThreadQueue).join();
|
|
} else {
|
|
+ // Paper start - optimise for loaded chunks
|
|
+ Chunk ifLoaded = this.getChunkAtIfLoadedMainThread(i, j);
|
|
+ if (ifLoaded != null) {
|
|
+ return ifLoaded;
|
|
+ }
|
|
+ // Paper end
|
|
GameProfilerFiller gameprofilerfiller = this.world.getMethodProfiler();
|
|
|
|
gameprofilerfiller.c("getChunk");
|
|
@@ -485,39 +491,7 @@ public class ChunkProviderServer extends IChunkProvider {
|
|
if (Thread.currentThread() != this.serverThread) {
|
|
return null;
|
|
} else {
|
|
- this.world.getMethodProfiler().c("getChunkNow");
|
|
- long k = ChunkCoordIntPair.pair(i, j);
|
|
-
|
|
- for (int l = 0; l < 4; ++l) {
|
|
- if (k == this.cachePos[l] && this.cacheStatus[l] == ChunkStatus.FULL) {
|
|
- IChunkAccess ichunkaccess = this.cacheChunk[l];
|
|
-
|
|
- return ichunkaccess instanceof Chunk ? (Chunk) ichunkaccess : null;
|
|
- }
|
|
- }
|
|
-
|
|
- PlayerChunk playerchunk = this.getChunk(k);
|
|
-
|
|
- if (playerchunk == null) {
|
|
- return null;
|
|
- } else {
|
|
- Either<IChunkAccess, PlayerChunk.Failure> either = (Either) playerchunk.b(ChunkStatus.FULL).getNow(null); // CraftBukkit - decompile error
|
|
-
|
|
- if (either == null) {
|
|
- return null;
|
|
- } else {
|
|
- IChunkAccess ichunkaccess1 = (IChunkAccess) either.left().orElse(null); // CraftBukkit - decompile error
|
|
-
|
|
- if (ichunkaccess1 != null) {
|
|
- this.a(k, ichunkaccess1, ChunkStatus.FULL);
|
|
- if (ichunkaccess1 instanceof Chunk) {
|
|
- return (Chunk) ichunkaccess1;
|
|
- }
|
|
- }
|
|
-
|
|
- return null;
|
|
- }
|
|
- }
|
|
+ return this.getChunkAtIfLoadedMainThread(i, j); // Paper - optimise for loaded chunks
|
|
}
|
|
}
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
|
index f1d072a39c..0c23fc89d7 100644
|
|
--- a/src/main/java/net/minecraft/server/World.java
|
|
+++ b/src/main/java/net/minecraft/server/World.java
|
|
@@ -265,6 +265,14 @@ public abstract class World implements GeneratorAccess, AutoCloseable {
|
|
|
|
@Override
|
|
public Chunk getChunkAt(int i, int j) {
|
|
+ // Paper start - optimise this for loaded chunks
|
|
+ if (Thread.currentThread() == this.serverThread) {
|
|
+ Chunk ifLoaded = ((WorldServer) this).getChunkProvider().getChunkAtIfLoadedMainThread(i, j);
|
|
+ if (ifLoaded != null) {
|
|
+ return ifLoaded;
|
|
+ }
|
|
+ }
|
|
+ // Paper end
|
|
return (Chunk) this.getChunkAt(i, j, ChunkStatus.FULL);
|
|
}
|
|
|
|
--
|
|
2.26.2
|
|
|