Skip to content

Commit bddc40f

Browse files
committed
reduce some object churn in rendertickhandler
1 parent a582d95 commit bddc40f

File tree

4 files changed

+65
-55
lines changed

4 files changed

+65
-55
lines changed

src/main/java/mekanism/client/render/RenderTickHandler.java

Lines changed: 32 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
import net.neoforged.neoforge.common.util.Lazy;
9494
import net.neoforged.neoforge.event.TickEvent.ClientTickEvent;
9595
import net.neoforged.neoforge.event.TickEvent.Phase;
96+
import org.jetbrains.annotations.NotNull;
9697
import org.jetbrains.annotations.Nullable;
9798
import org.joml.Matrix4f;
9899
import org.joml.Vector3f;
@@ -104,7 +105,7 @@ public class RenderTickHandler {
104105

105106
private static final Map<BlockState, List<Vertex[]>> cachedWireFrames = new HashMap<>();
106107
private static final Map<Direction, Map<TransmissionType, Model3D>> cachedOverlays = new EnumMap<>(Direction.class);
107-
private static final Map<RenderType, List<LazyRender>> transparentRenderers = new HashMap<>();
108+
private static final List<LazyRender> transparentRenderers = new ArrayList<>();
108109
private static final BoltRenderer boltRenderer = new BoltRenderer();
109110

110111
private boolean outliningArea = false;
@@ -144,8 +145,8 @@ public static void guiOpening(ScreenEvent.Opening event) {
144145
}
145146
}
146147

