Skip to content

Commit 8c15bfa

Browse files
committed
feat: optimize tileEntity querying by caching them
1 parent 77f9ebd commit 8c15bfa

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

src/main/java/gregtech/client/renderer/scene/WorldSceneRenderer.java

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package gregtech.client.renderer.scene;
22

3+
import gregtech.api.metatileentity.IFastRenderMetaTileEntity;
4+
import gregtech.api.metatileentity.interfaces.IGregTechTileEntity;
35
import gregtech.api.util.Position;
46
import gregtech.api.util.PositionedRect;
57
import gregtech.api.util.Size;
@@ -25,6 +27,7 @@
2527
import net.minecraftforge.fml.relauncher.SideOnly;
2628

2729
import codechicken.lib.vec.Vector3;
30+
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap;
2831
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
2932
import org.jetbrains.annotations.Nullable;
3033
import org.lwjgl.opengl.GL11;
@@ -35,6 +38,7 @@
3538
import java.nio.FloatBuffer;
3639
import java.nio.IntBuffer;
3740
import java.util.Collection;
41+
import java.util.Map;
3842
import java.util.function.Consumer;
3943

4044
import javax.vecmath.Vector3f;
@@ -60,6 +64,8 @@ public abstract class WorldSceneRenderer {
6064
protected static final FloatBuffer OBJECT_POS_BUFFER = ByteBuffer.allocateDirect(3 * 4)
6165
.order(ByteOrder.nativeOrder()).asFloatBuffer();
6266

67+
// In most cases this would be empty
68+
protected static final Map<BlockPos, TileEntity> TILE_ENTITIES = new Object2ObjectArrayMap<>();
6369
public final World world;
6470
public final Collection<BlockPos> renderedBlocks = new ObjectOpenHashSet<>();
6571
protected Consumer<WorldSceneRenderer> beforeRender;
@@ -88,6 +94,15 @@ public WorldSceneRenderer setAfterWorldRender(Consumer<WorldSceneRenderer> callb
8894
public WorldSceneRenderer addRenderedBlocks(@Nullable Collection<BlockPos> blocks) {
8995
if (blocks != null) {
9096
this.renderedBlocks.addAll(blocks);
97+
TILE_ENTITIES.clear();
98+
blocks.forEach(pos -> {
99+
TileEntity tile = world.getTileEntity(pos);
100+
if (tile != null && (!(tile instanceof IGregTechTileEntity gtte) ||
101+
// Put MTEs only when it has FastRenderer
102+
gtte.getMetaTileEntity() instanceof IFastRenderMetaTileEntity)) {
103+
TILE_ENTITIES.put(pos, tile);
104+
}
105+
});
91106
}
92107
return this;
93108
}
@@ -280,18 +295,17 @@ protected void renderBlockLayer(BlockRenderLayer layer) {
280295

281296
protected void renderTileEntities() {
282297
RenderHelper.enableStandardItemLighting();
298+
var dispatcher = TileEntityRendererDispatcher.instance;
283299
for (int pass = 0; pass < 2; pass++) {
284300
ForgeHooksClient.setRenderPass(pass);
285301
setDefaultPassRenderState(pass);
286302

287-
for (BlockPos pos : renderedBlocks) { // This
288-
TileEntity tile = world.getTileEntity(pos);
289-
if (tile != null) {
290-
if (tile.shouldRenderInPass(pass)) {
291-
TileEntityRendererDispatcher.instance.render(tile, pos.getX(), pos.getY(), pos.getZ(), 0);
292-
}
303+
int finalPass = pass;
304+
TILE_ENTITIES.forEach((pos, tile) -> {
305+
if (tile.shouldRenderInPass(finalPass)) {
306+
dispatcher.render(tile, pos.getX(), pos.getY(), pos.getZ(), 0);
293307
}
294-
}
308+
});
295309
}
296310
ForgeHooksClient.setRenderPass(-1);
297311
RenderHelper.disableStandardItemLighting();

0 commit comments

Comments
 (0)