Tôi đang tạo một chương trình yêu cầu phải chụp ít nhất 24 ảnh chụp màn hình mỗi giây. Hiện tại với đoạn code dưới đây tôi chỉ nhận được 1 cho mỗi ~ 94 mili giây, vì vậy khoảng 10 mỗi giây.Thay thế nhanh hơn cho java.awt.Robot.createScreenCapture?
Tôi không muốn sử dụng bất kỳ thư viện của bên thứ ba nào vì tôi đang cố gắng giữ cho thư viện càng nhỏ càng tốt, nhưng nếu tôi muốn tăng hiệu suất đáng kể, tôi sẵn sàng. Tôi cũng đang cố gắng giữ cho nền tảng này độc lập, nhưng một lần nữa, nếu nó sẽ là một sự gia tăng hiệu năng thực sự đáng kể, tôi sẽ sẵn sàng để giữ cho nó bị giới hạn trong Windows.
chỉnh sửa: Tôi hiện đã thử hai cách khác nhau; sử dụng một đoạn mã được tìm thấy trên trang web oracles và một đoạn được chỉ ra trong phần bình luận bên dưới. Cả ba đã mất khoảng thời gian đó, 2,1-2,2 triệu nanoseconds là khá damn không hiệu quả.
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);
}
}
Âm thanh như bạn đang cố gắng để nắm bắt một video màn hình. –
Bạn có thể xem [this] (http://www.rune-server.org/programming/application-development/387765-directrobot-fast-java-robot-allows-screen-recording.html), I ' đã không được sử dụng hoặc băng ghế dự bị đánh dấu nó mặc dù – MadProgrammer
@JimGarrison Một cái gì đó như thế. –