From a4fdf196d76127cfb301fffa8794049065905991 Mon Sep 17 00:00:00 2001 From: tildejustin Date: Mon, 23 Feb 2026 14:27:38 -0500 Subject: [PATCH 01/11] disable entity culling and fog occlusion vanilla video settings screen entries by default --- .../jellysquid/mods/sodium/client/gui/SodiumGameOptions.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/me/jellysquid/mods/sodium/client/gui/SodiumGameOptions.java b/src/main/java/me/jellysquid/mods/sodium/client/gui/SodiumGameOptions.java index c0b49b19..2f441395 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/gui/SodiumGameOptions.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/gui/SodiumGameOptions.java @@ -46,8 +46,8 @@ public static class QualitySettings implements SpeedrunConfigStorage { public static class SpeedrunSettings implements SpeedrunConfigStorage { public boolean usePlanarFog = true; - public boolean showEntityCulling = true; - public boolean showFogOcclusion = true; + public boolean showEntityCulling = false; + public boolean showFogOcclusion = false; } { From 8b7007aa42edb1342c0f33ca87b20a3bdf429dd3 Mon Sep 17 00:00:00 2001 From: tildejustin Date: Mon, 23 Feb 2026 14:28:35 -0500 Subject: [PATCH 02/11] better vignette description --- src/main/resources/assets/sodium/lang/en_us.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/sodium/lang/en_us.json b/src/main/resources/assets/sodium/lang/en_us.json index a6b497ef..9df85be7 100644 --- a/src/main/resources/assets/sodium/lang/en_us.json +++ b/src/main/resources/assets/sodium/lang/en_us.json @@ -3,7 +3,7 @@ "speedrunapi.config.sodium.category.advanced": "Advanced", "speedrunapi.config.sodium.category.speedrun": "Speedrun", "speedrunapi.config.sodium.option.quality:enableVignette": "Vignette", - "speedrunapi.config.sodium.option.quality:enableVignette.description": "If enabled, a vignette effect will be rendered on the player's view. This is very unlikely to make a difference to frame rates unless you are fill-rate limited.", + "speedrunapi.config.sodium.option.quality:enableVignette.description": "If disabled, the vignette effect will not be rendered on Fancy graphics. This is very unlikely to make a difference to frame rates unless you are fill-rate limited.", "speedrunapi.config.sodium.option.advanced:initialChunkThreads": "Initial Chunk Threads", "speedrunapi.config.sodium.option.advanced:initialChunkThreads.description": "How many chunk building threads to create instantly when reloading (lower = less F3 + F lag). Cannot be more than Target Chunk Threads.", "speedrunapi.config.sodium.option.advanced:initialChunkThreads.value.0": "Auto", From 36b3f2bf0e355be955d0eaa5be4713b91dc41290 Mon Sep 17 00:00:00 2001 From: tildejustin Date: Mon, 23 Feb 2026 14:28:45 -0500 Subject: [PATCH 03/11] remove newline from fmj description --- src/main/resources/fabric.mod.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index eb9a51b8..f96b98ef 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -3,7 +3,7 @@ "id": "sodium", "version": "${version}", "name": "Sodium", - "description": "Sodium is a free and open-source optimization mod for Minecraft which improves frame rates and reduces lag spikes. \nThis is an unofficial backport of JellySquid's original mod.", + "description": "Sodium is a free and open-source optimization mod for Minecraft which improves frame rates and reduces lag spikes. This is an unofficial backport of JellySquid's original mod.", "authors": [ { "name": "jellysquid3", From 19899a468a2482d8b611827b1d51f702bb5c862b Mon Sep 17 00:00:00 2001 From: tildejustin Date: Mon, 23 Feb 2026 14:30:32 -0500 Subject: [PATCH 04/11] remove e: -1 when entity culling is on --- .../mixin/features/block/MixinWorldRenderer.java | 14 -------------- .../smooth_lighting/MixinEntityRenderer.java | 14 +++++++++----- .../accessor/WorldRendererAccessor.java | 14 ++++++++++++++ src/main/resources/sodium.mixins.json | 1 + 4 files changed, 24 insertions(+), 19 deletions(-) create mode 100644 src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/smooth_lighting/accessor/WorldRendererAccessor.java diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/block/MixinWorldRenderer.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/block/MixinWorldRenderer.java index f2af6efd..3709ab2a 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/block/MixinWorldRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/block/MixinWorldRenderer.java @@ -1,6 +1,5 @@ package me.jellysquid.mods.sodium.mixin.features.block; -import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; import me.jellysquid.mods.sodium.client.render.pipeline.context.ChunkRenderCacheShared; import net.minecraft.client.render.Camera; import net.minecraft.client.render.GameRenderer; @@ -9,17 +8,12 @@ import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.math.Matrix4f; 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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(WorldRenderer.class) public class MixinWorldRenderer { - @Shadow - private int regularEntityCount; - /** * Reset any global cached state before rendering a frame. This will hopefully ensure that any world state that has * changed is reflected in vanilla-style rendering. @@ -30,12 +24,4 @@ private void reset(MatrixStack matrices, float tickDelta, long limitTime, boolea CallbackInfo ci) { ChunkRenderCacheShared.resetCaches(); } - - @Redirect(method = "getEntitiesDebugString", at = @At(value = "FIELD", target = "Lnet/minecraft/client/render/WorldRenderer;regularEntityCount:I")) - private int hidEntityCount(WorldRenderer instance) { - if(SodiumWorldRenderer.getInstance().getUseEntityCulling()){ - return -1; - } - return this.regularEntityCount; - } } diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/smooth_lighting/MixinEntityRenderer.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/smooth_lighting/MixinEntityRenderer.java index 9637fc71..08f8185e 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/smooth_lighting/MixinEntityRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/smooth_lighting/MixinEntityRenderer.java @@ -1,8 +1,10 @@ package me.jellysquid.mods.sodium.mixin.features.entity.smooth_lighting; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import me.jellysquid.mods.sodium.client.model.light.EntityLighter; import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; import me.jellysquid.mods.sodium.client.render.entity.EntityLightSampler; +import me.jellysquid.mods.sodium.mixin.features.entity.smooth_lighting.accessor.WorldRendererAccessor; import net.minecraft.client.MinecraftClient; import net.minecraft.client.options.AoOption; import net.minecraft.client.render.Frustum; @@ -31,13 +33,15 @@ private void preGetLight(T entity, float tickDelta, CallbackInfoReturnable cir) { + @ModifyExpressionValue(method = "shouldRender", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/Frustum;isVisible(Lnet/minecraft/util/math/Box;)Z")) + private boolean preShouldRender(boolean original, T entity, Frustum frustum, double x, double y, double z) { // If the entity isn't culled already by other means, try to perform a second pass - if (cir.getReturnValue() && !SodiumWorldRenderer.getInstance().isEntityVisible(entity)) { -// MinecraftClient.getInstance().worldRenderer.regularEntityCount++; - cir.setReturnValue(false); + if (original && !SodiumWorldRenderer.getInstance().isEntityVisible(entity)) { + WorldRendererAccessor wra = ((WorldRendererAccessor) MinecraftClient.getInstance().worldRenderer); + wra.setRegularEntityCount(wra.getRegularEntityCount() + 1); + return false; } + return original; } @Override diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/smooth_lighting/accessor/WorldRendererAccessor.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/smooth_lighting/accessor/WorldRendererAccessor.java new file mode 100644 index 00000000..be7fb220 --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/smooth_lighting/accessor/WorldRendererAccessor.java @@ -0,0 +1,14 @@ +package me.jellysquid.mods.sodium.mixin.features.entity.smooth_lighting.accessor; + +import net.minecraft.client.render.WorldRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(WorldRenderer.class) +public interface WorldRendererAccessor { + @Accessor + int getRegularEntityCount(); + + @Accessor + void setRegularEntityCount(int regularEntityCount); +} diff --git a/src/main/resources/sodium.mixins.json b/src/main/resources/sodium.mixins.json index 39ffb146..e5608102 100644 --- a/src/main/resources/sodium.mixins.json +++ b/src/main/resources/sodium.mixins.json @@ -42,6 +42,7 @@ "features.entity.smooth_lighting.MixinEntityRenderer", "features.entity.smooth_lighting.MixinPaintingEntityRenderer", "features.entity.smooth_lighting.MixinWorldRenderer", + "features.entity.smooth_lighting.accessor.WorldRendererAccessor", "features.gui.MixinDebugHud", "features.gui.fast_loading_screen.MixinLevelLoadingScreen", "features.gui.font.MixinGlyphRenderer", From 2d2f5fcd6cf80bfdb81437cc0d825aebbcd386d9 Mon Sep 17 00:00:00 2001 From: tildejustin Date: Mon, 23 Feb 2026 14:31:17 -0500 Subject: [PATCH 05/11] show a warning on blockentity profiler if entity culling is off --- .../smooth_lighting/MixinWorldRenderer.java | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/smooth_lighting/MixinWorldRenderer.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/smooth_lighting/MixinWorldRenderer.java index 7a2a7705..ac9ecf54 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/smooth_lighting/MixinWorldRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/smooth_lighting/MixinWorldRenderer.java @@ -1,21 +1,30 @@ package me.jellysquid.mods.sodium.mixin.features.entity.smooth_lighting; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; import net.minecraft.client.render.WorldRenderer; import net.minecraft.util.profiler.Profiler; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -import java.util.Objects; @Mixin(WorldRenderer.class) public class MixinWorldRenderer { - @Redirect(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V")) - void doNothing(Profiler profiler, String location) { - if (!Objects.equals(location, "blockentities") || !SodiumWorldRenderer.getInstance().getUseEntityCulling()) { - profiler.swap(location); + @WrapWithCondition(method = "render", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", args = "ldc=blockentities")) + private boolean doNothing(Profiler profiler, String location) { + if (!SodiumWorldRenderer.getInstance().getUseEntityCulling()) { + return true; } + profiler.swap("no blockentities (entity culling is off)"); + profiler.pop(); + return false; } -} + @WrapWithCondition(method = "render", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", args = "ldc=destroyProgress")) + private boolean doNothing2(Profiler profiler, String location) { + if (!SodiumWorldRenderer.getInstance().getUseEntityCulling()) { + return true; + } + profiler.push(location); + return false; + } +} From 4523ca2e4ea4d6215f0c251b7d23f8236faf8c07 Mon Sep 17 00:00:00 2001 From: tildejustin Date: Mon, 23 Feb 2026 14:33:32 -0500 Subject: [PATCH 06/11] rebuild near chunks before rendering first frame nerfs f3+a/f to be only as good as vanilla. this prevents most accidental xrays in that mode. --- .../client/render/SodiumWorldRenderer.java | 8 ++++---- .../client/render/chunk/ChunkRenderManager.java | 17 +++++++++++++++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/SodiumWorldRenderer.java b/src/main/java/me/jellysquid/mods/sodium/client/render/SodiumWorldRenderer.java index caffb805..b03b97d2 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/SodiumWorldRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/SodiumWorldRenderer.java @@ -183,16 +183,16 @@ public void updateChunks(Camera camera, Frustum frustum, boolean hasForcedFrustu this.chunkRenderManager.unloadPending(); - profiler.swap("chunk_update"); - - this.chunkRenderManager.updateChunks(); - if (!hasForcedFrustum && this.chunkRenderManager.isDirty()) { profiler.swap("chunk_graph_rebuild"); this.chunkRenderManager.update(camera, (FrustumExtended) frustum, frame, spectator); } + profiler.swap("chunk_update"); + + this.chunkRenderManager.updateChunks(); + profiler.swap("visible_chunk_tick"); this.chunkRenderManager.tickVisibleRenders(); diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderManager.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderManager.java index 9dfd330d..5e5226cc 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderManager.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderManager.java @@ -49,7 +49,7 @@ public class ChunkRenderManager implements ChunkSt /** * The maximum distance a chunk can be from the player's camera in order to be eligible for blocking updates. */ - private static final double NEARBY_CHUNK_DISTANCE = Math.pow(48, 2.0); + private static final double NEARBY_CHUNK_DISTANCE = 768; /** * The minimum distance the culling plane can be from the player's camera. This helps to prevent mathematical @@ -399,7 +399,7 @@ private ChunkRenderContainer createChunkRender(ChunkRenderColumn column, i if (ChunkSection.isEmpty(this.world.getChunk(x, z).getSectionArray()[y])) { render.setData(ChunkRenderData.EMPTY); } else { - render.scheduleRebuild(false); + render.scheduleRebuild(this.isChunkPrioritized(render)); } render.setId(this.renders.add(render)); @@ -433,6 +433,7 @@ public boolean isChunkVisible(int x, int y, int z) { public void updateChunks() { Deque>> futures = new ArrayDeque<>(); + Deque> containers = new ArrayDeque<>(); int budget = this.builder.getSchedulingBudget(); int submitted = 0; @@ -445,6 +446,7 @@ public void updateChunks() { this.builder.deferRebuild(render); } else { futures.add(this.builder.scheduleRebuildTaskAsync(render)); + containers.add(render); } this.dirty = true; @@ -467,6 +469,14 @@ public void updateChunks() { this.backend.upload(RenderDevice.INSTANCE.createCommandList(), new FutureDequeDrain<>(futures)); } + while (!containers.isEmpty()) { + ChunkRenderContainer render = containers.poll(); + if (!render.isEmpty()) { + this.addChunkToRenderLists(render); + this.addEntitiesToRenderLists(render); + } + } + this.builder.createMoreThreads(); } @@ -479,6 +489,9 @@ public boolean isDirty() { } public void restoreChunks(LongCollection chunks) { + // set cameraXYZ so chunks can be properly prioritized in rebuild scheduling + this.setup(MinecraftClient.getInstance().gameRenderer.getCamera()); + LongIterator it = chunks.iterator(); while (it.hasNext()) { From 56b41910eb837825c92a59e781f00d561460384b Mon Sep 17 00:00:00 2001 From: tildejustin Date: Mon, 23 Feb 2026 14:33:40 -0500 Subject: [PATCH 07/11] bump version to 2.5.2 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index d396830a..c28ab23d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs = -Xmx2G org.gradle.parallel = true org.gradle.caching = true -mod_version = 2.5.1 +mod_version = 2.5.2 minecraft_version = 1.16.1 # https://github.com/tildejustin/yarn/tags From 44a3fcd8e9c3c229772e2aa1e5cc25a686278100 Mon Sep 17 00:00:00 2001 From: tildejustin Date: Mon, 23 Feb 2026 14:54:03 -0500 Subject: [PATCH 08/11] fix mixin failure with seedqueue --- .../mods/sodium/client/render/chunk/ChunkRenderManager.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderManager.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderManager.java index 5e5226cc..40185892 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderManager.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderManager.java @@ -49,7 +49,7 @@ public class ChunkRenderManager implements ChunkSt /** * The maximum distance a chunk can be from the player's camera in order to be eligible for blocking updates. */ - private static final double NEARBY_CHUNK_DISTANCE = 768; + private static final double NEARBY_CHUNK_DISTANCE; /** * The minimum distance the culling plane can be from the player's camera. This helps to prevent mathematical @@ -97,6 +97,10 @@ public class ChunkRenderManager implements ChunkSt private boolean usePlanarFog; private double fogRenderCutoff; + static { + NEARBY_CHUNK_DISTANCE = 768; // must not inline because of mixin in seedqueue + } + public ChunkRenderManager(SodiumWorldRenderer renderer, ChunkRenderBackend backend, BlockRenderPassManager renderPassManager, ClientWorld world, int renderDistance) { this.backend = backend; this.renderer = renderer; From 4848d018d242a8b27143e178f19c7ffa57f951d2 Mon Sep 17 00:00:00 2001 From: tildejustin Date: Wed, 25 Feb 2026 22:32:07 -0500 Subject: [PATCH 09/11] use per-wr cached entityculling --- .../entity/smooth_lighting/MixinWorldRenderer.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/smooth_lighting/MixinWorldRenderer.java b/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/smooth_lighting/MixinWorldRenderer.java index ac9ecf54..4c121bae 100644 --- a/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/smooth_lighting/MixinWorldRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/features/entity/smooth_lighting/MixinWorldRenderer.java @@ -1,7 +1,7 @@ package me.jellysquid.mods.sodium.mixin.features.entity.smooth_lighting; import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; -import me.jellysquid.mods.sodium.client.render.SodiumWorldRenderer; +import me.jellysquid.mods.sodium.client.world.WorldRendererExtended; import net.minecraft.client.render.WorldRenderer; import net.minecraft.util.profiler.Profiler; import org.spongepowered.asm.mixin.Mixin; @@ -11,17 +11,17 @@ public class MixinWorldRenderer { @WrapWithCondition(method = "render", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", args = "ldc=blockentities")) private boolean doNothing(Profiler profiler, String location) { - if (!SodiumWorldRenderer.getInstance().getUseEntityCulling()) { + if (!((WorldRendererExtended) this).getSodiumWorldRenderer().getUseEntityCulling()) { return true; } - profiler.swap("no blockentities (entity culling is off)"); + profiler.swap("turn off entity culling for blockentities"); profiler.pop(); return false; } @WrapWithCondition(method = "render", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", args = "ldc=destroyProgress")) private boolean doNothing2(Profiler profiler, String location) { - if (!SodiumWorldRenderer.getInstance().getUseEntityCulling()) { + if (!((WorldRendererExtended) this).getSodiumWorldRenderer().getUseEntityCulling()) { return true; } profiler.push(location); From fd2be71326b955ee515009788dfd0d46ad7e0247 Mon Sep 17 00:00:00 2001 From: tildejustin Date: Wed, 25 Feb 2026 23:27:38 -0500 Subject: [PATCH 10/11] defer uploading of immediately rescheduled sections --- .../mods/sodium/client/render/chunk/ChunkRenderManager.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderManager.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderManager.java index 40185892..e0585894 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderManager.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderManager.java @@ -164,9 +164,12 @@ private void iterateChunks(Camera camera, FrustumExtended frustum, int frame, bo } private void addChunk(ChunkRenderContainer render) { + boolean enqueued = false; if (render.needsRebuild() && render.canRebuild()) { if (render.needsImportantRebuild()) { this.importantRebuildQueue.enqueue(render); + // important rebuilds are uploaded shortly after in updateChunks, uploading them now leads to blinking + enqueued = true; } else { this.rebuildQueue.enqueue(render); } @@ -182,7 +185,7 @@ private void addChunk(ChunkRenderContainer render) { } } - if (!render.isEmpty()) { + if (!render.isEmpty() && !enqueued) { this.addChunkToRenderLists(render); this.addEntitiesToRenderLists(render); } From 888e078a9c547004c0a693f4a180bf0ad70a8aa9 Mon Sep 17 00:00:00 2001 From: tildejustin Date: Thu, 26 Feb 2026 21:22:36 -0500 Subject: [PATCH 11/11] split up updateChunks schedule deferred rebuilds before reevaluating chunk graph, upload them and run important rebuilds after --- .../client/render/SodiumWorldRenderer.java | 6 +++- .../render/chunk/ChunkRenderManager.java | 29 ++++++++++++------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/SodiumWorldRenderer.java b/src/main/java/me/jellysquid/mods/sodium/client/render/SodiumWorldRenderer.java index b03b97d2..2d5e1e79 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/SodiumWorldRenderer.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/SodiumWorldRenderer.java @@ -183,6 +183,10 @@ public void updateChunks(Camera camera, Frustum frustum, boolean hasForcedFrustu this.chunkRenderManager.unloadPending(); + profiler.swap("chunk_update"); + + this.chunkRenderManager.updateChunks(); + if (!hasForcedFrustum && this.chunkRenderManager.isDirty()) { profiler.swap("chunk_graph_rebuild"); @@ -191,7 +195,7 @@ public void updateChunks(Camera camera, Frustum frustum, boolean hasForcedFrustu profiler.swap("chunk_update"); - this.chunkRenderManager.updateChunks(); + this.chunkRenderManager.updateImportantChunks(); profiler.swap("visible_chunk_tick"); diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderManager.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderManager.java index e0585894..15cc4dfb 100644 --- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderManager.java +++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/ChunkRenderManager.java @@ -439,10 +439,28 @@ public boolean isChunkVisible(int x, int y, int z) { } public void updateChunks() { + int budget = this.builder.getSchedulingBudget(); + int submitted = 0; + + while (submitted < budget && !this.rebuildQueue.isEmpty()) { + ChunkRenderContainer render = this.rebuildQueue.dequeue(); + + this.builder.deferRebuild(render); + submitted++; + } + + this.dirty |= submitted > 0; + + // have to do some uploads here to stop flashing issues? + this.dirty |= this.builder.performPendingUploads(); + + this.builder.createMoreThreads(); + } + + public void updateImportantChunks() { Deque>> futures = new ArrayDeque<>(); Deque> containers = new ArrayDeque<>(); - int budget = this.builder.getSchedulingBudget(); int submitted = 0; while (!this.importantRebuildQueue.isEmpty()) { @@ -460,13 +478,6 @@ public void updateChunks() { submitted++; } - while (submitted < budget && !this.rebuildQueue.isEmpty()) { - ChunkRenderContainer render = this.rebuildQueue.dequeue(); - - this.builder.deferRebuild(render); - submitted++; - } - this.dirty |= submitted > 0; // Try to complete some other work on the main thread while we wait for rebuilds to complete @@ -483,8 +494,6 @@ public void updateChunks() { this.addEntitiesToRenderLists(render); } } - - this.builder.createMoreThreads(); } public void markDirty() {