From 411d4c1db2b029c1fd0cd51b908dec0593fe86b2 Mon Sep 17 00:00:00 2001 From: extio-de Date: Tue, 23 Dec 2025 14:02:55 +0100 Subject: [PATCH] refactor(renderer): Update RendererWorkingSet to use AbstractClientModule for producer type --- .../game_engine/renderer/g2d/G2DRenderer.java | 19 ++-- .../renderer/work/RendererWorkingSet.java | 11 +-- .../renderer/work/RendererWorkingSetImpl.java | 15 ++-- .../work/RendererWorkingSetImplTest.java | 89 +++++++++++-------- 4 files changed, 77 insertions(+), 57 deletions(-) diff --git a/src/main/java/de/extio/game_engine/renderer/g2d/G2DRenderer.java b/src/main/java/de/extio/game_engine/renderer/g2d/G2DRenderer.java index 3172d95..4996f26 100644 --- a/src/main/java/de/extio/game_engine/renderer/g2d/G2DRenderer.java +++ b/src/main/java/de/extio/game_engine/renderer/g2d/G2DRenderer.java @@ -19,6 +19,8 @@ import javax.imageio.ImageIO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import de.extio.game_engine.module.AbstractClientModule; +import de.extio.game_engine.module.AbstractClientModule; import de.extio.game_engine.renderer.Renderer; import de.extio.game_engine.renderer.RendererData; import de.extio.game_engine.renderer.g2d.bo.rendering.G2DAbstractRenderingBo; @@ -87,8 +89,8 @@ public class G2DRenderer implements Renderer { EventQueue.invokeAndWait(() -> { // this invokeAndWait() call is also important to wait until applyVideoOptions() has been completed, which also puts events to AWT event queue LOGGER.debug("Viewport initialized"); - this.rendererData.getRendererWorkingSet().add("G2DRenderer", this.rendererData.getRenderingBoPool().acquire("G2DRenderer_background", G2DDrawBackground.class)); - this.rendererData.getRendererWorkingSet().add("G2DRenderer", this.rendererData.getRenderingBoPool().acquire("G2DRenderer_tooltip", G2DDrawControlTooltip.class)); + this.rendererData.getRendererWorkingSet().add(G2DRendererModule.class, this.rendererData.getRenderingBoPool().acquire("G2DRenderer_background", G2DDrawBackground.class)); + this.rendererData.getRendererWorkingSet().add(G2DRendererModule.class, this.rendererData.getRenderingBoPool().acquire("G2DRenderer_tooltip", G2DDrawControlTooltip.class)); }); } catch (InvocationTargetException | InterruptedException e) { @@ -152,7 +154,7 @@ public class G2DRenderer implements Renderer { } this.drawStatistics(); - this.rendererData.getRendererWorkingSet().commit("G2DRenderer", true); + this.rendererData.getRendererWorkingSet().commit(G2DRendererModule.class, true); this.rendererData.getRendererWorkingSet().getLiveSet(this.renderingBOs); this.renderingBOs.sort((bo0, bo1) -> bo0.getLayer().compareTo(bo1.getLayer())); @@ -178,8 +180,8 @@ public class G2DRenderer implements Renderer { } } - this.rendererData.getRendererWorkingSet().get("G2DRenderer", "G2DRenderer_tooltip").closeStatic(); - + this.rendererData.getRendererWorkingSet().get(G2DRendererModule.class, "G2DRenderer_tooltip").closeStatic(); + // // Rendering cycle END // @@ -234,14 +236,14 @@ public class G2DRenderer implements Renderer { .setColor(RgbaColor.WHITE) .setLayer(RenderingBoLayer.TOP) .withPositionAbsoluteAnchorTopRight(100, 35); - this.rendererData.getRendererWorkingSet().add("G2DRenderer", drawFont); + this.rendererData.getRendererWorkingSet().add(G2DRendererModule.class, drawFont); this.fpsHistory.add(Integer.valueOf((int) this.frameDur)); final var drawFpsHistory = this.rendererData.getRenderingBoPool().acquire("g2DRenderer_fpsHistory", G2DDrawFpsHistory.class) .setHistory(this.fpsHistory) .setLayer(RenderingBoLayer.TOP) .withPositionAbsoluteAnchorTopRight(100, 50); - this.rendererData.getRendererWorkingSet().add("G2DRenderer", drawFpsHistory); + this.rendererData.getRendererWorkingSet().add(G2DRendererModule.class, drawFpsHistory); } private void frameCap() throws InterruptedException { @@ -334,4 +336,7 @@ public class G2DRenderer implements Renderer { public void setRendererData(final RendererData rendererData) { this.rendererData = rendererData; } + + private static abstract class G2DRendererModule extends AbstractClientModule { + } } diff --git a/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSet.java b/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSet.java index 9a317c6..cfc904a 100644 --- a/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSet.java +++ b/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSet.java @@ -3,19 +3,20 @@ package de.extio.game_engine.renderer.work; import java.util.List; import java.util.Map; +import de.extio.game_engine.module.AbstractClientModule; import de.extio.game_engine.renderer.model.RenderingBo; public interface RendererWorkingSet { - void add(String producer, RenderingBo work); + void add(Class producer, RenderingBo work); - void add(String producer, List work); + void add(Class producer, List work); - RenderingBo get(String producer, String id); + RenderingBo get(Class producer, String id); - Map getUncommittedWork(String producer); + Map getUncommittedWork(Class producer); - Map commit(String producer, boolean clone); + Map commit(Class producer, boolean clone); void getLiveSet(List combinedLiveSet); diff --git a/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSetImpl.java b/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSetImpl.java index 36bb30f..bf2c5e0 100644 --- a/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSetImpl.java +++ b/src/main/java/de/extio/game_engine/renderer/work/RendererWorkingSetImpl.java @@ -12,11 +12,12 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicReference; +import de.extio.game_engine.module.AbstractClientModule; import de.extio.game_engine.renderer.model.RenderingBo; public class RendererWorkingSetImpl implements RendererWorkingSet { - private final ConcurrentMap workingSet = new ConcurrentHashMap<>(); + private final ConcurrentMap, RendererWork> workingSet = new ConcurrentHashMap<>(); private final BlockingQueue> mapsPool = new ArrayBlockingQueue<>(100); @@ -29,14 +30,14 @@ public class RendererWorkingSetImpl implements RendererWorkingSet { } @Override - public void add(final String producer, final RenderingBo work) { + public void add(final Class producer, final RenderingBo work) { this.getWorkingSetByProducer(producer) .next() .put(work.getId(), work); } @Override - public void add(final String producer, final List work) { + public void add(final Class producer, final List work) { final var nextMap = this.getWorkingSetByProducer(producer).next(); for (final RenderingBo bo : work) { nextMap.put(bo.getId(), bo); @@ -44,17 +45,17 @@ public class RendererWorkingSetImpl implements RendererWorkingSet { } @Override - public Map getUncommittedWork(final String producer) { + public Map getUncommittedWork(final Class producer) { return this.getWorkingSetByProducer(producer).next(); } @Override - public RenderingBo get(final String producer, final String id) { + public RenderingBo get(final Class producer, final String id) { return this.getWorkingSetByProducer(producer).next().get(id); } @Override - public Map commit(final String producer, final boolean clone) { + public Map commit(final Class producer, final boolean clone) { final AtomicReference> previousWork = new AtomicReference<>(); final RendererWork rendererWork = this.workingSet.compute(producer, (k, v) -> { if (v == null) { @@ -93,7 +94,7 @@ public class RendererWorkingSetImpl implements RendererWorkingSet { this.workingSet.values().forEach(rendererWork -> combinedLiveSet.addAll(rendererWork.live().values())); } - private RendererWork getWorkingSetByProducer(final String producer) { + private RendererWork getWorkingSetByProducer(final Class producer) { return this.workingSet.computeIfAbsent(producer, k -> new RendererWork(this.obtainMapFromPool(), this.obtainMapFromPool())); } diff --git a/src/test/java/de/extio/game_engine/renderer/work/RendererWorkingSetImplTest.java b/src/test/java/de/extio/game_engine/renderer/work/RendererWorkingSetImplTest.java index 1c463e8..f135426 100644 --- a/src/test/java/de/extio/game_engine/renderer/work/RendererWorkingSetImplTest.java +++ b/src/test/java/de/extio/game_engine/renderer/work/RendererWorkingSetImplTest.java @@ -13,6 +13,7 @@ import java.util.concurrent.atomic.AtomicInteger; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import de.extio.game_engine.module.AbstractClientModule; import de.extio.game_engine.renderer.RendererData; import de.extio.game_engine.renderer.model.RenderingBo; import de.extio.game_engine.renderer.model.RenderingBoLayer; @@ -40,9 +41,9 @@ public class RendererWorkingSetImplTest { void addSingleAddsToUncommittedWork() { final RenderingBo bo1 = mock(RenderingBo.class); when(bo1.getId()).thenReturn("bo1"); - this.workingSet.add("producer", bo1); + this.workingSet.add(TestModuleA.class, bo1); - final var uncommitted = this.workingSet.getUncommittedWork("producer"); + final var uncommitted = this.workingSet.getUncommittedWork(TestModuleA.class); assertNotNull(uncommitted); assertEquals(Map.of("bo1", bo1), uncommitted); } @@ -54,9 +55,9 @@ public class RendererWorkingSetImplTest { final RenderingBo bo2 = mock(RenderingBo.class); when(bo2.getId()).thenReturn("bo2"); - this.workingSet.add("producer", List.of(bo1, bo2)); + this.workingSet.add(TestModuleA.class, List.of(bo1, bo2)); - final var uncommitted = this.workingSet.getUncommittedWork("producer"); + final var uncommitted = this.workingSet.getUncommittedWork(TestModuleA.class); assertEquals(Map.of("bo1", bo1, "bo2", bo2), uncommitted); } @@ -67,11 +68,11 @@ public class RendererWorkingSetImplTest { final RenderingBo bo2 = mock(RenderingBo.class); when(bo2.getId()).thenReturn("bo2"); - this.workingSet.add("producer", bo1); - this.workingSet.add("producer", bo2); + this.workingSet.add(TestModuleA.class, bo1); + this.workingSet.add(TestModuleA.class, bo2); - final var returnedUncommitted = this.workingSet.commit("producer", false); - final var currentUncommitted = this.workingSet.getUncommittedWork("producer"); + final var returnedUncommitted = this.workingSet.commit(TestModuleA.class, false); + final var currentUncommitted = this.workingSet.getUncommittedWork(TestModuleA.class); assertSame(currentUncommitted, returnedUncommitted); assertTrue(currentUncommitted.isEmpty()); @@ -91,11 +92,11 @@ public class RendererWorkingSetImplTest { final RenderingBo bo3 = mock(RenderingBo.class); when(bo3.getId()).thenReturn("bo3"); - this.workingSet.add("producer", bo1); - this.workingSet.add("producer", bo2); + this.workingSet.add(TestModuleA.class, bo1); + this.workingSet.add(TestModuleA.class, bo2); - final var returnedUncommitted = this.workingSet.commit("producer", true); - final var currentUncommitted = this.workingSet.getUncommittedWork("producer"); + final var returnedUncommitted = this.workingSet.commit(TestModuleA.class, true); + final var currentUncommitted = this.workingSet.getUncommittedWork(TestModuleA.class); assertSame(currentUncommitted, returnedUncommitted); assertEquals(Map.of("bo1", bo1, "bo2", bo2), currentUncommitted); @@ -105,7 +106,7 @@ public class RendererWorkingSetImplTest { assertEquals(2, live.size()); assertTrue(live.containsAll(List.of(bo1, bo2))); - this.workingSet.add("producer", bo3); + this.workingSet.add(TestModuleA.class, bo3); final List liveAfterAdd = new ArrayList<>(); this.workingSet.getLiveSet(liveAfterAdd); assertEquals(2, liveAfterAdd.size()); @@ -121,12 +122,12 @@ public class RendererWorkingSetImplTest { final RenderingBo bo3 = mock(RenderingBo.class); when(bo3.getId()).thenReturn("bo3"); - this.workingSet.add("p1", bo1); - this.workingSet.add("p1", bo2); - this.workingSet.add("p2", bo3); + this.workingSet.add(TestModuleA.class, bo1); + this.workingSet.add(TestModuleA.class, bo2); + this.workingSet.add(TestModuleB.class, bo3); - this.workingSet.commit("p1", false); - this.workingSet.commit("p2", false); + this.workingSet.commit(TestModuleA.class, false); + this.workingSet.commit(TestModuleB.class, false); final List live = new ArrayList<>(); this.workingSet.getLiveSet(live); @@ -136,7 +137,7 @@ public class RendererWorkingSetImplTest { @Test void commitOnUnknownProducerCreatesEmptyState() { - final var returnedUncommitted = this.workingSet.commit("unknown", false); + final var returnedUncommitted = this.workingSet.commit(TestModuleC.class, false); assertNotNull(returnedUncommitted); assertTrue(returnedUncommitted.isEmpty()); @@ -152,14 +153,14 @@ public class RendererWorkingSetImplTest { final var bo2 = new TestBoA(); bo2.setId("bo2"); - this.workingSet.add("producer", bo1); - this.workingSet.add("producer", bo2); - this.workingSet.commit("producer", false); + this.workingSet.add(TestModuleA.class, bo1); + this.workingSet.add(TestModuleA.class, bo2); + this.workingSet.commit(TestModuleA.class, false); final var bo3 = new TestBoB(); bo3.setId("bo3"); - this.workingSet.add("producer", bo3); - this.workingSet.commit("producer", false); + this.workingSet.add(TestModuleA.class, bo3); + this.workingSet.commit(TestModuleA.class, false); verify(this.renderingBoPool, times(1)).release(bo1); verify(this.renderingBoPool, times(1)).release(bo2); @@ -177,12 +178,12 @@ public class RendererWorkingSetImplTest { final RenderingBo bo2 = mock(RenderingBo.class); when(bo2.getId()).thenReturn("bo2"); - this.workingSet.add("producer", bo1); - this.workingSet.add("producer", bo2); + this.workingSet.add(TestModuleA.class, bo1); + this.workingSet.add(TestModuleA.class, bo2); - final var retrieved1 = this.workingSet.get("producer", "bo1"); - final var retrieved2 = this.workingSet.get("producer", "bo2"); - final var notFound = this.workingSet.get("producer", "nonexistent"); + final var retrieved1 = this.workingSet.get(TestModuleA.class, "bo1"); + final var retrieved2 = this.workingSet.get(TestModuleA.class, "bo2"); + final var notFound = this.workingSet.get(TestModuleA.class, "nonexistent"); assertSame(bo1, retrieved1); assertSame(bo2, retrieved2); @@ -196,16 +197,16 @@ public class RendererWorkingSetImplTest { final RenderingBo bo2 = mock(RenderingBo.class); when(bo2.getId()).thenReturn("bo2"); - this.workingSet.add("producer", bo1); - this.workingSet.add("producer", bo2); - final var committedWork = this.workingSet.commit("producer", false); + this.workingSet.add(TestModuleA.class, bo1); + this.workingSet.add(TestModuleA.class, bo2); + final var committedWork = this.workingSet.commit(TestModuleA.class, false); // After commit without clone, the uncommitted work should be empty assertTrue(committedWork.isEmpty()); // get() only retrieves from next set, not live set, so it returns null after commit - final var retrieved1 = this.workingSet.get("producer", "bo1"); - final var retrieved2 = this.workingSet.get("producer", "bo2"); + final var retrieved1 = this.workingSet.get(TestModuleA.class, "bo1"); + final var retrieved2 = this.workingSet.get(TestModuleA.class, "bo2"); assertTrue(retrieved1 == null); assertTrue(retrieved2 == null); @@ -218,13 +219,13 @@ public class RendererWorkingSetImplTest { final RenderingBo bo1_replacement = mock(RenderingBo.class); when(bo1_replacement.getId()).thenReturn("bo1"); - this.workingSet.add("producer", bo1); - final var uncommittedBefore = this.workingSet.getUncommittedWork("producer"); + this.workingSet.add(TestModuleA.class, bo1); + final var uncommittedBefore = this.workingSet.getUncommittedWork(TestModuleA.class); assertEquals(1, uncommittedBefore.size()); assertSame(bo1, uncommittedBefore.get("bo1")); - this.workingSet.add("producer", bo1_replacement); - final var uncommittedAfter = this.workingSet.getUncommittedWork("producer"); + this.workingSet.add(TestModuleA.class, bo1_replacement); + final var uncommittedAfter = this.workingSet.getUncommittedWork(TestModuleA.class); assertEquals(1, uncommittedAfter.size()); assertSame(bo1_replacement, uncommittedAfter.get("bo1")); } @@ -375,4 +376,16 @@ public class RendererWorkingSetImplTest { private static final class TestBoB extends TestBoBase { } + + private static final class TestModuleA extends AbstractClientModule { + + } + + private static final class TestModuleB extends AbstractClientModule { + + } + + private static final class TestModuleC extends AbstractClientModule { + + } }