diff options
author | Martin Robertz <dream-master@gmx.net> | 2024-05-20 13:09:07 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-20 13:09:07 +0200 |
commit | ac27780ba64058b0e8b0bb0e2d9403eaa0c4c590 (patch) | |
tree | 5adc64e1fd1a222333e9a5100e9638aa549d2be5 /src | |
parent | 5c15a6d67edec1555023c40a40411db3e3614773 (diff) | |
download | GT5-Unofficial-ac27780ba64058b0e8b0bb0e2d9403eaa0c4c590.tar.gz GT5-Unofficial-ac27780ba64058b0e8b0bb0e2d9403eaa0c4c590.tar.bz2 GT5-Unofficial-ac27780ba64058b0e8b0bb0e2d9403eaa0c4c590.zip |
Reducing allocation (#2601)
* Add IAllSidedTexturedTileEntity to reduce memory overhead for ore textures
(cherry picked from commit 274918800a3bf728e1db88e2d22b14cb6eb1a2e5)
* Cache texture for ore, since it doesn't change during the game obviously
(cherry picked from commit 45a2fe43f2cdb33fa7c0b05a4b8e4531fd2706a6)
* Reduce allocations for inventory ores rendering
(cherry picked from commit 5ed6526436e9b3a0586f37eac460f707636a102d)
---------
Co-authored-by: SKProCH <skproch@yandex.ru>
Diffstat (limited to 'src')
3 files changed, 60 insertions, 15 deletions
diff --git a/src/main/java/gregtech/api/interfaces/tileentity/IAllSidedTexturedTileEntity.java b/src/main/java/gregtech/api/interfaces/tileentity/IAllSidedTexturedTileEntity.java new file mode 100644 index 0000000000..1d00aa5d76 --- /dev/null +++ b/src/main/java/gregtech/api/interfaces/tileentity/IAllSidedTexturedTileEntity.java @@ -0,0 +1,24 @@ +package gregtech.api.interfaces.tileentity; + +import net.minecraft.block.Block; +import net.minecraftforge.common.util.ForgeDirection; + +import gregtech.api.interfaces.ITexture; + +/** + * Block which has same texture on all sides + */ +public interface IAllSidedTexturedTileEntity extends ITexturedTileEntity { + + /** + * @return the Textures rendered by the GT Rendering + */ + default ITexture[] getTexture(Block aBlock, ForgeDirection side) { + return getTexture(aBlock); + } + + /** + * @return the Textures rendered by the GT Rendering + */ + ITexture[] getTexture(Block aBlock); +} diff --git a/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java b/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java index df9734ce75..eb9ae2d694 100644 --- a/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java +++ b/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java @@ -12,7 +12,8 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.Packet; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; + +import org.jetbrains.annotations.NotNull; import gregtech.GT_Mod; import gregtech.api.GregTech_API; @@ -20,18 +21,20 @@ import gregtech.api.enums.GT_Values; import gregtech.api.enums.Materials; import gregtech.api.enums.OrePrefixes; import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.tileentity.ITexturedTileEntity; +import gregtech.api.interfaces.tileentity.IAllSidedTexturedTileEntity; import gregtech.api.objects.XSTR; import gregtech.api.render.TextureFactory; import gregtech.api.util.GT_OreDictUnificator; import gregtech.api.util.GT_Utility; -public class GT_TileEntity_Ores extends TileEntity implements ITexturedTileEntity { +public class GT_TileEntity_Ores extends TileEntity implements IAllSidedTexturedTileEntity { public short mMetaData = 0; public boolean mNatural = false; public boolean mBlocked = true; public boolean mBlockedChecked = false; + private short mMetadataForCachedTexture = -1; + private ITexture[] mCachedTexture; public static byte getHarvestData(short aMetaData, int aBaseBlockHarvestLevel) { Materials aMaterial = GregTech_API.sGeneratedMaterials[(aMetaData % 1000)]; @@ -388,9 +391,17 @@ public class GT_TileEntity_Ores extends TileEntity implements ITexturedTileEntit } @Override - public ITexture[] getTexture(Block aBlock, ForgeDirection side) { + public ITexture[] getTexture(Block aBlock) { + if (mMetadataForCachedTexture == mMetaData && mCachedTexture != null) return mCachedTexture; + + mMetadataForCachedTexture = mMetaData; + mCachedTexture = getTextureInternal(aBlock); + return mCachedTexture; + } + + private ITexture @NotNull [] getTextureInternal(Block aBlock) { Materials aMaterial = GregTech_API.sGeneratedMaterials[(this.mMetaData % 1000)]; - if ((aMaterial != null) && (this.mMetaData < 32000)) { + if ((aMaterial != null) && (this.mMetaData < 32000) && (aBlock instanceof GT_Block_Ores_Abstract)) { ITexture iTexture = TextureFactory.builder() .addIcon( aMaterial.mIconSet.mTextures[this.mMetaData / 16000 == 0 ? OrePrefixes.ore.mTextureIndex @@ -398,10 +409,8 @@ public class GT_TileEntity_Ores extends TileEntity implements ITexturedTileEntit .setRGBA(aMaterial.mRGBa) .stdOrient() .build(); - if (aBlock instanceof GT_Block_Ores_Abstract) { - return new ITexture[] { - ((GT_Block_Ores_Abstract) aBlock).getTextureSet()[((this.mMetaData / 1000) % 16)], iTexture }; - } + return new ITexture[] { ((GT_Block_Ores_Abstract) aBlock).getTextureSet()[((this.mMetaData / 1000) % 16)], + iTexture }; } return new ITexture[] { TextureFactory.of(Blocks.stone, 0), TextureFactory.builder() .addIcon(SET_NONE.mTextures[OrePrefixes.ore.mTextureIndex]) diff --git a/src/main/java/gregtech/common/render/GT_Renderer_Block.java b/src/main/java/gregtech/common/render/GT_Renderer_Block.java index 0970687c4f..da0d68d555 100644 --- a/src/main/java/gregtech/common/render/GT_Renderer_Block.java +++ b/src/main/java/gregtech/common/render/GT_Renderer_Block.java @@ -46,6 +46,7 @@ import gregtech.GT_Mod; import gregtech.api.GregTech_API; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IAllSidedTexturedTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.interfaces.tileentity.IPipeRenderedTileEntity; import gregtech.api.interfaces.tileentity.ITexturedTileEntity; @@ -88,6 +89,16 @@ public class GT_Renderer_Block implements ISimpleBlockRenderingHandler { textureArray[5] = pipeRenderedTileEntity.getTextureCovered(EAST); return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer, textureArray); } + if (tTileEntity instanceof IAllSidedTexturedTileEntity allSidedTexturedTileEntity) { + ITexture[] texture = allSidedTexturedTileEntity.getTexture(aBlock); + textureArray[0] = texture; + textureArray[1] = texture; + textureArray[2] = texture; + textureArray[3] = texture; + textureArray[4] = texture; + textureArray[5] = texture; + return renderStandardBlock(aWorld, aX, aY, aZ, aBlock, aRenderer, textureArray); + } if (tTileEntity instanceof ITexturedTileEntity texturedTileEntity) { textureArray[0] = texturedTileEntity.getTexture(aBlock, DOWN); textureArray[1] = texturedTileEntity.getTexture(aBlock, UP); @@ -545,12 +556,13 @@ public class GT_Renderer_Block implements ISimpleBlockRenderingHandler { aBlock.setBlockBoundsForItemRender(); aRenderer.setRenderBoundsFromBlock(aBlock); // spotless:off - renderNegativeYFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, ForgeDirection.DOWN), true); - renderPositiveYFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, ForgeDirection.UP), true); - renderNegativeZFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, ForgeDirection.NORTH), true); - renderPositiveZFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, ForgeDirection.SOUTH), true); - renderNegativeXFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, ForgeDirection.WEST), true); - renderPositiveXFacing(null, aRenderer, aBlock, 0, 0, 0, tTileEntity.getTexture(aBlock, ForgeDirection.EAST), true); + ITexture[] texture = tTileEntity.getTexture(aBlock); + renderNegativeYFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); + renderPositiveYFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); + renderNegativeZFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); + renderPositiveZFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); + renderNegativeXFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); + renderPositiveXFacing(null, aRenderer, aBlock, 0, 0, 0, texture, true); // spotless:on } else if (aMeta > 0 && (aMeta < GregTech_API.METATILEENTITIES.length) && aBlock instanceof GT_Block_Machines |