diff --git a/jmh-benchmarks/src/jmh/java/net/minestom/jmh/palette/PaletteGetBenchmark.java b/jmh-benchmarks/src/jmh/java/net/minestom/jmh/palette/PaletteGetBenchmark.java index e9c2b806e..29010c9b5 100644 --- a/jmh-benchmarks/src/jmh/java/net/minestom/jmh/palette/PaletteGetBenchmark.java +++ b/jmh-benchmarks/src/jmh/java/net/minestom/jmh/palette/PaletteGetBenchmark.java @@ -14,7 +14,7 @@ import java.util.concurrent.TimeUnit; @State(Scope.Benchmark) public class PaletteGetBenchmark { - @Param({"4", "8", "16"}) + @Param({"4", "16"}) public int dimension; private Palette palette; diff --git a/jmh-benchmarks/src/jmh/java/net/minestom/jmh/palette/PaletteSetBenchmark.java b/jmh-benchmarks/src/jmh/java/net/minestom/jmh/palette/PaletteSetBenchmark.java index 7621cf584..f81f2f2dc 100644 --- a/jmh-benchmarks/src/jmh/java/net/minestom/jmh/palette/PaletteSetBenchmark.java +++ b/jmh-benchmarks/src/jmh/java/net/minestom/jmh/palette/PaletteSetBenchmark.java @@ -13,7 +13,7 @@ import java.util.concurrent.TimeUnit; @State(Scope.Benchmark) public class PaletteSetBenchmark { - @Param({"4", "8", "16"}) + @Param({"4", "16"}) public int dimension; private Palette palette; diff --git a/src/main/java/net/minestom/server/instance/palette/PaletteImpl.java b/src/main/java/net/minestom/server/instance/palette/PaletteImpl.java index c3ce194ba..019d6217e 100644 --- a/src/main/java/net/minestom/server/instance/palette/PaletteImpl.java +++ b/src/main/java/net/minestom/server/instance/palette/PaletteImpl.java @@ -84,12 +84,34 @@ final class PaletteImpl implements Palette, Cloneable { @Override public void getAll(@NotNull EntryConsumer consumer) { - // TODO optimize - for (int x = 0; x < dimension; x++) { - for (int y = 0; y < dimension; y++) { - for (int z = 0; z < dimension; z++) { - consumer.accept(x, y, z, get(x, y, z)); - } + long[] values = this.values; + if (values.length == 0) { + // No values, give all 0 to make the consumer happy + for (int y = 0; y < dimension; y++) + for (int z = 0; z < dimension; z++) + for (int x = 0; x < dimension; x++) + consumer.accept(x, y, z, 0); + return; + } + final int bitsPerEntry = this.bitsPerEntry; + final int magicMask = MAGIC_MASKS[bitsPerEntry]; + final int valuesPerLong = VALUES_PER_LONG[bitsPerEntry]; + + final int dimensionMinus = dimension - 1; + + for (int i = 0; i < values.length; i++) { + final long value = values[i]; + for (int j = 0; j < valuesPerLong; j++) { + final int index = i * valuesPerLong + j; + final int y = index >> (dimensionBitCount << 1); + final int z = (index >> (dimensionBitCount)) & dimensionMinus; + final int x = index & dimensionMinus; + if(y >= dimension) + return; // + final int bitIndex = j * bitsPerEntry; + final short paletteIndex = (short) (value >> bitIndex & magicMask); + final int result = hasPalette ? paletteToValueList.getInt(paletteIndex) : paletteIndex; + consumer.accept(x, y, z, result); } } } @@ -170,9 +192,9 @@ final class PaletteImpl implements Palette, Cloneable { @Override public void setAll(@NotNull EntrySupplier supplier) { // TODO optimize - for (int x = 0; x < dimension; x++) { - for (int y = 0; y < dimension; y++) { - for (int z = 0; z < dimension; z++) { + for (int y = 0; y < dimension; y++) { + for (int z = 0; z < dimension; z++) { + for (int x = 0; x < dimension; x++) { set(x, y, z, supplier.get(x, y, z)); } } @@ -188,9 +210,9 @@ final class PaletteImpl implements Palette, Cloneable { @Override public void replaceAll(@NotNull EntryFunction function) { // TODO optimize - for (int x = 0; x < dimension; x++) { - for (int y = 0; y < dimension; y++) { - for (int z = 0; z < dimension; z++) { + for (int y = 0; y < dimension; y++) { + for (int z = 0; z < dimension; z++) { + for (int x = 0; x < dimension; x++) { set(x, y, z, function.apply(x, y, z, get(x, y, z))); } } @@ -261,9 +283,9 @@ final class PaletteImpl implements Palette, Cloneable { private void resize(int newBitsPerEntry) { newBitsPerEntry = fixBitsPerEntry(newBitsPerEntry); PaletteImpl palette = new PaletteImpl(dimension, maxBitsPerEntry, newBitsPerEntry, bitsIncrement); - for (int x = 0; x < dimension; x++) { - for (int y = 0; y < dimension; y++) { - for (int z = 0; z < dimension; z++) { + for (int y = 0; y < dimension; y++) { + for (int z = 0; z < dimension; z++) { + for (int x = 0; x < dimension; x++) { palette.set(x, y, z, get(x, y, z)); } }