From fce703579fd1a004e22cfd32b53e4b02b9ca5540 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 4 Jul 2024 21:41:57 -0500 Subject: [PATCH] Fix concurrent modification for GenericObjectRenderer --- .../renderer/GenericObjectRenderer.java | 60 ++++--------------- 1 file changed, 12 insertions(+), 48 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/GenericObjectRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/GenericObjectRenderer.java index c1d2b2f5b..6d5b8a4ec 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/GenericObjectRenderer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/GenericObjectRenderer.java @@ -58,6 +58,7 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.*; import java.util.List; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Consumer; @@ -111,9 +112,7 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister private int blockLightUniform; - // TODO may need to be double buffered to prevent rendering lag - private final Long2ReferenceOpenHashMap boxGroupById = new Long2ReferenceOpenHashMap<>(); - private final ReentrantLock mapModifyLock = new ReentrantLock(); + private final ConcurrentHashMap boxGroupById = new ConcurrentHashMap<>(); @@ -337,53 +336,19 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister RenderableBoxGroup boxGroup = (RenderableBoxGroup) iBoxGroup; - try + long id = boxGroup.getId(); + if (this.boxGroupById.containsKey(id)) { - mapModifyLock.lock(); - - long id = boxGroup.getId(); - if (this.boxGroupById.containsKey(id)) - { - throw new IllegalArgumentException("A box group with the ID [" + id + "] is already present."); - } - - this.boxGroupById.put(id, boxGroup); - - // TODO add to DB async? - } - finally - { - mapModifyLock.unlock(); + throw new IllegalArgumentException("A box group with the ID [" + id + "] is already present."); } + + this.boxGroupById.put(id, boxGroup); } @Override - public IDhApiRenderableBoxGroup remove(long id) - { - try - { - mapModifyLock.lock(); - // TODO remove from DB async? - return this.boxGroupById.remove(id); - } - finally - { - mapModifyLock.unlock(); - } - } + public IDhApiRenderableBoxGroup remove(long id) { return this.boxGroupById.remove(id); } - public void clear() - { - try - { - mapModifyLock.lock(); - this.boxGroupById.clear(); - } - finally - { - mapModifyLock.unlock(); - } - } + public void clear() { this.boxGroupById.clear(); } @@ -422,12 +387,11 @@ public class GenericObjectRenderer implements IDhApiCustomRenderRegister // rendering // - LongSet keys = boxGroupById.keySet(); - for (long key : keys) + Collection boxList = this.boxGroupById.values(); + for (RenderableBoxGroup boxGroup : boxList) { - RenderableBoxGroup boxGroup = boxGroupById.get(key); // ignore inactive groups - if (boxGroup.active) + if (boxGroup != null && boxGroup.active) { profiler.popPush("render prep"); boxGroup.preRender(renderEventParam);