From 0000000000000000000000000000000000000000 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 927abc78e973e6f0f87e12303409fd808b3cf6ab..6688b1340e2cc8fb13a7e80c9b7c37b8822dcecd 100644 --- a/src/main/java/net/minecraft/server/ChunkProviderServer.java +++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java @@ -436,6 +436,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"); @@ -486,39 +492,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 b9685abed74fd1fb239b0940751fde65cceb6f57..d8eb8a59da36215334582ae73822e1fd4a5b2df1 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -266,6 +266,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); }