From 38e104a9fcad0c7830ad58d0c7e5bdd2def4d444 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 14 Mar 2026 09:20:01 -0500 Subject: [PATCH] Render task handler name tracking --- .../api/internal/ClientPluginChannelApi.java | 2 +- .../bufferBuilding/LodBufferContainer.java | 4 +- .../core/render/RenderThreadTaskHandler.java | 101 +++++++++++++++--- .../render/renderer/RenderableBoxGroup.java | 2 +- 4 files changed, 90 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientPluginChannelApi.java b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientPluginChannelApi.java index 90a3a356f..f70438f61 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientPluginChannelApi.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientPluginChannelApi.java @@ -90,7 +90,7 @@ public class ClientPluginChannelApi LOGGER.info("Server level key received: [" + msg.levelKey + "]."); - RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread(() -> + RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread("ClientPluginChannelApi onLevelInitMessage", () -> { IClientLevelWrapper clientLevel = MC.getWrappedClientLevel(true); IServerKeyedClientLevel existingKeyedClientLevel = KEYED_CLIENT_LEVEL_MANAGER.getServerKeyedLevel(); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/LodBufferContainer.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/LodBufferContainer.java index 16e397082..29e0b7345 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/LodBufferContainer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/LodBufferContainer.java @@ -129,7 +129,7 @@ public class LodBufferContainer implements AutoCloseable // upload on MC's render thread - RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread(() -> + RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread("LodBufferContainer Upload", () -> { try { @@ -291,7 +291,7 @@ public class LodBufferContainer implements AutoCloseable { this.buffersUploaded = false; - RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread(() -> + RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread("LodBufferContainer Close", () -> { for (IVertexBufferWrapper buffer : this.vbos) { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/RenderThreadTaskHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/render/RenderThreadTaskHandler.java index b6fb1d413..891d9c0f4 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/RenderThreadTaskHandler.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/RenderThreadTaskHandler.java @@ -7,6 +7,8 @@ import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.util.TimerUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; +import com.seibel.distanthorizons.coreapi.ModInfo; +import org.jetbrains.annotations.Nullable; import java.util.Timer; import java.util.concurrent.ConcurrentLinkedQueue; @@ -47,23 +49,17 @@ public class RenderThreadTaskHandler //==============// //region - public void queueRunningOnRenderThread(Runnable renderCall) + public void queueRunningOnRenderThread(String name, Runnable renderCall) { - StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); - RENDER_THREAD_RUNNABLE_QUEUE.add(() -> this.createRenderThreadRunnable(renderCall, stackTrace)); - } - private void createRenderThreadRunnable(Runnable renderCall, StackTraceElement[] stackTrace) - { - try + // don't get the stacktrace on release to reduce GC pressure + StackTraceElement[] stackTrace = null; + if (ModInfo.IS_DEV_BUILD) { - renderCall.run(); - } - catch (Exception e) - { - RuntimeException error = new RuntimeException("Uncaught Exception during GL call execution:", e); - error.setStackTrace(stackTrace); - LOGGER.error("[" + Thread.currentThread().getName() + "] ran into an unexpected error running a GL call, Error: ["+ e.getMessage() +"].", error); + stackTrace = Thread.currentThread().getStackTrace(); } + + QueuedRunnable runnable = new QueuedRunnable(name, renderCall, stackTrace); + RENDER_THREAD_RUNNABLE_QUEUE.add(runnable); } //endregion @@ -136,7 +132,82 @@ public class RenderThreadTaskHandler MC.executeOnRenderThread(() -> this.runRenderThreadTasks(1_000)); } - //end region + //endregion + + + + //================// + // helper classes // + //================// + //region + + private static class QueuedRunnable implements Runnable + { + /** used to easily track what's being done on the render thread */ + public final String name; + public final Runnable renderCall; + /** will be null on release build to reduce GC pressure */ + @Nullable + public final StackTraceElement[] stackTrace; + + + + //=============// + // constructor // + //=============// + //region + + public QueuedRunnable(String name, Runnable renderCall, @Nullable StackTraceElement[] stackTrace) + { + this.name = name; + this.renderCall = renderCall; + this.stackTrace = stackTrace; + } + + //endregion + + + + //=========// + // running // + //=========// + //region + + @Override + public void run() + { + try + { + this.renderCall.run(); + } + catch (Exception e) + { + RuntimeException error = new RuntimeException("Uncaught Exception during GL call execution. StackTrace: ["+(this.stackTrace != null ? "Present" : "Missing")+"] Error: ["+e.getMessage()+"]", e); + if (this.stackTrace != null) + { + error.setStackTrace(this.stackTrace); + } + LOGGER.error("[" + Thread.currentThread().getName() + "] ran into an unexpected error running a GL call, Error: ["+ e.getMessage() +"].", error); + } + } + + //endregion + + + + //================// + // base overrides // + //================// + //region + + @Override + public String toString() { return this.name; } + + //endregion + + } + + //endregion diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/RenderableBoxGroup.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/RenderableBoxGroup.java index d935949cc..dd1f81dad 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/RenderableBoxGroup.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/RenderableBoxGroup.java @@ -346,7 +346,7 @@ public class RenderableBoxGroup @Override public void close() { - RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread(() -> + RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread("RenderBoxGroup Close", () -> { this.vertexBufferContainer.close(); this.altVertexBufferContainer.close();