From 71d7004d0cb6022fd46813e5571bfee6aac4b732 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Tue, 2 May 2023 19:19:57 -0400 Subject: [PATCH] Shrink oversized PalettedContainers --- .../PalettedContainerMixin.java | 39 +++++++++++++++++++ .../main/resources/modernfix.accesswidener | 1 + 2 files changed, 40 insertions(+) create mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compact_bit_storage/PalettedContainerMixin.java diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compact_bit_storage/PalettedContainerMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compact_bit_storage/PalettedContainerMixin.java new file mode 100644 index 00000000..0a74c573 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/compact_bit_storage/PalettedContainerMixin.java @@ -0,0 +1,39 @@ +package org.embeddedt.modernfix.common.mixin.perf.compact_bit_storage; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.level.chunk.PalettedContainer; +import org.jetbrains.annotations.Nullable; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@Mixin(PalettedContainer.class) +public abstract class PalettedContainerMixin { + @Shadow private volatile PalettedContainer.Data data; + + @Shadow protected abstract PalettedContainer.Data createOrReuseData(@Nullable PalettedContainer.Data data, int id); + + @Inject(method = "read(Lnet/minecraft/network/FriendlyByteBuf;)V", at = @At(value = "FIELD", target = "Lnet/minecraft/world/level/chunk/PalettedContainer;data:Lnet/minecraft/world/level/chunk/PalettedContainer$Data;", opcode = Opcodes.PUTFIELD, shift = At.Shift.AFTER), locals = LocalCapture.CAPTURE_FAILHARD) + private void validateData(FriendlyByteBuf buffer, CallbackInfo ci, int i) { + if(i <= 1) + return; + long[] storArray = this.data.storage().getRaw(); + boolean empty = true; + for (long l : storArray) { + if (l != 0) { + empty = false; + break; + } + } + if(empty && storArray.length > 0) { + /* it means the chunk is oversized and wasting memory, take the ID out of the palette and recreate a smaller chunk */ + T value = this.data.palette().valueFor(0); + this.data = this.createOrReuseData(null, 0); + this.data.palette().idFor(value); + } + } +} diff --git a/common/src/main/resources/modernfix.accesswidener b/common/src/main/resources/modernfix.accesswidener index 2949c629..3178cc0e 100644 --- a/common/src/main/resources/modernfix.accesswidener +++ b/common/src/main/resources/modernfix.accesswidener @@ -35,3 +35,4 @@ accessible method net/minecraft/resources/ResourceKey (Lnet/minecraft/res accessible method net/minecraft/client/renderer/texture/TextureAtlasSprite (Lnet/minecraft/client/renderer/texture/TextureAtlas;Lnet/minecraft/client/renderer/texture/TextureAtlasSprite$Info;IIIIILcom/mojang/blaze3d/platform/NativeImage;)V accessible field net/minecraft/client/renderer/block/model/BlockModel GSON Lcom/google/gson/Gson; accessible class net/minecraft/server/level/ChunkMap$DistanceManager +accessible class net/minecraft/world/level/chunk/PalettedContainer$Data \ No newline at end of file