From aabff6632d8b6f27998c3c8c0eb680ec837cef5f Mon Sep 17 00:00:00 2001 From: Aikar Date: Wed, 29 Aug 2018 22:12:17 -0400 Subject: [PATCH] Optimize getChunkIfLoaded type calls Uses optimized check to avoid major locks and large method. Will improve inlining across many hot methods. Improve getBrightness to not do double chunk map lookups. --- ...Optimize-getChunkIfLoaded-type-calls.patch | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 Spigot-Server-Patches/0355-Optimize-getChunkIfLoaded-type-calls.patch diff --git a/Spigot-Server-Patches/0355-Optimize-getChunkIfLoaded-type-calls.patch b/Spigot-Server-Patches/0355-Optimize-getChunkIfLoaded-type-calls.patch new file mode 100644 index 000000000..6b231dee6 --- /dev/null +++ b/Spigot-Server-Patches/0355-Optimize-getChunkIfLoaded-type-calls.patch @@ -0,0 +1,81 @@ +From b8345560939d63b8f8e221f468aaf9792c61152a Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Wed, 29 Aug 2018 21:59:22 -0400 +Subject: [PATCH] Optimize getChunkIfLoaded type calls + +Uses optimized check to avoid major locks and large method. + +Will improve inlining across many hot methods. + +Improve getBrightness to not do double chunk map lookups. + +diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java +index 96d49b469a..c0ec896eea 100644 +--- a/src/main/java/net/minecraft/server/ChunkProviderServer.java ++++ b/src/main/java/net/minecraft/server/ChunkProviderServer.java +@@ -381,7 +381,7 @@ public class ChunkProviderServer implements IChunkProvider { + continue; + } + +- Chunk neighbor = this.getChunkAt(chunk.locX + x, chunk.locZ + z, false, false); ++ Chunk neighbor = this.chunks.get(chunk.chunkKey); // Paper + if (neighbor != null) { + neighbor.setNeighborUnloaded(-x, -z); + chunk.setNeighborUnloaded(x, z); +diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java +index 49809372d8..0437cfdd55 100644 +--- a/src/main/java/net/minecraft/server/World.java ++++ b/src/main/java/net/minecraft/server/World.java +@@ -165,7 +165,7 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc + } + + public Chunk getChunkIfLoaded(int x, int z) { +- return ((ChunkProviderServer) this.chunkProvider).getChunkAt(x, z, false, false); ++ return ((ChunkProviderServer) this.chunkProvider).chunks.get(ChunkCoordIntPair.a(x, z)); // Paper - optimize getChunkIfLoaded + } + + protected World(IDataManager idatamanager, @Nullable PersistentCollection persistentcollection, WorldData worlddata, WorldProvider worldprovider, MethodProfiler methodprofiler, boolean flag, ChunkGenerator gen, org.bukkit.World.Environment env) { +@@ -715,7 +715,8 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc + blockposition = new BlockPosition(blockposition.getX(), 0, blockposition.getZ()); + } + +- return !blockposition.isValidLocation() ? enumskyblock.c : (!this.isLoaded(blockposition) ? enumskyblock.c : this.getChunkAtWorldCoords(blockposition).getBrightness(enumskyblock, blockposition)); // Paper ++ Chunk chunk; // Paper ++ return !blockposition.isValidLocation() ? enumskyblock.c : ((chunk = this.getChunkIfLoaded(blockposition)) == null ? enumskyblock.c : chunk.getBrightness(enumskyblock, blockposition)); // Paper - optimize ifChunkLoaded + } + + public void a(EnumSkyBlock enumskyblock, BlockPosition blockposition, int i) { +@@ -2017,7 +2018,7 @@ public abstract class World implements IEntityAccess, GeneratorAccess, IIBlockAc + if (blockposition.isInvalidYLocation()) { // Paper + return false; + } else { +- Chunk chunk = this.chunkProvider.getChunkAt(blockposition.getX() >> 4, blockposition.getZ() >> 4, false, false); ++ Chunk chunk = this.getChunkIfLoaded(blockposition.getX() >> 4, blockposition.getZ() >> 4); // Paper - optimize ifLoaded + + return chunk != null && !chunk.isEmpty(); + } +diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +index 1ccf2a7609..d9766447de 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +@@ -227,7 +227,7 @@ public class CraftWorld implements World { + return false; + } + +- net.minecraft.server.Chunk chunk = world.getChunkProviderServer().getChunkAt(x, z, false, false); ++ net.minecraft.server.Chunk chunk = world.getChunkIfLoaded(x, z); // Paper - optimize ifLaoded + if (chunk != null) { + world.getChunkProviderServer().unload(chunk); + } +@@ -246,7 +246,7 @@ public class CraftWorld implements World { + + private boolean unloadChunk0(int x, int z, boolean save) { + Boolean result = MCUtil.ensureMain("Unload Chunk", () -> { // Paper - Ensure never async +- net.minecraft.server.Chunk chunk = world.getChunkProviderServer().getChunkAt(x, z, false, false); ++ net.minecraft.server.Chunk chunk = world.getChunkIfLoaded(x, z); // Paper - optimize ifLoaded + if (chunk == null) { + return true; + } +-- +2.18.0 +