aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0335-Optimise-Chunk-getFluid.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0335-Optimise-Chunk-getFluid.patch')
-rw-r--r--patches/server/0335-Optimise-Chunk-getFluid.patch61
1 files changed, 61 insertions, 0 deletions
diff --git a/patches/server/0335-Optimise-Chunk-getFluid.patch b/patches/server/0335-Optimise-Chunk-getFluid.patch
new file mode 100644
index 0000000000..58ba0e4e5d
--- /dev/null
+++ b/patches/server/0335-Optimise-Chunk-getFluid.patch
@@ -0,0 +1,61 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Spottedleaf <[email protected]>
+Date: Tue, 14 Jan 2020 14:59:08 -0800
+Subject: [PATCH] Optimise Chunk#getFluid
+
+Removing the try catch and generally reducing ops should make it
+faster on its own, however removing the try catch makes it
+easier to inline due to code size
+
+diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
+index 82b59b7c791216aaaaaaf2972f47bd21dac7a202..5403fc4fa2ed2526d2e67c230a46dd2a75e017be 100644
+--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
++++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
+@@ -370,18 +370,20 @@ public class LevelChunk extends ChunkAccess {
+ }
+
+ public FluidState getFluidState(int x, int y, int z) {
+- try {
+- int l = this.getSectionIndex(y);
+-
+- if (l >= 0 && l < this.sections.length) {
+- LevelChunkSection chunksection = this.sections[l];
++ // Paper start - Perf: Optimise Chunk#getFluid
++ // try { // Remove try catch
++ int index = this.getSectionIndex(y);
++ if (index >= 0 && index < this.sections.length) {
++ LevelChunkSection chunksection = this.sections[index];
+
+ if (!chunksection.hasOnlyAir()) {
+- return chunksection.getFluidState(x & 15, y & 15, z & 15);
++ return chunksection.states.get((y & 15) << 8 | (z & 15) << 4 | x & 15).getFluidState();
++ // Paper end - Perf: Optimise Chunk#getFluid
+ }
+ }
+
+ return Fluids.EMPTY.defaultFluidState();
++ /* // Paper - Perf: Optimise Chunk#getFluid
+ } catch (Throwable throwable) {
+ CrashReport crashreport = CrashReport.forThrowable(throwable, "Getting fluid state");
+ CrashReportCategory crashreportsystemdetails = crashreport.addCategory("Block being got");
+@@ -391,6 +393,7 @@ public class LevelChunk extends ChunkAccess {
+ });
+ throw new ReportedException(crashreport);
+ }
++ */ // Paper - Perf: Optimise Chunk#getFluid
+ }
+
+ // CraftBukkit start
+diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java
+index 2d6daf76a56574c9727b404feb4f86347f04cbae..b606e33f8b64eaba28c008cc353d88aa45549e31 100644
+--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java
++++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java
+@@ -43,7 +43,7 @@ public class LevelChunkSection {
+ }
+
+ public FluidState getFluidState(int x, int y, int z) {
+- return ((BlockState) this.states.get(x, y, z)).getFluidState();
++ return this.states.get(x, y, z).getFluidState(); // Paper - Perf: Optimise Chunk#getFluid; diff on change - we expect this to be effectively just getType(x, y, z).getFluid(). If this changes we need to check other patches that use IBlockData#getFluid.
+ }
+
+ public void acquire() {