feat(renderer): Implement closeStatic method in rendering classes for resource management

This commit is contained in:
extio-de
2025-12-22 17:50:34 +01:00
parent f4899ba777
commit 5f38d38581
6 changed files with 29 additions and 14 deletions

View File

@@ -8,7 +8,9 @@ import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -41,6 +43,10 @@ public class G2DRenderer implements Renderer {
private final RingBuffer<Integer> fpsHistory = new RingBuffer<>(90); private final RingBuffer<Integer> fpsHistory = new RingBuffer<>(90);
private final Set<Class<? extends RenderingBo>> releasedBoClasses = new HashSet<>();
private final StringBuilder fpsStringBuilder = new StringBuilder(15);
private volatile G2DMainFrame mainFrame; private volatile G2DMainFrame mainFrame;
private RendererData rendererData; private RendererData rendererData;
@@ -187,13 +193,13 @@ public class G2DRenderer implements Renderer {
screenGraphics.dispose(); screenGraphics.dispose();
} }
this.releasedBoClasses.clear();
for (final RenderingBo renderingBO : renderingBOs) { for (final RenderingBo renderingBO : renderingBOs) {
if (this.releasedBoClasses.add(renderingBO.getClass()) && renderingBO instanceof final G2DAbstractRenderingBo g2dRenderingBo) {
g2dRenderingBo.closeStatic();
}
this.rendererData.getRenderingBoPool().release(renderingBO); this.rendererData.getRenderingBoPool().release(renderingBO);
} }
// TODO discover with marker interface
G2DDrawControl.closeStatic();
G2DDrawImage.closeStatic();
G2DDrawControlTooltip.closeStatic();
} }
if (takeScreenshot_) { if (takeScreenshot_) {
@@ -224,14 +230,14 @@ public class G2DRenderer implements Renderer {
// FPS // FPS
final var sb = new StringBuilder(15); fpsStringBuilder.setLength(0);
sb.append(this.fps); fpsStringBuilder.append(this.fps);
sb.append("fps "); fpsStringBuilder.append("fps ");
sb.append(this.frameDur); fpsStringBuilder.append(this.frameDur);
sb.append("ms"); fpsStringBuilder.append("ms");
final var drawFont = this.rendererData.getRenderingBoPool().acquire(DrawFontRenderingBo.class) final var drawFont = this.rendererData.getRenderingBoPool().acquire(DrawFontRenderingBo.class)
.setText(sb.toString()) .setText(fpsStringBuilder.toString())
.setSize(14) .setSize(14)
.setColor(RgbaColor.WHITE) .setColor(RgbaColor.WHITE)
.setLayer(RenderingBoLayer.TOP) .setLayer(RenderingBoLayer.TOP)

View File

@@ -17,4 +17,7 @@ public abstract class G2DAbstractRenderingBo extends AbstractRenderingBo {
public abstract void render(Graphics2D graphics, double scaleFactor, boolean force); public abstract void render(Graphics2D graphics, double scaleFactor, boolean force);
public void closeStatic() {
}
} }

View File

@@ -11,6 +11,8 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Conditional;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -125,7 +127,8 @@ public class G2DDrawImage extends G2DAbstractRenderingBo implements DrawImageRen
this.scaledY = 0; this.scaledY = 0;
} }
public static void closeStatic() { @Override
public void closeStatic() {
final var it = IMAGE_CACHE.values().iterator(); final var it = IMAGE_CACHE.values().iterator();
while (it.hasNext()) { while (it.hasNext()) {
final var cachedImage = it.next(); final var cachedImage = it.next();

View File

@@ -90,7 +90,8 @@ public class G2DDrawWindow2 extends G2DAbstractRenderingBo implements DrawWindow
this.awtColor = null; this.awtColor = null;
} }
public static void closeStatic() { @Override
public void closeStatic() {
final var it = CACHE.values().iterator(); final var it = CACHE.values().iterator();
while (it.hasNext()) { while (it.hasNext()) {
final var entry = it.next(); final var entry = it.next();

View File

@@ -329,7 +329,8 @@ public class G2DDrawControl extends G2DAbstractRenderingBo implements ControlRen
this.tooltip = null; this.tooltip = null;
} }
public static void closeStatic() { @Override
public void closeStatic() {
final var it = CACHED_CONTROLS.values().iterator(); final var it = CACHED_CONTROLS.values().iterator();
while (it.hasNext()) { while (it.hasNext()) {
final var control = it.next(); final var control = it.next();

View File

@@ -43,7 +43,8 @@ public class G2DDrawControlTooltip extends G2DAbstractRenderingBo {
G2DDrawFont.renderText(graphics, scaleFactor, (int) ((TOOLTIP.position().getX() + 10) / scaleFactor), (int) ((TOOLTIP.position().getY() + 10) / scaleFactor), 14, TOOLTIP.text()); G2DDrawFont.renderText(graphics, scaleFactor, (int) ((TOOLTIP.position().getX() + 10) / scaleFactor), (int) ((TOOLTIP.position().getY() + 10) / scaleFactor), 14, TOOLTIP.text());
} }
public static void closeStatic() { @Override
public void closeStatic() {
TOOLTIP = null; TOOLTIP = null;
} }
} }