【发布时间】:2013-07-13 23:36:46
【问题描述】:
我正在制作一个程序,该程序需要每秒至少捕获 24 个屏幕截图。目前使用下面的代码,我每 94 毫秒只能得到 1 个,所以每秒大约 10 个。
我不想使用任何 3rd 方库,因为我试图让它尽可能小,但如果我能获得显着的性能提升,我会愿意。我也在努力保持这个平台的独立性,但同样,如果这能带来真正显着的性能提升,我愿意将其限制在 Windows 上。
edit:我现在也尝试了两种不同的方法;使用在 oracles 网站上找到的 sn-p 以及在下面的 cmets 中指出的。这三个都花费了大约相同的时间,2.1-220 万纳秒,这非常低效。
public abstract class Benchmark {
private final int iterations;
public Benchmark(int iterations) {
this.iterations = iterations;
}
public abstract void logic();
public void start() {
long start = System.nanoTime();
for (int iteration = 0; iteration < iterations; iteration++) {
long iterationStart = System.nanoTime();
logic();
System.out.println("iteration: " + iteration + " took: " + (System.nanoTime() - iterationStart) + " nanoseconds.");
}
long total = (System.nanoTime() - start);
System.out.println(iterations + " iterations took: " + total + " nanoseconds. Average iteration was: " + (total / iterations));
}
}
_
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
public class RobotBenchmark extends Benchmark {
private final Robot robot;
private final Rectangle screen;
public static void main(String[] args) {
Benchmark benchmark;
try {
benchmark = new RobotBenchmark(24);
benchmark.start();
} catch (AWTException e) {
e.printStackTrace();
}
}
public RobotBenchmark(int iterations) throws AWTException {
super(iterations);
robot = new Robot();
screen = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
}
@Override
public void logic() {
robot.createScreenCapture(screen);
}
}
_
import java.awt.AWTException;
import java.awt.GraphicsDevice;
import java.awt.HeadlessException;
import java.awt.Rectangle;
public class DirectRobotBenchmark extends Benchmark {
private final GraphicsDevice device;
private final Rectangle screenRectangle;
private final DirectRobot robot;
private int[] screen;
public static void main(String[] args) {
Benchmark benchmark;
try {
benchmark = new DirectRobotBenchmark(24);
benchmark.start();
} catch (HeadlessException | AWTException e) {
e.printStackTrace();
}
}
public DirectRobotBenchmark(int iterations) throws HeadlessException, AWTException {
super(iterations);
device = DirectRobot.getDefaultScreenDevice();
screenRectangle = new Rectangle(1920, 1080);
robot = new DirectRobot(device);
screen = new int[screenRectangle.width * screenRectangle.height];
}
@Override
public void logic() {
screen = robot.getRGBPixels(screenRectangle);
}
}
_
import java.awt.AWTException;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.peer.RobotPeer;
import sun.awt.SunToolkit;
@SuppressWarnings("restriction")
public class RobotPeerBenchmark extends Benchmark {
private final SunToolkit toolkit;
private final RobotPeer peer;
private final Rectangle screenRectangle;
private int[] screen;
public static void main(String[] args) {
try {
Benchmark robotPeerBenchmark = new RobotPeerBenchmark(24);
robotPeerBenchmark.start();
} catch (AWTException e) {
e.printStackTrace();
}
}
public RobotPeerBenchmark(int iterations) throws AWTException {
super(iterations);
toolkit = (SunToolkit) Toolkit.getDefaultToolkit();
peer = toolkit.createRobot(new Robot(), GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice());
screenRectangle = new Rectangle(toolkit.getScreenSize());
screen = new int[screenRectangle.width * screenRectangle.height];
}
@Override
public void logic() {
screen = peer.getRGBPixels(screenRectangle);
}
}
【问题讨论】:
-
听起来您正在尝试捕获屏幕视频。
-
你可以看看this,不过我没用过,也没有在benchmark过
-
@JimGarrison 类似的东西。
-
@MadProgrammer 我实际上是该论坛的活跃用户,这是我将其与哈哈进行比较的第一件事。但遗憾的是,我的性能提升非常小,比如 2-4 毫秒。
-
@MadProgrammer 我做了第二次基准测试,可以确认任何性能提升都可以忽略不计。
标签: java image performance screenshot awtrobot