Производительность Java Robot createScreenCapture

Мне нужно захватить серию скриншотов и объединить их в фильм. Я пытаюсь использовать класс робота java для захвата экрана.

Но метод createScreenCapture() занимает более 1 секунды на моей машине. Я не могу получить 1 fps. Есть ли способ ускорить его? Или есть ли какой-либо другой API?

Изменить: он выделяет буферное изображение.

BufferedImage image = robot.createScreenCapture(экран); // Сохранение скриншота как jpg
Файл file = новый файл ( "изображения/экран" + индекс + ".jpg" ); ImageIO.write(изображение, "jpg", файл); Индекc++;

Запись в файл jpg занимает около 200 мс, когда получение BufferedImage занимает около 1400 мс.

Ответ 1

Я бы предложил перейти с C или С++ для этого, у него гораздо больше прямого доступа к оборудованию.

Если вы хотите, чтобы абсолютная максимальная производительность переходила на уровень драйвера и просто берет данные прямо с видеокарты. Трудно найти такой драйвер, потому что он может использоваться для легкого поражения любой защиты от копирования, поскольку он захватывает данные по мере того, как они идут на экран.

Но если вам нужно придерживаться Java и Robot, вы уверены, что это только один вызов функции, который занимает так много времени? Он не выделяет BufferedImage или что-то еще?

Ответ 2

Попробуйте поэкспериментировать с различными настройками экрана. Глубина цвета повлияет на него, поскольку AWT должен преобразовать все в общий растровый формат.

Некоторые примерные тайминги с моего ПК:

 Resolution | Depth | Time taken 
------------+-------+------------
 1280x1024  | 32    | 215ms
 1280x1024  | 16    | 155ms
 1600x900   | 32    | 235ms

Мой адаптер не может делать 24bpp или 64bpp, поэтому мне не удалось проверить эти глубины, но я бы предположил, что для их преобразования потребуется больше циклов процессора.