From c462325ce63cb3a8d863d96b7fd8a134ef0945ba Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 5 Sep 2024 07:50:25 -0500 Subject: [PATCH] Add BuilderB0y's getBlockState optimization --- .../wrappers/block/BlockStateWrapper.java | 20 +++++++++++++ .../common/wrappers/chunk/ChunkWrapper.java | 19 ++++++++++++ .../wrappers/misc/MutableBlockPosWrapper.java | 30 +++++++++++++++++++ coreSubProjects | 2 +- 4 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/MutableBlockPosWrapper.java diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java index 67747d694..7bed7f5d7 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java @@ -134,6 +134,26 @@ public class BlockStateWrapper implements IBlockStateWrapper } } + /** + * Can be faster than {@link BlockStateWrapper#fromBlockState(BlockState, ILevelWrapper)} + * in cases where the same block state is expected to be referenced multiple times. + */ + public static BlockStateWrapper fromBlockState(BlockState blockState, ILevelWrapper levelWrapper, IBlockStateWrapper guess) + { + BlockState guessBlockState = (guess == null || guess.isAir()) ? null : (BlockState) guess.getWrappedMcObject(); + BlockState inputBlockState = (blockState == null || blockState.isAir()) ? null : blockState; + + if (guess instanceof BlockStateWrapper guessWrapper + && guessBlockState == inputBlockState) + { + return guessWrapper; + } + else + { + return fromBlockState(blockState, levelWrapper); + } + } + private BlockStateWrapper(BlockState blockState, ILevelWrapper levelWrapper) { this.blockState = blockState; diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java index ed9f7e038..962d8a614 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java @@ -21,6 +21,7 @@ package com.seibel.distanthorizons.common.wrappers.chunk; import com.seibel.distanthorizons.common.wrappers.block.BiomeWrapper; import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper; +import com.seibel.distanthorizons.common.wrappers.misc.MutableBlockPosWrapper; import com.seibel.distanthorizons.common.wrappers.worldGeneration.mimicObject.DhLitWorldGenRegion; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos; @@ -28,6 +29,7 @@ import com.seibel.distanthorizons.core.pos.DhChunkPos; import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.ChunkLightStorage; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IMutableBlockPosWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; @@ -84,6 +86,7 @@ public class ChunkWrapper implements IChunkWrapper /** can be used for interactions with the underlying chunk where creating new BlockPos objects could cause issues for the garbage collector. */ private static final ThreadLocal MUTABLE_BLOCK_POS_REF = ThreadLocal.withInitial(() -> new BlockPos.MutableBlockPos()); + private static final ThreadLocal MUTABLE_BLOCK_POS_WRAPPER_REF = ThreadLocal.withInitial(() -> new MutableBlockPosWrapper()); private final ChunkAccess chunk; @@ -297,6 +300,22 @@ public class ChunkWrapper implements IChunkWrapper return BlockStateWrapper.fromBlockState(this.chunk.getBlockState(blockPos), this.wrappedLevel); } + @Override + public IBlockStateWrapper getBlockState(int relX, int relY, int relZ, IMutableBlockPosWrapper mcBlockPos, IBlockStateWrapper guess) + { + this.throwIndexOutOfBoundsIfRelativePosOutsideChunkBounds(relX, relY, relZ); + + BlockPos.MutableBlockPos pos = (BlockPos.MutableBlockPos)mcBlockPos.getWrappedMcObject(); + pos.setX(relX); + pos.setY(relY); + pos.setZ(relZ); + + return BlockStateWrapper.fromBlockState(this.chunk.getBlockState(pos), this.wrappedLevel, guess); + } + + @Override + public IMutableBlockPosWrapper getMutableBlockPosWrapper() { return MUTABLE_BLOCK_POS_WRAPPER_REF.get(); } + @Override public DhChunkPos getChunkPos() { return this.chunkPos; } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/MutableBlockPosWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/MutableBlockPosWrapper.java new file mode 100644 index 000000000..d8de52924 --- /dev/null +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/MutableBlockPosWrapper.java @@ -0,0 +1,30 @@ +package com.seibel.distanthorizons.common.wrappers.misc; + +import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IMutableBlockPosWrapper; +import net.minecraft.core.BlockPos; + +public class MutableBlockPosWrapper implements IMutableBlockPosWrapper +{ + public final BlockPos.MutableBlockPos pos; + + + + //=============// + // constructor // + //=============// + + public MutableBlockPosWrapper() + { + this.pos = new BlockPos.MutableBlockPos(); + } + + + + //===========// + // overrides // + //===========// + + @Override + public Object getWrappedMcObject() { return this.pos; } + +} diff --git a/coreSubProjects b/coreSubProjects index 4712a77d0..d03a88762 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 4712a77d00fcd803e6ee61eaca55ac34c85d0dce +Subproject commit d03a8876200279227feb91c148cabdbf62fb2062