122 Zeilen
5.2 KiB
Diff
122 Zeilen
5.2 KiB
Diff
|
From 48a682eac7e1502586e5edae0c1233ae181823df Mon Sep 17 00:00:00 2001
|
||
|
From: Aikar <aikar@aikar.co>
|
||
|
Date: Thu, 3 Mar 2016 02:07:55 -0600
|
||
|
Subject: [PATCH] Optimize isValidLocation, getType and getBlockData for inling
|
||
|
|
||
|
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/server/BaseBlockPosition.java b/src/main/java/net/minecraft/server/BaseBlockPosition.java
|
||
|
index 2852a17f2..7cb46d7a9 100644
|
||
|
--- a/src/main/java/net/minecraft/server/BaseBlockPosition.java
|
||
|
+++ b/src/main/java/net/minecraft/server/BaseBlockPosition.java
|
||
|
@@ -10,6 +10,14 @@ public class BaseBlockPosition implements Comparable<BaseBlockPosition> {
|
||
|
private final int a;
|
||
|
private final int b;
|
||
|
private final int c;
|
||
|
+ // Paper start
|
||
|
+ public boolean isValidLocation() {
|
||
|
+ return a >= -30000000 && c >= -30000000 && a < 30000000 && c < 30000000 && b >= 0 && b < 256;
|
||
|
+ }
|
||
|
+ public boolean isInvalidYLocation() {
|
||
|
+ return b < 0 || b >= 256;
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
|
||
|
public BaseBlockPosition(int i, int j, int k) {
|
||
|
this.a = i;
|
||
|
diff --git a/src/main/java/net/minecraft/server/BlockPosition.java b/src/main/java/net/minecraft/server/BlockPosition.java
|
||
|
index c927d524a..64700b97c 100644
|
||
|
--- a/src/main/java/net/minecraft/server/BlockPosition.java
|
||
|
+++ b/src/main/java/net/minecraft/server/BlockPosition.java
|
||
|
@@ -339,6 +339,16 @@ public class BlockPosition extends BaseBlockPosition implements MinecraftSeriali
|
||
|
protected int b;
|
||
|
protected int c;
|
||
|
protected int d;
|
||
|
+ // Paper start
|
||
|
+ @Override
|
||
|
+ public boolean isValidLocation() {
|
||
|
+ return b >= -30000000 && d >= -30000000 && b < 30000000 && d < 30000000 && c >= 0 && c < 256;
|
||
|
+ }
|
||
|
+ @Override
|
||
|
+ public boolean isInvalidYLocation() {
|
||
|
+ return c < 0 || c >= 256;
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
|
||
|
public MutableBlockPosition() {
|
||
|
this(0, 0, 0);
|
||
|
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
|
||
|
index 9433d04f4..98ec98e02 100644
|
||
|
--- a/src/main/java/net/minecraft/server/Chunk.java
|
||
|
+++ b/src/main/java/net/minecraft/server/Chunk.java
|
||
|
@@ -232,12 +232,24 @@ public class Chunk implements IChunkAccess {
|
||
|
return this.sections;
|
||
|
}
|
||
|
|
||
|
- @Override
|
||
|
- public IBlockData getType(BlockPosition blockposition) {
|
||
|
- int i = blockposition.getX();
|
||
|
- int j = blockposition.getY();
|
||
|
- int k = blockposition.getZ();
|
||
|
+ // Paper start - Optimize getBlockData to reduce instructions
|
||
|
+ public final IBlockData getBlockData(BlockPosition pos) { return getBlockData(pos.getX(), pos.getY(), pos.getZ()); } // Paper
|
||
|
+ public final IBlockData getType(BlockPosition blockposition) {
|
||
|
+ return this.getBlockData(blockposition.getX(), blockposition.getY(), blockposition.getZ());
|
||
|
+ }
|
||
|
|
||
|
+ public final IBlockData getBlockData(final int x, final int y, final int z) {
|
||
|
+ // Method body / logic copied from below
|
||
|
+ final int i = y >> 4;
|
||
|
+ if (y >= 0 && i < this.sections.length && this.sections[i] != null) {
|
||
|
+ // Inlined ChunkSection.getType() and DataPaletteBlock.a(int,int,int)
|
||
|
+ return this.sections[i].blockIds.a((y & 15) << 8 | (z & 15) << 4 | x & 15);
|
||
|
+ }
|
||
|
+ return Blocks.AIR.getBlockData();
|
||
|
+ }
|
||
|
+
|
||
|
+ public IBlockData getBlockData_unused(int i, int j, int k) {
|
||
|
+ // Paper end
|
||
|
if (this.world.P() == WorldType.DEBUG_ALL_BLOCK_STATES) {
|
||
|
IBlockData iblockdata = null;
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/server/ChunkSection.java b/src/main/java/net/minecraft/server/ChunkSection.java
|
||
|
index c973ab607..0d7eab0e0 100644
|
||
|
--- a/src/main/java/net/minecraft/server/ChunkSection.java
|
||
|
+++ b/src/main/java/net/minecraft/server/ChunkSection.java
|
||
|
@@ -9,7 +9,7 @@ public class ChunkSection {
|
||
|
private short nonEmptyBlockCount;
|
||
|
private short tickingBlockCount;
|
||
|
private short e;
|
||
|
- private final DataPaletteBlock<IBlockData> blockIds;
|
||
|
+ final DataPaletteBlock<IBlockData> blockIds; // Paper - package
|
||
|
|
||
|
public ChunkSection(int i) {
|
||
|
this(i, (short) 0, (short) 0, (short) 0);
|
||
|
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
|
||
|
index cdc5d7009..78d1a5c71 100644
|
||
|
--- a/src/main/java/net/minecraft/server/World.java
|
||
|
+++ b/src/main/java/net/minecraft/server/World.java
|
||
|
@@ -197,11 +197,11 @@ public abstract class World implements IIBlockAccess, GeneratorAccess, AutoClose
|
||
|
}
|
||
|
|
||
|
public static boolean isValidLocation(BlockPosition blockposition) {
|
||
|
- return !isInsideWorld(blockposition) && blockposition.getX() >= -30000000 && blockposition.getZ() >= -30000000 && blockposition.getX() < 30000000 && blockposition.getZ() < 30000000;
|
||
|
+ return blockposition.isValidLocation(); // Paper
|
||
|
}
|
||
|
|
||
|
public static boolean isInsideWorld(BlockPosition blockposition) {
|
||
|
- return b(blockposition.getY());
|
||
|
+ return blockposition.isInvalidYLocation(); // Paper
|
||
|
}
|
||
|
|
||
|
public static boolean b(int i) {
|
||
|
--
|
||
|
2.21.0
|
||
|
|