Refactor G2DRendererControl to initialize viewport dimensions with ImmutableCoordI2 and optimize viewport update logic

This commit is contained in:
extio-de
2025-12-21 17:55:44 +01:00
parent 8fe63b2658
commit f5ef32dea6

View File

@@ -23,9 +23,9 @@ public class G2DRendererControl implements RendererControl {
private RendererData rendererData; private RendererData rendererData;
private CoordI2 absoluteViewportDimension = REFERENCE_RESOLUTION; private CoordI2 absoluteViewportDimension = ImmutableCoordI2.one();
private CoordI2 effectiveViewportDimension = REFERENCE_RESOLUTION; private CoordI2 effectiveViewportDimension = ImmutableCoordI2.one();
private double scaleFactor = 1.0; private double scaleFactor = 1.0;
@@ -153,15 +153,16 @@ public class G2DRendererControl implements RendererControl {
public void updateViewPort(final boolean lockRenderer, final boolean async) { public void updateViewPort(final boolean lockRenderer, final boolean async) {
// This method is called several times in a row by mainFrame resize event handler by intention // This method is called several times in a row by mainFrame resize event handler by intention
// I've discovered in debugger that sometimes when only a black viewPort is displayed the volatile image backing the bufferStrategy is only a few pixels in size // I've discovered in debugger that sometimes when only a black viewPort is displayed the volatile image backing the bufferStrategy is only a few pixels in size
// Letting the resize events do their job seemed to fix it // Letting the resize events do their job seemed to fix it --> createBufferStrategy is called multiple times in a row here intentionally
final Runnable run = () -> { final Runnable run = () -> {
if (lockRenderer) { if (lockRenderer) {
this.renderer.getWriteLock().lock(); this.renderer.getWriteLock().lock();
} }
try { try {
this.updateAbsoluteViewportPortDimension(); if (this.updateAbsoluteViewportPortDimension()) {
this.recalculate(); this.recalculate();
}
this.renderer.getMainFrame().createBufferStrategy(); this.renderer.getMainFrame().createBufferStrategy();
this.renderer.getMainFrame().resizeListenerEnabled = true; this.renderer.getMainFrame().resizeListenerEnabled = true;
} }
@@ -185,11 +186,14 @@ public class G2DRendererControl implements RendererControl {
this.calculateViewportEffectiveDimension(); this.calculateViewportEffectiveDimension();
} }
private void updateAbsoluteViewportPortDimension() { private boolean updateAbsoluteViewportPortDimension() {
boolean changed = false;
final var absoluteDim = this.absoluteViewportDimension; final var absoluteDim = this.absoluteViewportDimension;
if (absoluteDim == null || absoluteDim.getX() != this.renderer.getMainFrame().getWidth() || absoluteDim.getY() != this.renderer.getMainFrame().getHeight()) { if (absoluteDim == null || absoluteDim.getX() != this.renderer.getMainFrame().getWidth() || absoluteDim.getY() != this.renderer.getMainFrame().getHeight()) {
this.absoluteViewportDimension = ImmutableCoordI2.create(this.renderer.getMainFrame().getWidth(), this.renderer.getMainFrame().getHeight()); this.absoluteViewportDimension = ImmutableCoordI2.create(this.renderer.getMainFrame().getWidth(), this.renderer.getMainFrame().getHeight());
changed = true;
} }
return changed;
} }
private void calculateViewportEffectiveDimension() { private void calculateViewportEffectiveDimension() {
@@ -242,7 +246,7 @@ public class G2DRendererControl implements RendererControl {
public long getFrame() { public long getFrame() {
return this.rendererData.getFrame(); return this.rendererData.getFrame();
} }
@Override @Override
public void setRendererData(final RendererData rendererData) { public void setRendererData(final RendererData rendererData) {
this.rendererData = rendererData; this.rendererData = rendererData;