147-
public static void addTransparentRenderer(RenderType renderType, LazyRender render) {
148-
transparentRenderers.computeIfAbsent(renderType, r -> new ArrayList<>()).add(render);
148+
public static void addTransparentRenderer(LazyRender render) {
149+
transparentRenderers.add(render);
149150
}
150151

151152
@SubscribeEvent
@@ -162,31 +163,19 @@ public void renderWorld(RenderLevelStageEvent event) {
162163
profiler.push(ProfilerConstants.DELAYED);
163164
if (transparentRenderers.size() == 1) {
164165
//If we only have one render type we don't need to bother calculating any distances
165-
for (Entry<RenderType, List<LazyRender>> entry : transparentRenderers.entrySet()) {
166-
doTransparentRender(entry.getKey(), entry.getValue(), camera, renderer, poseStack, renderTick, partialTick, profiler);
167-
}
166+
LazyRender lazyRender = transparentRenderers.get(0);
167+
doTransparentRender(lazyRender.getRenderType(), lazyRender, camera, renderer, poseStack, renderTick, partialTick, profiler);
168168
} else {
169-
List<TransparentRenderInfo> toSort = new ArrayList<>(transparentRenderers.size());
170-
for (Entry<RenderType, List<LazyRender>> renderTypeListEntry : transparentRenderers.entrySet()) {
171-
List<LazyRender> renders = renderTypeListEntry.getValue();
172-
double closest = Double.MAX_VALUE;
173-
for (LazyRender render : renders) {
174-
Vec3 renderPos = render.getCenterPos(partialTick);
175-
if (renderPos != null) {
176-
//Note: We can just use the distance sqr as we use it for both things, so they compare the same anyway
177-
double distanceSqr = camera.getPosition().distanceToSqr(renderPos);
178-
if (distanceSqr < closest) {
179-
closest = distanceSqr;
180-
}
181-
}
182-
}
183-
//Note: we remap it in order to keep track of the closest distance so that we only have to calculate it once
184-
toSort.add(new TransparentRenderInfo(renderTypeListEntry.getKey(), renders, closest));
169+
170+
for (LazyRender render : transparentRenderers) {
171+
Vec3 renderPos = render.getCenterPos(partialTick);
172+
//Note: We can just use the distance sqr as we use it for both things, so they compare the same anyway
173+
render.distance = camera.getPosition().distanceToSqr(renderPos);
185174
}
186175
//Sort in the order of furthest to closest (reverse of by closest)
187-
toSort.sort(Comparator.comparingDouble(info -> -info.closest));
188-
for (TransparentRenderInfo apply : toSort) {
189-
apply.render(camera, renderer, poseStack, renderTick, partialTick, profiler);
176+
transparentRenderers.sort(Comparator.comparingDouble(info -> -info.distance));
177+
for (LazyRender render : transparentRenderers) {
178+
doTransparentRender(render.getRenderType(), render, camera, renderer, poseStack, renderTick, partialTick, profiler);
190179
}
191180
}
192181
transparentRenderers.clear();
@@ -541,41 +530,32 @@ private Model3D getOverlayModel(Direction side, TransmissionType type) {
541530
return model;
542531
}
543532

544-
public interface LazyRender {
533+
public static abstract class LazyRender {
545534

546-
void render(Camera camera, VertexConsumer buffer, PoseStack poseStack, int renderTick, float partialTick, ProfilerFiller profiler);
535+
public double distance;
547536

548-
@Nullable
549-
default Vec3 getCenterPos(float partialTick) {
550-
return null;
551-
}
537+
public abstract void render(Camera camera, VertexConsumer buffer, PoseStack poseStack, int renderTick, float partialTick, ProfilerFiller profiler);
552538

553-
@Nullable
554-
default String getProfilerSection() {
555-
return null;
556-
}
557-
}
539+
@NotNull
540+
public abstract Vec3 getCenterPos(float partialTick);
558541

559-
private record TransparentRenderInfo(RenderType renderType, List<LazyRender> renders, double closest) {
560-
private void render(Camera camera, MultiBufferSource.BufferSource renderer, PoseStack poseStack, int renderTick, float partialTick, ProfilerFiller profiler) {
561-
doTransparentRender(renderType, renders, camera, renderer, poseStack, renderTick, partialTick, profiler);
562-
}
542+
@NotNull
543+
public abstract String getProfilerSection();
544+
545+
@NotNull
546+
public abstract RenderType getRenderType();
563547
}
564548

565-
private static void doTransparentRender(RenderType renderType, List<LazyRender> renders, Camera camera, BufferSource renderer, PoseStack poseStack, int renderTick, float partialTick, ProfilerFiller profiler) {
549+
private static void doTransparentRender(RenderType renderType, LazyRender transparentRender, Camera camera, BufferSource renderer, PoseStack poseStack, int renderTick, float partialTick, ProfilerFiller profiler) {
566550
//Batch all renders for a single render type into a single buffer addition
567551
VertexConsumer buffer = renderer.getBuffer(renderType);
568-
for (LazyRender transparentRender : renders) {
569-
String profilerSection = transparentRender.getProfilerSection();
570-
if (profilerSection != null) {
571-
profiler.push(profilerSection);
572-
}
573-
//Note: We don't bother sorting renders in a specific render type as we assume the render type has sortOnUpload as true
574-
transparentRender.render(camera, buffer, poseStack, renderTick, partialTick, profiler);
575-
if (profilerSection != null) {
576-
profiler.pop();
577-
}
578-
}
552+
553+
String profilerSection = transparentRender.getProfilerSection();
554+
profiler.push(profilerSection);
555+
//Note: We don't bother sorting renders in a specific render type as we assume the render type has sortOnUpload as true
556+
transparentRender.render(camera, buffer, poseStack, renderTick, partialTick, profiler);
557+
profiler.pop();
558+
579559
renderer.endBatch(renderType);
580560
}
581561
}

src/main/java/mekanism/client/render/lib/effect/BillboardingEffectRenderer.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
import mekanism.client.render.RenderTickHandler.LazyRender;
99
import mekanism.common.lib.effect.CustomEffect;
1010
import net.minecraft.client.Camera;
11+
import net.minecraft.client.renderer.RenderType;
1112
import net.minecraft.resources.ResourceLocation;
1213
import net.minecraft.util.profiling.ProfilerFiller;
1314
import net.minecraft.world.phys.Vec3;
15+
import org.jetbrains.annotations.NotNull;
1416
import org.joml.Matrix4f;
1517
import org.joml.Quaternionf;
1618
import org.joml.Vector3f;
@@ -25,21 +27,29 @@ public static void render(CustomEffect effect, String profilerSection) {
2527
}
2628

2729
public static void render(ResourceLocation texture, String profilerSection, Supplier<CustomEffect> lazyEffect) {
28-
RenderTickHandler.addTransparentRenderer(MekanismRenderType.SPS.apply(texture), new LazyRender() {
30+
RenderType renderType = MekanismRenderType.SPS.apply(texture);
31+
RenderTickHandler.addTransparentRenderer(new LazyRender() {
2932
@Override
3033
public void render(Camera camera, VertexConsumer renderer, PoseStack poseStack, int renderTick, float partialTick, ProfilerFiller profiler) {
3134
BillboardingEffectRenderer.render(camera, renderer, poseStack, renderTick, partialTick, lazyEffect.get());
3235
}
3336

3437
@Override
38+
@NotNull
3539
public Vec3 getCenterPos(float partialTick) {
3640
return lazyEffect.get().getPos(partialTick);
3741
}
3842

3943
@Override
44+
@NotNull
4045
public String getProfilerSection() {
4146
return profilerSection;
4247
}
48+
49+
@Override
50+
public @NotNull RenderType getRenderType() {
51+
return renderType;
52+
}
4353
});
4454
}
4555

src/main/java/mekanism/client/render/tileentity/RenderEnergyCube.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@
1414
import net.minecraft.client.Camera;
1515
import net.minecraft.client.renderer.LightTexture;
1616
import net.minecraft.client.renderer.MultiBufferSource;
17+
import net.minecraft.client.renderer.RenderType;
1718
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
1819
import net.minecraft.util.profiling.ProfilerFiller;
1920
import net.minecraft.world.phys.Vec3;
21+
import org.jetbrains.annotations.NotNull;
2022
import org.joml.Vector3f;
2123

2224
@NothingNullByDefault
@@ -33,7 +35,7 @@ protected void render(TileEntityEnergyCube tile, float partialTicks, PoseStack m
3335
float energyScale = tile.getEnergyScale();
3436
Vec3 renderPos = tile.getBlockPos().getCenter();
3537
BaseTier baseTier = tile.getTier().getBaseTier();
36-
RenderTickHandler.addTransparentRenderer(ModelEnergyCore.BATCHED_RENDER_TYPE, new LazyRender() {
38+
RenderTickHandler.addTransparentRenderer(new LazyRender() {
3739
@Override
3840
public void render(Camera camera, VertexConsumer buffer, PoseStack poseStack, int renderTick, float partialTick, ProfilerFiller profiler) {
3941
float ticks = renderTick + partialTick;
@@ -50,14 +52,22 @@ public void render(Camera camera, VertexConsumer buffer, PoseStack poseStack, in
5052
}
5153

5254
@Override
55+
@NotNull
5356
public Vec3 getCenterPos(float partialTick) {
5457
return renderPos;
5558
}
5659

5760
@Override
61+
@NotNull
5862
public String getProfilerSection() {
5963
return ProfilerConstants.ENERGY_CUBE_CORE;
6064
}
65+
66+
@Override
67+
@NotNull
68+
public RenderType getRenderType() {
69+
return ModelEnergyCore.BATCHED_RENDER_TYPE;
70+
}
6171
});
6272
}
6373

src/main/java/mekanism/client/render/tileentity/RenderIndustrialAlarm.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
import net.minecraft.client.Camera;
1313
import net.minecraft.client.renderer.LightTexture;
1414
import net.minecraft.client.renderer.MultiBufferSource;
15+
import net.minecraft.client.renderer.RenderType;
1516
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
1617
import net.minecraft.util.profiling.ProfilerFiller;
1718
import net.minecraft.world.phys.Vec3;
19+
import org.jetbrains.annotations.NotNull;
1820

1921
@NothingNullByDefault
2022
public class RenderIndustrialAlarm extends ModelTileEntityRenderer<TileEntityIndustrialAlarm, ModelIndustrialAlarm> {
@@ -28,7 +30,7 @@ public RenderIndustrialAlarm(BlockEntityRendererProvider.Context context) {
2830
@Override
2931
protected void render(TileEntityIndustrialAlarm tile, float partialTicks, PoseStack matrix, MultiBufferSource renderer, int light, int overlayLight,
3032
ProfilerFiller profiler) {
31-
RenderTickHandler.addTransparentRenderer(model.getRenderType(), new LazyRender() {
33+
RenderTickHandler.addTransparentRenderer(new LazyRender() {
3234
@Override
3335
public void render(Camera camera, VertexConsumer buffer, PoseStack poseStack, int renderTick, float partialTick, ProfilerFiller profiler) {
3436
float rot = (renderTick + partialTick) * ROTATE_SPEED % 360;
@@ -63,15 +65,23 @@ public void render(Camera camera, VertexConsumer buffer, PoseStack poseStack, in
6365
}
6466

6567
@Override
68+
@NotNull
6669
public Vec3 getCenterPos(float partialTick) {
6770
//Centered position, does not need to be cached as it is only called once
6871
return tile.getBlockPos().getCenter();
6972
}
7073

7174
@Override
75+
@NotNull
7276
public String getProfilerSection() {
7377
return ProfilerConstants.INDUSTRIAL_ALARM;
7478
}
79+
80+
@Override
81+
@NotNull
82+
public RenderType getRenderType() {
83+
return model.getRenderType();
84+
}
7585
});
7686
}
7787

0 commit comments

Comments
 (0)