From cd5a3ce52b91cca240cf87b2ea68c8212f759382 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 14 Mar 2026 10:18:40 -0500 Subject: [PATCH] Try fix concurrency issue with render closing --- .../core/render/QuadTree/LodQuadTree.java | 28 +++++++++++++------ .../core/util/objects/quadTree/QuadNode.java | 11 ++++++++ 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/QuadTree/LodQuadTree.java b/core/src/main/java/com/seibel/distanthorizons/core/render/QuadTree/LodQuadTree.java index 663df4b57..393e156a7 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/QuadTree/LodQuadTree.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/QuadTree/LodQuadTree.java @@ -34,6 +34,7 @@ import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos2D; import com.seibel.distanthorizons.core.pos.DhSectionPos; import com.seibel.distanthorizons.core.render.RenderBufferHandler; +import com.seibel.distanthorizons.core.render.RenderThreadTaskHandler; import com.seibel.distanthorizons.core.render.renderer.AbstractDebugWireframeRenderer; import com.seibel.distanthorizons.core.render.renderer.BeaconRenderHandler; import com.seibel.distanthorizons.core.render.renderer.IDebugRenderable; @@ -371,16 +372,27 @@ public class LodQuadTree extends QuadTree implements IDebugRen for (QuadNode node : this.tickNodeHolder.getEnableDeleteChildrenNodes()) { - if (node == null || node.value == null) { continue; } - - node.deleteAllChildren((childRenderSection) -> + if (node == null + || node.value == null + // only clear the children if there are children to clear + || node.getDirectChildCount() == 0) { - if (childRenderSection != null) + continue; + } + + // run this on the render thread to hopefully prevent + // closing render data while rendering is happening + RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread("LodQuadTree delayed child cleanup", () -> + { + node.deleteAllChildren((childRenderSection) -> { - childRenderSection.setRenderingEnabled(false); - childRenderSection.tryDisableBeacons(); - childRenderSection.close(); - } + if (childRenderSection != null) + { + childRenderSection.setRenderingEnabled(false); + childRenderSection.tryDisableBeacons(); + childRenderSection.close(); + } + }); }); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/util/objects/quadTree/QuadNode.java b/core/src/main/java/com/seibel/distanthorizons/core/util/objects/quadTree/QuadNode.java index dccc144eb..88382be63 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/util/objects/quadTree/QuadNode.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/util/objects/quadTree/QuadNode.java @@ -86,6 +86,17 @@ public class QuadNode + /** @return the number of non-null direct child nodes */ + public int getDirectChildCount() + { + int count = 0; + if (this.nwChild != null) { count++; } + if (this.neChild != null) { count++; } + if (this.swChild != null) { count++; } + if (this.seChild != null) { count++; } + return count; + } + /** * Use {@link QuadNode#getNonNullChildCount()} if you want the number of non-null child values. *