Paper/patches/server/0988-Optimize-isInWorldBoun...

100 lines
5.0 KiB
Diff
Raw Normal View History

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
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
2024-04-25 11:42:10 +02:00
index 02367ef1371dde94ff6c4cd40bd32e800d6ccaaf..7b0fc7135bc107103dcaed6dc0707b1829928fae 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
2024-04-25 11:42:10 +02:00
@@ -28,6 +28,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
+ 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
2024-04-25 21:40:53 +02:00
index d3137c9e5cc42ef191ea233b0d37eafeffc6f82c..eb7df68d146f9e841bdf99fa2d85fb4b04e603ce 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
2024-04-25 21:40:53 +02:00
@@ -339,7 +339,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);
+ 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
2024-04-25 11:42:10 +02:00
index 1f8c72b6c7d8683d67880fa175843c73b3d39b78..383dc47c81b3f34e8166bce180a51a2ccbfaf6ca 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
2024-04-25 11:42:10 +02:00
@@ -175,6 +175,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
+ 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/ImposterProtoChunk.java b/src/main/java/net/minecraft/world/level/chunk/ImposterProtoChunk.java
2024-04-25 11:42:10 +02:00
index aa5dee839d4c0dbc3c2abee9b501ec250c575cb3..6359d2d80f4c1360f8450bf6555ccfea3b69daa5 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
2024-04-25 11:42:10 +02:00
@@ -99,6 +99,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
+ @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/ProtoChunk.java b/src/main/java/net/minecraft/world/level/chunk/ProtoChunk.java
2024-04-25 11:42:10 +02:00
index 576ae0cb138b265c8a3995de7b5ebc827d50949d..bfdee41d3095a869408abc89a6085556ff188d8d 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
2024-04-25 11:42:10 +02:00
@@ -97,14 +97,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
+ return getBlockState(pos.getX(), pos.getY(), pos.getZ());
2021-06-11 14:02:28 +02: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) {