refactor(renderer): Update RendererWorkingSet to use AbstractClientModule for producer type
This commit is contained in:
@@ -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 {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<? extends AbstractClientModule> producer, RenderingBo work);
|
||||
|
||||
void add(String producer, List<RenderingBo> work);
|
||||
void add(Class<? extends AbstractClientModule> producer, List<RenderingBo> work);
|
||||
|
||||
RenderingBo get(String producer, String id);
|
||||
RenderingBo get(Class<? extends AbstractClientModule> producer, String id);
|
||||
|
||||
Map<String, RenderingBo> getUncommittedWork(String producer);
|
||||
Map<String, RenderingBo> getUncommittedWork(Class<? extends AbstractClientModule> producer);
|
||||
|
||||
Map<String, RenderingBo> commit(String producer, boolean clone);
|
||||
Map<String, RenderingBo> commit(Class<? extends AbstractClientModule> producer, boolean clone);
|
||||
|
||||
void getLiveSet(List<RenderingBo> combinedLiveSet);
|
||||
|
||||
|
||||
@@ -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<String, RendererWork> workingSet = new ConcurrentHashMap<>();
|
||||
private final ConcurrentMap<Class<? extends AbstractClientModule>, RendererWork> workingSet = new ConcurrentHashMap<>();
|
||||
|
||||
private final BlockingQueue<Map<String, RenderingBo>> 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<? extends AbstractClientModule> producer, final RenderingBo work) {
|
||||
this.getWorkingSetByProducer(producer)
|
||||
.next()
|
||||
.put(work.getId(), work);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(final String producer, final List<RenderingBo> work) {
|
||||
public void add(final Class<? extends AbstractClientModule> producer, final List<RenderingBo> 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<String, RenderingBo> getUncommittedWork(final String producer) {
|
||||
public Map<String, RenderingBo> getUncommittedWork(final Class<? extends AbstractClientModule> producer) {
|
||||
return this.getWorkingSetByProducer(producer).next();
|
||||
}
|
||||
|
||||
@Override
|
||||
public RenderingBo get(final String producer, final String id) {
|
||||
public RenderingBo get(final Class<? extends AbstractClientModule> producer, final String id) {
|
||||
return this.getWorkingSetByProducer(producer).next().get(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, RenderingBo> commit(final String producer, final boolean clone) {
|
||||
public Map<String, RenderingBo> commit(final Class<? extends AbstractClientModule> producer, final boolean clone) {
|
||||
final AtomicReference<Map<String, RenderingBo>> 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<? extends AbstractClientModule> producer) {
|
||||
return this.workingSet.computeIfAbsent(producer, k -> new RendererWork(this.obtainMapFromPool(), this.obtainMapFromPool()));
|
||||
}
|
||||
|
||||
|
||||
@@ -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<RenderingBo> 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<RenderingBo> 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 {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user