From 2481467c1a14bde37840eaea8591d96e1d98af62 Mon Sep 17 00:00:00 2001 From: Toffikk Date: Tue, 11 Mar 2025 19:05:58 +0100 Subject: [PATCH 1/4] Memory optimization: Lazy initialization of ShortList Port of https://github.com/PaperMC/Paper/pull/11500 --- .../block_counting/LevelChunkSectionMixin.java | 17 +++++++++++++++-- .../mixin/random_ticking/ServerLevelMixin.java | 4 ++++ .../BlockCountingChunkSection.java | 2 ++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java index 12311505..3d12a319 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java @@ -65,7 +65,16 @@ abstract class LevelChunkSectionMixin implements BlockCountingChunkSection { private short specialCollidingBlocks; @Unique - private final ShortList tickingBlocks = new ShortList(); + private ShortList tickingBlocks = null; + + @Override + public boolean anyTickingBlocks() { + return tickingBlocks != null; + } + + private void createTickingBlocks() { + if (tickingBlocks == null) tickingBlocks = new ShortList(); + } @Override public final boolean moonrise$hasSpecialCollidingBlocks() { @@ -74,6 +83,7 @@ abstract class LevelChunkSectionMixin implements BlockCountingChunkSection { @Override public final ShortList moonrise$getTickingBlockList() { + this.createTickingBlocks(); return this.tickingBlocks; } @@ -117,8 +127,10 @@ private void updateBlockCallback(final int x, final int y, final int z, final Bl final short position = (short)(x | (z << 4) | (y << (4+4))); if (oldTicking) { + this.createTickingBlocks(); tickingBlocks.remove(position); } else { + this.createTickingBlocks(); tickingBlocks.add(position); } } @@ -150,7 +162,7 @@ public void recalcBlockCounts() { this.tickingBlockCount = (short)0; this.tickingFluidCount = (short)0; this.specialCollidingBlocks = (short)0; - this.tickingBlocks.clear(); + this.tickingBlocks = null; if (this.maybeHas((final BlockState state) -> !state.isAir())) { final PalettedContainer.Data data = this.states.data; @@ -193,6 +205,7 @@ public void recalcBlockCounts() { Objects.checkFromToIndex(0, paletteCount, rawLen); for (int i = 0; i < paletteCount; ++i) { + this.createTickingBlocks(); tickingBlocks.add(raw[i]); } } diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/random_ticking/ServerLevelMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/random_ticking/ServerLevelMixin.java index b861d52b..54abf122 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/random_ticking/ServerLevelMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/random_ticking/ServerLevelMixin.java @@ -85,6 +85,10 @@ private LevelChunkSection[] optimiseRandomTick(final LevelChunk chunk, final LevelChunkSection section = sections[sectionIndex]; final PalettedContainer states = section.states; if (!section.isRandomlyTickingBlocks()) { + continue; + } + + if (!((BlockCountingChunkSection)section).anyTickingBlocks()) { continue; } diff --git a/src/main/java/ca/spottedleaf/moonrise/patches/block_counting/BlockCountingChunkSection.java b/src/main/java/ca/spottedleaf/moonrise/patches/block_counting/BlockCountingChunkSection.java index 0d1443a1..56d6d545 100644 --- a/src/main/java/ca/spottedleaf/moonrise/patches/block_counting/BlockCountingChunkSection.java +++ b/src/main/java/ca/spottedleaf/moonrise/patches/block_counting/BlockCountingChunkSection.java @@ -4,6 +4,8 @@ public interface BlockCountingChunkSection { + public boolean anyTickingBlocks(); + public boolean moonrise$hasSpecialCollidingBlocks(); public ShortList moonrise$getTickingBlockList(); From 83d589ec44146ace5759edab6401962a1338b53c Mon Sep 17 00:00:00 2001 From: Toffikk Date: Sat, 5 Apr 2025 14:21:56 +0200 Subject: [PATCH 2/4] update mixin --- .../moonrise/mixin/block_counting/LevelChunkSectionMixin.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java index 3d12a319..fff93a19 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java @@ -72,6 +72,7 @@ public boolean anyTickingBlocks() { return tickingBlocks != null; } + @Unique private void createTickingBlocks() { if (tickingBlocks == null) tickingBlocks = new ShortList(); } From 2177ddcfc7834e19c00e2fc20b670f2396a702e2 Mon Sep 17 00:00:00 2001 From: Toffikk Date: Sat, 5 Apr 2025 14:57:26 +0200 Subject: [PATCH 3/4] fix npe --- .../mixin/block_counting/LevelChunkSectionMixin.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java index fff93a19..f20fa69e 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java @@ -124,14 +124,13 @@ private void updateBlockCallback(final int x, final int y, final int z, final Bl final boolean oldTicking = oldState.isRandomlyTicking(); final boolean newTicking = newState.isRandomlyTicking(); if (oldTicking != newTicking) { + this.createTickingBlocks(); final ShortList tickingBlocks = this.tickingBlocks; final short position = (short)(x | (z << 4) | (y << (4+4))); if (oldTicking) { - this.createTickingBlocks(); tickingBlocks.remove(position); } else { - this.createTickingBlocks(); tickingBlocks.add(position); } } @@ -200,13 +199,13 @@ public void recalcBlockCounts() { final short[] raw = coordinates.elements(); final int rawLen = raw.length; + this.createTickingBlocks(); final ShortList tickingBlocks = this.tickingBlocks; tickingBlocks.setMinCapacity(Math.min((rawLen + tickingBlocks.size()) * 3 / 2, 16*16*16)); Objects.checkFromToIndex(0, paletteCount, rawLen); for (int i = 0; i < paletteCount; ++i) { - this.createTickingBlocks(); tickingBlocks.add(raw[i]); } } From 724d207ba0164438f77bb00f57430d827f85b39a Mon Sep 17 00:00:00 2001 From: Toffikk Date: Sat, 5 Apr 2025 17:04:48 +0200 Subject: [PATCH 4/4] change to avoid possible conflicts --- .../moonrise/mixin/block_counting/LevelChunkSectionMixin.java | 2 +- .../moonrise/mixin/random_ticking/ServerLevelMixin.java | 2 +- .../patches/block_counting/BlockCountingChunkSection.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java index f20fa69e..0607e212 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/block_counting/LevelChunkSectionMixin.java @@ -68,7 +68,7 @@ abstract class LevelChunkSectionMixin implements BlockCountingChunkSection { private ShortList tickingBlocks = null; @Override - public boolean anyTickingBlocks() { + public boolean moonrise$anyTickingBlocks() { return tickingBlocks != null; } diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/random_ticking/ServerLevelMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/random_ticking/ServerLevelMixin.java index 54abf122..8f68a112 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/random_ticking/ServerLevelMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/random_ticking/ServerLevelMixin.java @@ -88,7 +88,7 @@ private LevelChunkSection[] optimiseRandomTick(final LevelChunk chunk, continue; } - if (!((BlockCountingChunkSection)section).anyTickingBlocks()) { + if (!((BlockCountingChunkSection)section).moonrise$anyTickingBlocks()) { continue; } diff --git a/src/main/java/ca/spottedleaf/moonrise/patches/block_counting/BlockCountingChunkSection.java b/src/main/java/ca/spottedleaf/moonrise/patches/block_counting/BlockCountingChunkSection.java index 56d6d545..5de55a3e 100644 --- a/src/main/java/ca/spottedleaf/moonrise/patches/block_counting/BlockCountingChunkSection.java +++ b/src/main/java/ca/spottedleaf/moonrise/patches/block_counting/BlockCountingChunkSection.java @@ -4,7 +4,7 @@ public interface BlockCountingChunkSection { - public boolean anyTickingBlocks(); + public boolean moonrise$anyTickingBlocks(); public boolean moonrise$hasSpecialCollidingBlocks();