Force palette dimension to be a power of 2. Improve performance

This commit is contained in:
themode 2021-12-24 10:45:03 +01:00 committed by TheMode
parent 8ae02109b9
commit a97fda7ef0
2 changed files with 26 additions and 15 deletions

View File

@ -36,6 +36,9 @@ final class PaletteImpl implements Palette, Cloneable {
private Int2IntOpenHashMap valueToPaletteMap;
PaletteImpl(int dimension, int maxBitsPerEntry, int bitsPerEntry, int bitsIncrement) {
if (dimension < 1 || dimension % 2 != 0)
throw new IllegalArgumentException("Dimension must be positive and power of 2");
this.dimension = dimension;
this.size = dimension * dimension * dimension;
this.maxBitsPerEntry = maxBitsPerEntry;
@ -218,7 +221,6 @@ final class PaletteImpl implements Palette, Cloneable {
}
int getSectionIndex(int x, int y, int z) {
y = Math.floorMod(y, dimension);
return y << (dimension / 2) | z << (dimension / 4) | x;
}

View File

@ -1,27 +1,18 @@
package instance;
import net.minestom.server.instance.palette.Palette;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.*;
public class PaletteTest {
private List<Palette> palettes = new ArrayList<>();
@BeforeEach
public void reset() {
for (int i = 4; i < 16; i++) {
palettes.add(Palette.newPalette(i, 5, 3, 1));
}
}
@Test
public void testPlacement() {
public void placement() {
var palettes = testPalettes();
for (Palette palette : palettes) {
final int dimension = palette.dimension();
assertEquals(0, palette.get(0, 0, 0), "Default value should be 0");
@ -55,7 +46,8 @@ public class PaletteTest {
}
@Test
public void testPlacementNeg() {
public void negPlacement() {
var palettes = testPalettes();
for (Palette palette : palettes) {
assertThrows(IllegalArgumentException.class, () -> palette.set(-1, 0, 0, 64));
assertThrows(IllegalArgumentException.class, () -> palette.set(0, -1, 0, 64));
@ -68,7 +60,7 @@ public class PaletteTest {
}
@Test
public void testResize() {
public void resize() {
Palette palette = Palette.newPalette(16, 5, 2, 1);
palette.set(0, 0, 0, 1);
assertEquals(2, palette.bitsPerEntry());
@ -84,4 +76,21 @@ public class PaletteTest {
assertEquals(3, palette.get(0, 0, 2));
assertEquals(4, palette.get(0, 0, 3));
}
@Test
public void dimension() {
assertThrows(Exception.class, () -> Palette.newPalette(0, 5, 3, 1));
assertThrows(Exception.class, () -> Palette.newPalette(1, 5, 3, 1));
assertDoesNotThrow(() -> Palette.newPalette(2, 5, 3, 1));
assertThrows(Exception.class, () -> Palette.newPalette(3, 5, 3, 1));
assertDoesNotThrow(() -> Palette.newPalette(4, 5, 3, 1));
}
private static List<Palette> testPalettes() {
List<Palette> palettes = new ArrayList<>();
for (int i = 4; i < 16; i += 2) {
palettes.add(Palette.newPalette(i, 5, 3, 1));
}
return palettes;
}
}