2021-06-11 14:02:28 +02:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Aikar <aikar@aikar.co>
|
|
|
|
Date: Thu, 3 Mar 2016 02:07:55 -0600
|
2021-12-06 00:32:02 +01:00
|
|
|
Subject: [PATCH] Optimize isInWorldBounds and getBlockState for inlining
|
2021-06-11 14:02:28 +02:00
|
|
|
|
|
|
|
Hot methods, so reduce # of instructions for the method.
|
|
|
|
|
|
|
|
Move is valid location test to the BlockPosition class so that it can access local variables.
|
|
|
|
|
|
|
|
Replace all calls to the new place to the unnecessary forward.
|
|
|
|
|
|
|
|
Optimize getType and getBlockData to manually inline and optimize the calls
|
|
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/core/Vec3i.java b/src/main/java/net/minecraft/core/Vec3i.java
|
2023-09-22 19:31:02 +02:00
|
|
|
index a0c7480d219feda71ad249601fae6f9c912fefa4..7067241e2da0dea3875c13cc9f429705a7a9b672 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/net/minecraft/core/Vec3i.java
|
|
|
|
+++ b/src/main/java/net/minecraft/core/Vec3i.java
|
2023-03-14 19:36:39 +01:00
|
|
|
@@ -31,6 +31,12 @@ public class Vec3i implements Comparable<Vec3i> {
|
|
|
|
});
|
2021-11-23 13:15:10 +01:00
|
|
|
}
|
2021-06-11 14:02:28 +02:00
|
|
|
|
|
|
|
+ // Paper start
|
2021-12-06 00:32:02 +01:00
|
|
|
+ public final boolean isInsideBuildHeightAndWorldBoundsHorizontal(net.minecraft.world.level.LevelHeightAccessor levelHeightAccessor) {
|
2021-06-14 17:10:25 +02:00
|
|
|
+ return getX() >= -30000000 && getZ() >= -30000000 && getX() < 30000000 && getZ() < 30000000 && !levelHeightAccessor.isOutsideBuildHeight(getY());
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
+
|
|
|
|
public Vec3i(int x, int y, int z) {
|
|
|
|
this.x = x;
|
|
|
|
this.y = y;
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
|
2023-09-21 22:14:58 +02:00
|
|
|
index a64b4eb9bc6437cc143ed6816060b223ce6542e6..f96154f86a260ecd8dbd485a1c72703bc5949de2 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/net/minecraft/world/level/Level.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/Level.java
|
2023-09-10 04:28:03 +02:00
|
|
|
@@ -368,7 +368,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
|
|
|
// Paper end
|
2021-06-11 14:02:28 +02:00
|
|
|
|
2021-06-12 04:24:43 +02:00
|
|
|
public boolean isInWorldBounds(BlockPos pos) {
|
|
|
|
- return !this.isOutsideBuildHeight(pos) && Level.isInWorldBoundsHorizontal(pos);
|
2021-12-06 00:32:02 +01:00
|
|
|
+ return pos.isInsideBuildHeightAndWorldBoundsHorizontal(this); // Paper - use better/optimized check
|
2021-06-11 14:02:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean isInSpawnableBounds(BlockPos pos) {
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java b/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java
|
2023-06-07 20:49:17 +02:00
|
|
|
index 2caac1a3d80e6c490aa16aa6bc1067065b665c69..525c89bc926f13af6f94fc46c897525e37477eca 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java
|
2023-06-07 20:49:17 +02:00
|
|
|
@@ -166,6 +166,7 @@ public abstract class ChunkAccess implements BlockGetter, BiomeManager.NoiseBiom
|
2022-12-07 19:52:24 +01:00
|
|
|
return GameEventListenerRegistry.NOOP;
|
2021-06-12 04:24:43 +02:00
|
|
|
}
|
2021-06-11 14:02:28 +02:00
|
|
|
|
2021-12-06 00:32:02 +01:00
|
|
|
+ public abstract BlockState getBlockState(final int x, final int y, final int z); // Paper
|
2021-06-11 14:02:28 +02:00
|
|
|
@Nullable
|
2021-11-23 13:15:10 +01:00
|
|
|
public abstract BlockState setBlockState(BlockPos pos, BlockState state, boolean moved);
|
2021-06-11 14:02:28 +02:00
|
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/chunk/EmptyLevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/EmptyLevelChunk.java
|
2023-09-22 19:31:02 +02:00
|
|
|
index 17395c4ca817ee3443e4515ca6e519ba0f3f44b0..78729ad89c1cad9bf3cfb7996acf3616b6483044 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/EmptyLevelChunk.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/EmptyLevelChunk.java
|
2022-09-26 10:02:51 +02:00
|
|
|
@@ -55,6 +55,12 @@ public class EmptyLevelChunk extends LevelChunk {
|
|
|
|
public void setBlockEmptinessMap(final boolean[] emptinessMap) {}
|
|
|
|
// Paper end - starlight
|
2021-06-11 14:02:28 +02:00
|
|
|
|
|
|
|
+ // Paper start
|
2021-12-06 00:32:02 +01:00
|
|
|
+ @Override
|
|
|
|
+ public BlockState getBlockState(int x, int y, int z) {
|
2021-06-11 14:02:28 +02:00
|
|
|
+ return Blocks.VOID_AIR.defaultBlockState();
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
@Override
|
|
|
|
public BlockState getBlockState(BlockPos pos) {
|
|
|
|
return Blocks.VOID_AIR.defaultBlockState();
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/chunk/ImposterProtoChunk.java b/src/main/java/net/minecraft/world/level/chunk/ImposterProtoChunk.java
|
2023-09-22 19:31:02 +02:00
|
|
|
index 3c126ff38227ead399a9590f7731ff9b46990bd0..3c1a8c3a402fe6ae6c512fab565a52841f2e4c2a 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/ImposterProtoChunk.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/ImposterProtoChunk.java
|
2023-06-07 20:49:17 +02:00
|
|
|
@@ -91,6 +91,12 @@ public class ImposterProtoChunk extends ProtoChunk {
|
2021-06-11 14:02:28 +02:00
|
|
|
public BlockState getBlockState(BlockPos pos) {
|
|
|
|
return this.wrapped.getBlockState(pos);
|
|
|
|
}
|
|
|
|
+ // Paper start
|
2021-12-06 00:32:02 +01:00
|
|
|
+ @Override
|
|
|
|
+ public final BlockState getBlockState(final int x, final int y, final int z) {
|
|
|
|
+ return this.wrapped.getBlockStateFinal(x, y, z);
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public FluidState getFluidState(BlockPos pos) {
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
|
2023-09-21 22:14:58 +02:00
|
|
|
index 0b246935d0ad3f8a78e86f0e60f53a05efda8355..d84b4051ee5177e9916199ec11445fc6c9a18936 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
|
2023-06-07 20:49:17 +02:00
|
|
|
@@ -295,12 +295,29 @@ public class LevelChunk extends ChunkAccess {
|
2022-06-07 21:55:39 +02:00
|
|
|
}
|
2021-06-11 14:02:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
+ // Paper start - Optimize getBlockData to reduce instructions
|
2021-06-12 04:24:43 +02:00
|
|
|
@Override
|
2021-06-11 14:02:28 +02:00
|
|
|
public BlockState getBlockState(BlockPos pos) {
|
|
|
|
- int i = pos.getX();
|
|
|
|
- int j = pos.getY();
|
|
|
|
- int k = pos.getZ();
|
2021-12-06 00:32:02 +01:00
|
|
|
+ return this.getBlockStateFinal(pos.getX(), pos.getY(), pos.getZ());
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
2023-03-23 22:57:03 +01:00
|
|
|
+
|
2021-12-06 00:32:02 +01:00
|
|
|
+ @Override
|
|
|
|
+ public BlockState getBlockState(final int x, final int y, final int z) {
|
|
|
|
+ return this.getBlockStateFinal(x, y, z);
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
2021-12-06 00:32:02 +01:00
|
|
|
+ public final BlockState getBlockStateFinal(final int x, final int y, final int z) {
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // Method body / logic copied from below
|
2021-06-12 04:24:43 +02:00
|
|
|
+ final int i = this.getSectionIndex(y);
|
2021-12-06 00:32:02 +01:00
|
|
|
+ if (i < 0 || i >= this.sections.length || this.sections[i].nonEmptyBlockCount == 0 || this.sections[i].hasOnlyAir()) {
|
2021-06-11 14:02:28 +02:00
|
|
|
+ return Blocks.AIR.defaultBlockState();
|
|
|
|
+ }
|
|
|
|
+ // Inlined ChunkSection.getType() and DataPaletteBlock.a(int,int,int)
|
|
|
|
+ return this.sections[i].states.get((y & 15) << 8 | (z & 15) << 4 | x & 15);
|
2023-03-23 22:57:03 +01:00
|
|
|
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
|
|
|
+
|
2021-12-06 00:32:02 +01:00
|
|
|
+ public BlockState getBlockState_unused(int i, int j, int k) {
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // Paper end
|
2021-06-12 04:24:43 +02:00
|
|
|
if (this.level.isDebug()) {
|
2021-06-11 14:02:28 +02:00
|
|
|
BlockState iblockdata = null;
|
|
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java
|
2023-06-07 20:49:17 +02:00
|
|
|
index d59392c322936ce89b759ac9787c8f4f0b228af6..2c3ea88bac229df67bd742e16d2106d80bcc8889 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java
|
2023-06-07 20:49:17 +02:00
|
|
|
@@ -19,7 +19,7 @@ public class LevelChunkSection {
|
|
|
|
public static final int SECTION_HEIGHT = 16;
|
2021-06-12 04:24:43 +02:00
|
|
|
public static final int SECTION_SIZE = 4096;
|
2021-11-23 13:15:10 +01:00
|
|
|
public static final int BIOME_CONTAINER_BITS = 2;
|
2021-06-11 14:02:28 +02:00
|
|
|
- private short nonEmptyBlockCount;
|
|
|
|
+ short nonEmptyBlockCount; // Paper - package-private
|
|
|
|
private short tickingBlockCount;
|
|
|
|
private short tickingFluidCount;
|
2021-11-23 13:15:10 +01:00
|
|
|
public final PalettedContainer<BlockState> states;
|
2021-06-11 14:02:28 +02:00
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/chunk/ProtoChunk.java b/src/main/java/net/minecraft/world/level/chunk/ProtoChunk.java
|
2023-09-22 19:31:02 +02:00
|
|
|
index c8ae8c26b34671f54e40b349f4b0741bd40035f8..b3b9d44c90e802caf1e7fcf0f17a46add2717107 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/ProtoChunk.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/ProtoChunk.java
|
2023-06-07 20:49:17 +02:00
|
|
|
@@ -92,14 +92,18 @@ public class ProtoChunk extends ChunkAccess {
|
2021-06-11 14:02:28 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public BlockState getBlockState(BlockPos pos) {
|
|
|
|
- int i = pos.getY();
|
2021-06-12 04:24:43 +02:00
|
|
|
- if (this.isOutsideBuildHeight(i)) {
|
|
|
|
+ // Paper start
|
2021-12-06 00:32:02 +01:00
|
|
|
+ return getBlockState(pos.getX(), pos.getY(), pos.getZ());
|
2021-06-11 14:02:28 +02:00
|
|
|
+ }
|
2021-12-06 00:32:02 +01:00
|
|
|
+ public BlockState getBlockState(final int x, final int y, final int z) {
|
2021-06-12 04:24:43 +02:00
|
|
|
+ if (this.isOutsideBuildHeight(y)) {
|
2021-06-11 14:02:28 +02:00
|
|
|
return Blocks.VOID_AIR.defaultBlockState();
|
|
|
|
} else {
|
2021-11-23 13:15:10 +01:00
|
|
|
- LevelChunkSection levelChunkSection = this.getSection(this.getSectionIndex(i));
|
|
|
|
- return levelChunkSection.hasOnlyAir() ? Blocks.AIR.defaultBlockState() : levelChunkSection.getBlockState(pos.getX() & 15, i & 15, pos.getZ() & 15);
|
|
|
|
+ LevelChunkSection levelChunkSection = this.getSections()[this.getSectionIndex(y)];
|
|
|
|
+ return levelChunkSection.hasOnlyAir() ? Blocks.AIR.defaultBlockState() : levelChunkSection.getBlockState(x & 15, y & 15, z & 15);
|
2021-06-11 14:02:28 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
+ // Paper end
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public FluidState getFluidState(BlockPos pos) {
|