From 5b8798df76f834fbb0cf8222bdf52126bce0f1ab Mon Sep 17 00:00:00 2001 From: Spottedleaf 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 7edbd0aac..0de82202e 100644 --- a/src/main/java/net/minecraft/server/ChunkProviderServer.java +++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java @@ -354,6 +354,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"); @@ -404,39 +410,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 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 e97b3f103..913511388 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -255,6 +255,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.25.0