Я спрашиваю это сегодня с целью сравнения двух.
Я пытаюсь создать бота, который может нажимать пробел в определенное время.
В любом случае, позвольте мне показать, что я пытаюсь сравнить.
Robot robot = new Robot();
Это будет робот. (Java.awt.Robot;)
У меня такой вопрос, что быстрее для того, чтобы попытаться постоянно читать один (или более) пикселей на экране одновременно?
Мои текущие (выполняющиеся) программы, которые идентичны, за исключением одной, использующей
Robot.getPixelColor(int, int)
и другое использование
BufferedImage image Robot.createScreenCapture(Rectangle)
imaage.getRGB
Они запускаются много раз в секунду, и я просто пытаюсь выяснить, что более последовательно быстрее. Они оба кажутся случайными со скоростью, с которой они работают, поэтому любой совет приветствуется.
Если вы хотите, чтобы пример поместил их, вот его настройка.
Вот пример использования Robot.getPixelColor (int, int)
Robot robot = new Robot();
Rectangle rect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
Point prompt = new Point(913, 506, robot);
BufferedImage screenImage = robot.createScreenCapture(rect);
for(int i = 0; i < 360; i++) {
zones.add(new Point(radius * Math.cos(Math.toRadians(i)) + centerX, radius * Math.sin(Math.toRadians(i)) + centerY, robot));
}
System.out.println("Resolution: " + width + " * " + height/* + " " + robot.getPixelColor(20, 20)/* + " " + screenImage.getRGB((int) prompt.getX(), (int) prompt.getY())*/);
while(true) {
tempZone = null;
while(prompt.hasColor(promptColor)) {
System.out.println("Found prompt, trying to find zone.");
int count = 0;
for(int i = 0; i < zones.size(); i++) {
if(zones.get(i).hasColor(zoneColor)){
tempZone = zones.get(i);
break;
}
}
if(tempZone != null) {
System.out.println("Found zone at: " + tempZone.getX() + ", " + tempZone.getY() + ". Looking for ticker...");
tempZone.whenHasColor(zoneColor);
}else{
System.out.println("Unable to find zone.");
}
while(prompt.hasColor(promptColor)) {}
}
}
с классом очков:
public class Point {
private double x;
private double y;
private final Robot robot;
public Point(double x, double y, Robot rob) {
this.x = x;
this.y = y;
this.robot = rob;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public boolean hasColor(Color color) {
return (robot.getPixelColor((int )x, (int) y).equals(color));
}
public void whenHasColor(Color color) throws IOException {
Rectangle rect = new Rectangle(889 + (int) x, 449 + (int) y, 1, 1);
while(hasColor(color)) {
//Nothing
}
BufferedImage cap = robot.createScreenCapture(rect);
if(Math.abs(Math.abs(cap.getRGB(0, 0)) - 15657182) < 350000) {
System.out.println("Missed Zone, failure.");
}else {
robot.keyPress(Main.promptKey);
System.out.println("Found ticker pressing key. ");
}
}
}
Для тех, кто интересуется, откуда может появиться что-то конкретное, я использую модифицированную версию этого сайта в качестве средства для создания этого бота.
Теперь для примера с использованием Robot.createScreenCapture (Rectangle) и BufferedImage.getRGB (int, int)
Robot robot = new Robot();
Rectangle rect = new Rectangle(889, 449, 149, 149);
Point prompt = new Point(24, 57, robot);
String format = "png";
String fileName = "fullDebug1." + format;
BufferedImage screenImage = robot.createScreenCapture(rect);
for(int i = 0; i < 360; i++) {
zones.add(new Point(radius * Math.cos(Math.toRadians(i)) + centerX, radius * Math.sin(Math.toRadians(i)) + centerY, robot));
}
System.out.println("Resolution: " + width + " * " + height/* + " " + screenImage.getRGB((int) prompt.getX(), (int) prompt.getY())*/);
while(true) {
tempZone = null;
int zoneFinal = 0;
while(prompt.hasColor(promptColor)) {
System.out.println("Found prompt, trying to find zone.");
BufferedImage zoneImage = robot.createScreenCapture(rect);
int count = 0;
for(int i = 0; i < zones.size(); i++) {
if(zones.get(i).hasColorZones(zoneColor, zoneImage)){
tempZone = zones.get(i);
break;
}
}
if(tempZone != null) {
System.out.println("Found zone at: " + tempZone.getX() + ", " + tempZone.getY() + ". Looking for ticker...");
tempZone.whenHasColor(zoneColor);
}else{
System.out.println("Unable to find zone.");
}
while(prompt.hasColor(promptColor)) {}
}
и его класс Point:
public class Point {
private double x;
private double y;
private final Robot robot;
public Point(double x, double y, Robot rob) {
this.x = x;
this.y = y;
this.robot = rob;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public boolean hasColor(int color) {
Rectangle rect = new Rectangle(889, 449, 149, 149);
BufferedImage screenImage = robot.createScreenCapture(rect);
return (Math.abs(screenImage.getRGB((int) x, (int) y)) == Math.abs(color))
}
public boolean hasColorPixel(int color, Rectangle rect) throws IOException {
BufferedImage cap = robot.createScreenCapture(rect);
return Math.abs(cap.getRGB(0, 0)) == Math.abs(color);
}
public boolean hasColorZones(int color, BufferedImage screenImage) {
return Math.abs(screenImage.getRGB((int) x, (int) y)) == Math.abs(color);
}
public boolean hasColorList(int[] colors, BufferedImage screenImage) {
for(int i : colors) {
if(Math.abs(screenImage.getRGB((int) x, (int) y)) == Math.abs(i)) {
return true;
}
}
return false;
}
public void whenHasColor(int color) throws IOException {
Rectangle rect = new Rectangle(889 + (int) x, 449 + (int) y, 1, 1);
while(hasColorPixel(color, rect)) {
//Nothing
}
BufferedImage cap = robot.createScreenCapture(rect);
if(Math.abs(Math.abs(cap.getRGB(0, 0)) - 15657182) < 350000) {
System.out.println("Missed Zone, failure.");
}else {
robot.keyPress(Main.promptKey);
System.out.println("Found ticker pressing key. ");
}
}
}
Итак, мой вопрос, который будет работать быстрее? Иногда последний вариант (который я более тщательно отлаживал) получает по 10 подряд, но затем тоже случайно выходит из строя. Сначала я подумал, что мой ноутбук не может с этим справиться, но после запуска на моем рабочем столе я получил те же результаты. Я бы предпочел, чтобы бот не работал должным образом или нет.
Я надеюсь, что смог дать достаточно информации, чтобы кто-нибудь смог мне помочь. Если есть что-то, что мне нужно добавить или изменить, пожалуйста, скажите мне! Это мой первый вопрос, и я хотел бы научиться быть лучше на этом сайте.
Еще одно извинение, если 1) пиксели не совпадают на вашем экране, поэтому вы не сможете запустить это, чтобы смоделировать мою ситуацию, и 2) если этот пост был длинным. Я хотел сделать хороший «Минимальный, полный и проверяемый пример», но я не был уверен, как его сократить.
EDIT
Чтобы сделать код более актуальным, как указал Бен, я мог бы его сократить. Но я подумал о чем-то, что делает его более полезным.
Что можно сделать с этим кодом, чтобы оптимизировать его работу быстрее, чтобы бот работал на 100% последовательно или, по крайней мере, ближе к 100%, чем сейчас (~ 60%)