client: cache and reuse Graphics

This commit is contained in:
Adam
2019-07-28 12:34:01 -04:00
parent 2ef930fda4
commit 3d326a6ee8
3 changed files with 49 additions and 33 deletions

View File

@@ -29,7 +29,7 @@ import java.awt.Image;
/** /**
* Represents the clients primary image buffer. * Represents the clients primary image buffer.
*/ */
public interface MainBufferProvider public interface MainBufferProvider extends BufferProvider
{ {
/** /**
* Gets the image currently loaded in the buffer. * Gets the image currently loaded in the buffer.

View File

@@ -130,6 +130,31 @@ public class Hooks implements Callbacks
private long lastCheck; private long lastCheck;
private boolean shouldProcessGameTick; private boolean shouldProcessGameTick;
private static MainBufferProvider lastMainBufferProvider;
private static Graphics2D lastGraphics;
/**
* Get the Graphics2D for the MainBufferProvider image
* This caches the Graphics2D instance so it can be reused
* @param mainBufferProvider
* @return
*/
private static Graphics2D getGraphics(MainBufferProvider mainBufferProvider)
{
if (lastGraphics == null || lastMainBufferProvider != mainBufferProvider)
{
if (lastGraphics != null)
{
log.debug("Graphics reset!");
lastGraphics.dispose();
}
lastMainBufferProvider = mainBufferProvider;
lastGraphics = (Graphics2D) mainBufferProvider.getImage().getGraphics();
}
return lastGraphics;
}
@Override @Override
public void post(Object event) public void post(Object event)
{ {
@@ -295,9 +320,7 @@ public class Hooks implements Callbacks
return; return;
} }
Image image = mainBufferProvider.getImage(); final Graphics2D graphics2d = getGraphics(mainBufferProvider);
final Image finalImage;
final Graphics2D graphics2d = (Graphics2D) image.getGraphics();
try try
{ {
@@ -313,8 +336,6 @@ public class Hooks implements Callbacks
// Draw clientUI overlays // Draw clientUI overlays
clientUi.paintOverlays(graphics2d); clientUi.paintOverlays(graphics2d);
graphics2d.dispose();
if (client.isGpu()) if (client.isGpu())
{ {
// processDrawComplete gets called on GPU by the gpu plugin at the end of its // processDrawComplete gets called on GPU by the gpu plugin at the end of its
@@ -323,6 +344,8 @@ public class Hooks implements Callbacks
} }
// Stretch the game image if the user has that enabled // Stretch the game image if the user has that enabled
Image image = mainBufferProvider.getImage();
final Image finalImage;
if (client.isStretchedEnabled()) if (client.isStretchedEnabled())
{ {
GraphicsConfiguration gc = clientUi.getGraphicsConfiguration(); GraphicsConfiguration gc = clientUi.getGraphicsConfiguration();
@@ -392,8 +415,7 @@ public class Hooks implements Callbacks
public void drawScene() public void drawScene()
{ {
MainBufferProvider bufferProvider = (MainBufferProvider) client.getBufferProvider(); MainBufferProvider bufferProvider = (MainBufferProvider) client.getBufferProvider();
BufferedImage image = (BufferedImage) bufferProvider.getImage(); Graphics2D graphics2d = getGraphics(bufferProvider);
Graphics2D graphics2d = image.createGraphics();
try try
{ {
@@ -403,18 +425,13 @@ public class Hooks implements Callbacks
{ {
log.warn("Error during overlay rendering", ex); log.warn("Error during overlay rendering", ex);
} }
finally
{
graphics2d.dispose();
}
} }
@Override @Override
public void drawAboveOverheads() public void drawAboveOverheads()
{ {
MainBufferProvider bufferProvider = (MainBufferProvider) client.getBufferProvider(); MainBufferProvider bufferProvider = (MainBufferProvider) client.getBufferProvider();
BufferedImage image = (BufferedImage) bufferProvider.getImage(); Graphics2D graphics2d = getGraphics(bufferProvider);
Graphics2D graphics2d = image.createGraphics();
try try
{ {
@@ -424,17 +441,12 @@ public class Hooks implements Callbacks
{ {
log.warn("Error during overlay rendering", ex); log.warn("Error during overlay rendering", ex);
} }
finally
{
graphics2d.dispose();
}
} }
public static void drawAfterWidgets() public static void drawAfterWidgets()
{ {
MainBufferProvider bufferProvider = (MainBufferProvider) client.getBufferProvider(); MainBufferProvider bufferProvider = (MainBufferProvider) client.getBufferProvider();
BufferedImage image = (BufferedImage) bufferProvider.getImage(); Graphics2D graphics2d = getGraphics(bufferProvider);
Graphics2D graphics2d = image.createGraphics();
try try
{ {
@@ -445,10 +457,6 @@ public class Hooks implements Callbacks
{ {
log.warn("Error during overlay rendering", ex); log.warn("Error during overlay rendering", ex);
} }
finally
{
graphics2d.dispose();
}
// WidgetItemOverlays render at ABOVE_WIDGETS, reset widget item // WidgetItemOverlays render at ABOVE_WIDGETS, reset widget item
// list for next frame. // list for next frame.

View File

@@ -33,6 +33,7 @@ import java.awt.Point;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.util.List; import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
@@ -433,38 +434,45 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener
private void safeRender(Client client, Overlay overlay, OverlayLayer layer, Graphics2D graphics, Point point) private void safeRender(Client client, Overlay overlay, OverlayLayer layer, Graphics2D graphics, Point point)
{ {
final Graphics2D subGraphics = (Graphics2D) graphics.create();
if (!isResizeable && (layer == OverlayLayer.ABOVE_SCENE || layer == OverlayLayer.UNDER_WIDGETS)) if (!isResizeable && (layer == OverlayLayer.ABOVE_SCENE || layer == OverlayLayer.UNDER_WIDGETS))
{ {
subGraphics.setClip(client.getViewportXOffset(), graphics.setClip(client.getViewportXOffset(),
client.getViewportYOffset(), client.getViewportYOffset(),
client.getViewportWidth(), client.getViewportWidth(),
client.getViewportHeight()); client.getViewportHeight());
} }
else
{
graphics.setClip(0, 0, client.getCanvasWidth(), client.getCanvasHeight());
}
final OverlayPosition position = overlay.getPosition(); final OverlayPosition position = overlay.getPosition();
// Set font based on configuration // Set font based on configuration
if (position == OverlayPosition.DYNAMIC || position == OverlayPosition.DETACHED) if (position == OverlayPosition.DYNAMIC || position == OverlayPosition.DETACHED)
{ {
subGraphics.setFont(runeLiteConfig.fontType().getFont()); graphics.setFont(runeLiteConfig.fontType().getFont());
} }
else if (position == OverlayPosition.TOOLTIP) else if (position == OverlayPosition.TOOLTIP)
{ {
subGraphics.setFont(runeLiteConfig.tooltipFontType().getFont()); graphics.setFont(runeLiteConfig.tooltipFontType().getFont());
} }
else else
{ {
subGraphics.setFont(runeLiteConfig.interfaceFontType().getFont()); graphics.setFont(runeLiteConfig.interfaceFontType().getFont());
} }
subGraphics.translate(point.x, point.y); // Reset the default color
graphics.setColor(Color.WHITE);
// Get transform so we can reset it after drawing
AffineTransform transform = graphics.getTransform();
graphics.translate(point.x, point.y);
final Dimension overlayDimension; final Dimension overlayDimension;
try try
{ {
overlayDimension = overlay.render(subGraphics); overlayDimension = overlay.render(graphics);
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -473,7 +481,7 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener
} }
finally finally
{ {
subGraphics.dispose(); graphics.setTransform(transform);
} }
final Dimension dimension = MoreObjects.firstNonNull(overlayDimension, new Dimension()); final Dimension dimension = MoreObjects.firstNonNull(overlayDimension, new Dimension());