feat(renderer): Implement cloning of RenderingBo objects in commit process

This commit is contained in:
extio-de
2025-12-25 15:43:04 +01:00
parent e8aee54a34
commit b2c7747782
2 changed files with 42 additions and 10 deletions

View File

@@ -2,10 +2,8 @@ package de.extio.game_engine.renderer.work;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
@@ -21,8 +19,6 @@ public class RendererWorkingSetImpl implements RendererWorkingSet {
private final BlockingQueue<Map<String, RenderingBo>> mapsPool = new ArrayBlockingQueue<>(100);
private final BlockingQueue<Set<Class<? extends RenderingBo>>> setsPool = new ArrayBlockingQueue<>(100);
private final RenderingBoPool rendererBoPool;
public RendererWorkingSetImpl(final RenderingBoPool rendererBoPool) {
@@ -98,17 +94,22 @@ public class RendererWorkingSetImpl implements RendererWorkingSet {
previousLiveRef.set(v.live());
if (clone) {
final Map<String, RenderingBo> newNext = this.obtainMapFromPool();
newNext.putAll(v.next());
v.next().entrySet().forEach(e -> {
final RenderingBo copy = this.rendererBoPool.copy(e.getValue());
newNext.put(e.getKey(), copy);
});
return new RendererWork(v.next(), newNext);
}
else {
v.live().values().forEach(this.rendererBoPool::release);
return new RendererWork(v.next(), this.obtainMapFromPool());
}
});
final var previousLiveSet = previousLiveRef.get();
if (previousLiveSet != null) {
if (clone) {
previousLiveSet.values().forEach(this.rendererBoPool::release);
}
this.returnMapToPool(previousLiveSet);
}