From cc006ebb5d4f8ce8760d1deb1a21ba2a0dc99e78 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 4 Jan 2025 09:02:29 -0600 Subject: [PATCH] limit queued render section loading to fix memory ballooning --- .../core/render/LodRenderSection.java | 16 ++++++++++++---- .../core/render/RenderBufferHandler.java | 13 +------------ 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/LodRenderSection.java b/core/src/main/java/com/seibel/distanthorizons/core/render/LodRenderSection.java index 7978af811..555dd60e9 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/LodRenderSection.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/LodRenderSection.java @@ -47,10 +47,7 @@ import org.jetbrains.annotations.Nullable; import javax.annotation.WillNotClose; import java.awt.*; import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.RejectedExecutionException; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; import java.util.function.Supplier; /** @@ -141,6 +138,13 @@ public class LodRenderSection implements IDebugRenderable, AutoCloseable return; } + // don't queue up an infinite number of tasks + // doing so will cause memory use to balloon when swapping between dimensions + if (executor.getQueue().size() > executor.getPoolSize()) + { + return; + } + try { this.getAndBuildRenderDataFuture = CompletableFuture.runAsync(() -> @@ -423,6 +427,10 @@ public class LodRenderSection implements IDebugRenderable, AutoCloseable // cancel all in-progress futures since they aren't needed any more if (this.getAndBuildRenderDataFuture != null) { + // Note to self: + // canceling a task prevents it from running, but doesn't allow + // us to purge it from the executor it was queued in. + // As far as James can tell this appears to be a Java bug. this.getAndBuildRenderDataFuture.cancel(true); } if (this.bufferUploadFuture != null) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java index 550afbb47..6bcc793dd 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/RenderBufferHandler.java @@ -451,18 +451,7 @@ public class RenderBufferHandler implements AutoCloseable //=========// @Override - public void close() - { - Iterator> nodeIterator = this.lodQuadTree.nodeIterator(); - while (nodeIterator.hasNext()) - { - LodRenderSection renderSection = nodeIterator.next().value; - if (renderSection != null) - { - renderSection.close(); - } - } - } + public void close() { this.lodQuadTree.close(); }