draw manager: lazily fetch screenshot image
Also no longer pass images to every frame listener. With GPU rendering it is expensive to get Images each frame.
This commit is contained in:
@@ -283,6 +283,7 @@ public class Hooks implements Callbacks
|
||||
}
|
||||
|
||||
Image image = mainBufferProvider.getImage();
|
||||
final Image finalImage;
|
||||
final Graphics2D graphics2d = (Graphics2D) image.getGraphics();
|
||||
|
||||
try
|
||||
@@ -334,13 +335,17 @@ public class Hooks implements Callbacks
|
||||
: RenderingHints.VALUE_INTERPOLATION_BILINEAR);
|
||||
stretchedGraphics.drawImage(image, 0, 0, stretchedDimensions.width, stretchedDimensions.height, null);
|
||||
|
||||
image = stretchedImage;
|
||||
finalImage = image = stretchedImage;
|
||||
}
|
||||
else
|
||||
{
|
||||
finalImage = image;
|
||||
}
|
||||
|
||||
// Draw the image onto the game canvas
|
||||
graphics.drawImage(image, 0, 0, client.getCanvas());
|
||||
|
||||
drawManager.processDrawComplete(image);
|
||||
drawManager.processDrawComplete(() -> finalImage);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -24,8 +24,6 @@
|
||||
*/
|
||||
package net.runelite.client.plugins.fps;
|
||||
|
||||
import java.awt.Image;
|
||||
import java.util.function.Consumer;
|
||||
import javax.inject.Inject;
|
||||
import net.runelite.api.events.FocusChanged;
|
||||
|
||||
@@ -42,7 +40,7 @@ import net.runelite.api.events.FocusChanged;
|
||||
* Enforcing FPS in the draw code does not impact the client engine's ability to run including its audio,
|
||||
* even when forced to 1 FPS with this plugin.
|
||||
*/
|
||||
public class FpsDrawListener implements Consumer<Image>
|
||||
public class FpsDrawListener implements Runnable
|
||||
{
|
||||
private static final int SAMPLE_SIZE = 4;
|
||||
|
||||
@@ -90,7 +88,7 @@ public class FpsDrawListener implements Consumer<Image>
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(Image image)
|
||||
public void run()
|
||||
{
|
||||
|
||||
if (!isEnforced())
|
||||
|
||||
@@ -30,6 +30,7 @@ import java.util.Queue;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
import javax.inject.Singleton;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@@ -37,10 +38,10 @@ import lombok.extern.slf4j.Slf4j;
|
||||
@Slf4j
|
||||
public class DrawManager
|
||||
{
|
||||
private final List<Consumer<Image>> everyFrame = new CopyOnWriteArrayList<>();
|
||||
private final List<Runnable> everyFrame = new CopyOnWriteArrayList<>();
|
||||
private final Queue<Consumer<Image>> nextFrame = new ConcurrentLinkedQueue<>();
|
||||
|
||||
public void registerEveryFrameListener(Consumer<Image> everyFrameListener)
|
||||
public void registerEveryFrameListener(Runnable everyFrameListener)
|
||||
{
|
||||
if (!everyFrame.contains(everyFrameListener))
|
||||
{
|
||||
@@ -48,7 +49,7 @@ public class DrawManager
|
||||
}
|
||||
}
|
||||
|
||||
public void unregisterEveryFrameListener(Consumer<Image> everyFrameListener)
|
||||
public void unregisterEveryFrameListener(Runnable everyFrameListener)
|
||||
{
|
||||
everyFrame.remove(everyFrameListener);
|
||||
}
|
||||
@@ -58,13 +59,13 @@ public class DrawManager
|
||||
nextFrame.add(nextFrameListener);
|
||||
}
|
||||
|
||||
public void processDrawComplete(Image image)
|
||||
public void processDrawComplete(Supplier<Image> imageSupplier)
|
||||
{
|
||||
for (Consumer<Image> everyFrameListener : everyFrame)
|
||||
for (Runnable everyFrameListener : everyFrame)
|
||||
{
|
||||
try
|
||||
{
|
||||
everyFrameListener.accept(image);
|
||||
everyFrameListener.run();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -73,8 +74,27 @@ public class DrawManager
|
||||
}
|
||||
|
||||
Consumer<Image> nextFrameListener = nextFrame.poll();
|
||||
Image image = null;
|
||||
while (nextFrameListener != null)
|
||||
{
|
||||
if (image == null)
|
||||
{
|
||||
try
|
||||
{
|
||||
image = imageSupplier.get();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
log.warn("error getting screenshot", ex);
|
||||
}
|
||||
}
|
||||
|
||||
if (image == null)
|
||||
{
|
||||
nextFrame.clear();
|
||||
break;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
nextFrameListener.accept(image);
|
||||
|
||||
Reference in New Issue
Block a user