From ed27422e69c5b1da4a3f8ba3500e2c4d79e73409 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Sun, 19 Jul 2020 14:21:52 +0100 Subject: [PATCH] Move IJ/xyz cache out of MainUItil to its own class --- .../bukkit/generator/BukkitPlotGenerator.java | 3 - .../plotsquared/bukkit/queue/GenChunk.java | 10 +- .../core/generator/HybridUtils.java | 3 - .../com/plotsquared/core/util/ChunkUtil.java | 93 +++++++++++++++++++ .../com/plotsquared/core/util/MainUtil.java | 47 ---------- 5 files changed, 98 insertions(+), 58 deletions(-) create mode 100644 Core/src/main/java/com/plotsquared/core/util/ChunkUtil.java diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/generator/BukkitPlotGenerator.java b/Bukkit/src/main/java/com/plotsquared/bukkit/generator/BukkitPlotGenerator.java index 60bb34b9a..47b2abc92 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/generator/BukkitPlotGenerator.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/generator/BukkitPlotGenerator.java @@ -36,7 +36,6 @@ import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.queue.ScopedLocalBlockQueue; import com.plotsquared.core.util.ChunkManager; -import com.plotsquared.core.util.MainUtil; import com.sk89q.worldedit.math.BlockVector2; import lombok.Getter; import org.bukkit.World; @@ -74,7 +73,6 @@ public class BukkitPlotGenerator extends ChunkGenerator this.populators = new ArrayList<>(); this.populators.add(new BlockStatePopulator(this.plotGenerator, this.plotAreaManager)); this.full = true; - MainUtil.initCache(); } public BukkitPlotGenerator(final String world, final ChunkGenerator cg, @Nonnull final PlotAreaManager plotAreaManager) { @@ -87,7 +85,6 @@ public class BukkitPlotGenerator extends ChunkGenerator this.full = false; this.platformGenerator = cg; this.plotGenerator = new DelegatePlotGenerator(cg, world); - MainUtil.initCache(); } @Override public void augment(PlotArea area) { diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/queue/GenChunk.java b/Bukkit/src/main/java/com/plotsquared/bukkit/queue/GenChunk.java index 3a18ec355..819b175a1 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/queue/GenChunk.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/queue/GenChunk.java @@ -31,7 +31,7 @@ import com.plotsquared.bukkit.util.BukkitUtil; import com.plotsquared.core.location.ChunkWrapper; import com.plotsquared.core.location.Location; import com.plotsquared.core.queue.ScopedLocalBlockQueue; -import com.plotsquared.core.util.MainUtil; +import com.plotsquared.core.util.ChunkUtil; import com.plotsquared.core.util.PatternUtil; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.function.pattern.Pattern; @@ -151,12 +151,12 @@ public class GenChunk extends ScopedLocalBlockQueue { } private void storeCache(final int x, final int y, final int z, final BlockState id) { - int i = MainUtil.CACHE_I[y][x][z]; + int i = y >> 4; BlockState[] v = this.result[i]; if (v == null) { this.result[i] = v = new BlockState[4096]; } - int j = MainUtil.CACHE_J[y][x][z]; + int j = ChunkUtil.getJ(x, y, z); v[j] = id; } @@ -171,7 +171,7 @@ public class GenChunk extends ScopedLocalBlockQueue { } @Override public BlockState getBlock(int x, int y, int z) { - int i = MainUtil.CACHE_I[y][x][z]; + int i = y >> 4; if (result == null) { return BukkitBlockUtil.get(chunkData.getType(x, y, z)); } @@ -179,7 +179,7 @@ public class GenChunk extends ScopedLocalBlockQueue { if (array == null) { return BlockTypes.AIR.getDefaultState(); } - int j = MainUtil.CACHE_J[y][x][z]; + int j = ChunkUtil.getJ(x, y, z); return array[j]; } diff --git a/Core/src/main/java/com/plotsquared/core/generator/HybridUtils.java b/Core/src/main/java/com/plotsquared/core/generator/HybridUtils.java index ba1fc503b..2cde7321d 100644 --- a/Core/src/main/java/com/plotsquared/core/generator/HybridUtils.java +++ b/Core/src/main/java/com/plotsquared/core/generator/HybridUtils.java @@ -45,7 +45,6 @@ import com.plotsquared.core.queue.ChunkBlockQueue; import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.queue.LocalBlockQueue; import com.plotsquared.core.util.ChunkManager; -import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.RegionManager; import com.plotsquared.core.util.RegionUtil; @@ -141,7 +140,6 @@ public class HybridUtils { final int cbz = bz >> 4; final int ctx = tx >> 4; final int ctz = tz >> 4; - MainUtil.initCache(); final int width = tx - bx + 1; final int length = tz - bz + 1; @@ -251,7 +249,6 @@ public class HybridUtils { whenDone.run(); }); System.gc(); - MainUtil.initCache(); Location botLoc = Location.at(world, bot.getX(), bot.getY(), bot.getZ()); Location topLoc = Location.at(world, top.getX(), top.getY(), top.getZ()); ChunkManager.chunkTask(botLoc, topLoc, new RunnableVal() { diff --git a/Core/src/main/java/com/plotsquared/core/util/ChunkUtil.java b/Core/src/main/java/com/plotsquared/core/util/ChunkUtil.java new file mode 100644 index 000000000..3e89c630a --- /dev/null +++ b/Core/src/main/java/com/plotsquared/core/util/ChunkUtil.java @@ -0,0 +1,93 @@ +package com.plotsquared.core.util; + +import lombok.experimental.UtilityClass; +import org.jetbrains.annotations.Range; + +/** + * This cache is used for world generation and just saves a bit of calculation time when checking if something is in the plot area. + */ +@UtilityClass +public class ChunkUtil { + + + /** + * Cache of mapping x,y,z coordinates to the chunk array
+ * - Used for efficient world generation
+ */ + private static short[] x_loc; + private static short[][] y_loc; + private static short[] z_loc; + private static short[][][] CACHE_J = null; + + static { + x_loc = new short[4096]; + y_loc = new short[16][4096]; + z_loc = new short[4096]; + for (int i = 0; i < 16; i++) { + int i4 = i << 4; + for (int j = 0; j < 4096; j++) { + int y = i4 + (j >> 8); + int a = j - ((y & 0xF) << 8); + int z1 = a >> 4; + int x1 = a - (z1 << 4); + x_loc[j] = (short) x1; + y_loc[i][j] = (short) y; + z_loc[j] = (short) z1; + } + } + CACHE_J = new short[256][16][16]; + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < 256; y++) { + short j = (short) ((y & 0xF) << 8 | z << 4 | x); + CACHE_J[y][x][z] = j; + } + } + } + } + + /** + * Get the J value for Chunk block storage from the chunk xyz coordinates. + * J is in the range 0 to 4095 where it represents a position in an array of 16x16x16 xyz (ChunkSection Array[4096]). + * + * @param x Relative x coordinate + * @param y Relative y coordinate + * @param z Relative z coordinate + * @return J value for xyz position in Array[4096]. + */ + public static int getJ(@Range(from = 0, to = 15) int x, @Range(from = 0, to = 255) int y, + @Range(from = 0, to = 15) int z) { + return CACHE_J[y][x][z]; + } + + /** + * Gets the x coordinate for a specific J value for a ChunkSection 16x16x16 xyz Array[4096]. + * + * @param j Position in the xyz Array[4096]. + * @return x coordinate within the chunk + */ + public static int getX(@Range(from = 0, to = 4095) int j) { + return x_loc[j]; + } + + /** + * Gets the y coordinate for specific I and J values for a Chunk 16x16x16x16 layerxyz Array[16][4096]. + * + * @param i Relative layer of the position in the layerxyz Array[16][4096]. + * @param j Position in the xyz Array[4096]. + * @return x coordinate within the chunk + */ + public static int getY(@Range(from = 0, to = 15) int i, @Range(from = 0, to = 4095) int j) { + return y_loc[i][j]; + } + + /** + * Gets the z coordinate for a specific J value for a ChunkSection 16x16x16 xyz Array[4096]. + * + * @param j Position in the xyz Array[4096]. + * @return z coordinate within the chunk + */ + public static int getZ(@Range(from = 0, to = 4095) int j) { + return z_loc[j]; + } +} diff --git a/Core/src/main/java/com/plotsquared/core/util/MainUtil.java b/Core/src/main/java/com/plotsquared/core/util/MainUtil.java index 010622813..2a96b7120 100644 --- a/Core/src/main/java/com/plotsquared/core/util/MainUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/MainUtil.java @@ -44,53 +44,6 @@ import javax.annotation.Nonnull; private static final Logger logger = LoggerFactory.getLogger("P2/" + MainUtil.class.getSimpleName()); - /** - * Cache of mapping x,y,z coordinates to the chunk array
- * - Used for efficient world generation
- */ - public static short[][] x_loc; - public static short[][] y_loc; - public static short[][] z_loc; - public static short[][][] CACHE_I = null; - public static short[][][] CACHE_J = null; - - /** - * This cache is used for world generation and just saves a bit of calculation time when checking if something is in the plot area. - */ - public static void initCache() { - if (x_loc == null) { - x_loc = new short[16][4096]; - y_loc = new short[16][4096]; - z_loc = new short[16][4096]; - for (int i = 0; i < 16; i++) { - int i4 = i << 4; - for (int j = 0; j < 4096; j++) { - int y = i4 + (j >> 8); - int a = j - ((y & 0xF) << 8); - int z1 = a >> 4; - int x1 = a - (z1 << 4); - x_loc[i][j] = (short) x1; - y_loc[i][j] = (short) y; - z_loc[i][j] = (short) z1; - } - } - } - if (CACHE_I == null) { - CACHE_I = new short[256][16][16]; - CACHE_J = new short[256][16][16]; - for (int x = 0; x < 16; x++) { - for (int z = 0; z < 16; z++) { - for (int y = 0; y < 256; y++) { - short i = (short) (y >> 4); - short j = (short) ((y & 0xF) << 8 | z << 4 | x); - CACHE_I[y][x][z] = i; - CACHE_J[y][x][z] = j; - } - } - } - } - } - /** * Send a message to the player. *