Shrink oversized PalettedContainers
This commit is contained in:
parent
47e01693c5
commit
71d7004d0c
|
|
@ -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<T> {
|
||||
@Shadow private volatile PalettedContainer.Data<T> data;
|
||||
|
||||
@Shadow protected abstract PalettedContainer.Data<T> createOrReuseData(@Nullable PalettedContainer.Data<T> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -35,3 +35,4 @@ accessible method net/minecraft/resources/ResourceKey <init> (Lnet/minecraft/res
|
|||
accessible method net/minecraft/client/renderer/texture/TextureAtlasSprite <init> (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
|
||||
Loading…
Reference in New Issue
Block a user