Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: putman on January 06, 2013, 09:27:04 AM
-
Здравствуйте, возможно ли анализировать область экрана быстрее чем функцией IF_PICTURE_IN ?
PXLXOR анализирует чётко заданную область, мне не подходит, пиктограммы у меня перемещаются.
-
-Есть функция PXL, для быстроты исп. ее, если позволяет.
-Есть функция if_pixel_in , (если найти такой цвет, который есть только на искомом обьекте)
-Можно максимально уменьшить область для поиска "if_picture_in". А также максимально уменьшить размер искомого изображения(вплоть до 2х точек).
Ну иии.. можно отказаться от корректирования цвета, если такое у вас прописано (хотя в новых версиях кликермэна есть возможность указать область корректирования, что серьезно увеличивает скорость).
Взамен можно уменьшить "качество цветопередачи", сглаживание в виндоусе, уменьшить качество в игре\браузере или где то там еще...
-
Буду уменьшать размер искомой области, 2х2 уж как то мало, хотя бы 4х4 сделаю и тогда точно из всего многообразия картинок не совпадёт ничего.
-
Putman, насколько быстрее и для чего это нужно?
Например выйграешь ты 50мс и чего с этим будешь делать?
Какая периодичность анализа экрана у тебя, 1 раз в секунду или 10 раз в секунду?
-
Здравствуйте, возможно ли анализировать область экрана быстрее чем функцией IF_PICTURE_IN ?
PXLXOR анализирует чётко заданную область, мне не подходит, пиктограммы у меня перемещаются.
Хотелось тоже найти более быстрый метод. Cтало понятно, что PXL должна быть быстрее IF_PICTURE_IN, но вот на сколько? И как это применить в универсальном случае?
Представляя как работает IF_PICTURE_IN... вероятнее всего опбегает экран сравнивая первый пиксел, если первый совпал - сравнивает второй и т.д. Понятно, что чем больше картинка, тем дольше ищет. Ещё влияет грамотный подход к подготовке картинки. Логично, что лучше выбирать участок с уникальными цветами. Если на экране много похожих участков, обратить внимание на левую/верхнюю (верхнюю) часть выбираемого участка.
Ну можно с примером:
Весь экран море нужно найти лодочку (вариант космос и кораблик). Желательно чтоб в заготовленной картинке верхняя часть (в идеале верхняя и левая) начиналась прямо на кораблике без захвата моря.
Далее. Захотелось найти вариант замены IF_PICTURE_IN. Придумался вариант из IF_PIXEL_IN и вложенных сравнений PXL. Думаю 4-х проверяемых точек "неподряд" со смещением к уже найденным будет хорошей заменой IF_PICTURE_IN.
Особенно там, где приходится увеличивать размер искомой картинки. Тем более, что PXL вроде быстрее.
Решил сделать синтетический тест. Тест проводится с повторениями на специально подобранном поле для каждой искомой картинки.
Вариант с использованием IF_PIXEL_IN
#name "Тест на скорость картинка"
// Author: Vint
// Version: 2.0 (29.01.2013)
$cicle=30 // количество повторов
$picture="textures\pictest1.bmp" // искомая картинка
$wait=10 // основная задержка
$h=0
$m=0
$s=0
$ms=0
$time_test=0 //9432357 2ч, 37мин, 12сек, 357 мс.
FOR ($i, $i<2) // подготавливаем лог, отступ
TFWRITE("Тест на скорость.txt", " ")
END_CYC
//GOTO(propusk)
$ms_start=$_ms
//==============================================================================
FOR ($i, $i<$cicle)
GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, $picture)
LOGWRITE("Найден в координатах X=", $_return1, ", Y=", $_return2)
WAITMS($wait)
ELSE
LOGWRITE("Картинка не найдена")
TFWRITE("Тест на скорость.txt","Картинка не найдена")
HINTPOPUP("Картинка не найдена")
HALT
END_IF
END_CYC
//==============================================================================
$time_test=$_ms-$ms_start
propusk:
TFWRITE("Тест на скорость.txt", STRCONCAT(" Разрешение экрана ",$_xmax+1,"x",$_ymax+1))
TFWRITE("Тест на скорость.txt", STRCONCAT(" Картинка ",$picture))
TFWRITE("Тест на скорость.txt", STRCONCAT(" Количество повторов ",$cicle))
TFWRITE("Тест на скорость.txt", STRCONCAT(" Задержка мс ",$wait))
IF($time_test>999)
$s=INT($time_test/1000)
$ms=$time_test-$s*1000
IF($s>59)
$m=INT($s/60)
$s=$s-$m*60
IF($m>59)
$h=INT($m/60)
$m=$m-$h*60
END_IF
END_IF
ELSE
$ms=$time_test
END_IF
TFWRITE("Тест на скорость.txt", STRCONCAT(" Время теста ",$time_test," мс, или ",$h," час. ",$m," мин. ",$s," сек. ",$ms," мс."))
HALT
Вариант с использованием IF_PIXEL_IN/PXL
#name "Тест на скорость пиксел"
// Author: Vint
// Version: 3.0 (29.01.2013)
$cicle=30 // количество повторов
$picture="textures\pictest2.bmp" // искомая картинка
$wait=10 // основная задержка
$h=0
$m=0
$s=0
$ms=0
$time_test=0 //9432357 2ч, 37мин, 12сек, 357 мс.
FOR ($i, $i<2) // подготавливаем лог, отступ
TFWRITE("Тест на скорость.txt", " ")
END_CYC
//GOTO(propusk)
$ms_start=$_ms
//==============================================================================
FOR ($i, $i<$cicle)
GETSCREEN
IF_PIXEL_IN(0,0, $_xmax,$_ymax, 255)
IF(PXL($_return1,$_return2+1)=16711680)
IF(PXL($_return1,$_return2+1)=65280)
IF(PXL($_return1,$_return2+1)=16711935)
LOGWRITE("Найден в координатах X=", $_return1, ", Y=", $_return2)
WAITMS($wait)
END_IF
END_IF
END_IF
ELSE
LOGWRITE("Картинка не найдена")
TFWRITE("Тест на скорость.txt","Картинка не найдена")
HINTPOPUP("Картинка не найдена")
HALT
END_IF
END_CYC
//==============================================================================
$time_test=$_ms-$ms_start
propusk:
TFWRITE("Тест на скорость.txt", STRCONCAT(" Разрешение экрана ",$_xmax+1,"x",$_ymax+1))
TFWRITE("Тест на скорость.txt", STRCONCAT(" Картинка ",$picture))
TFWRITE("Тест на скорость.txt", STRCONCAT(" Количество повторов ",$cicle))
TFWRITE("Тест на скорость.txt", STRCONCAT(" Задержка мс ",$wait))
IF($time_test>999)
$s=INT($time_test/1000)
$ms=$time_test-$s*1000
IF($s>59)
$m=INT($s/60)
$s=$s-$m*60
IF($m>59)
$h=INT($m/60)
$m=$m-$h*60
END_IF
END_IF
ELSE
$ms=$time_test
END_IF
TFWRITE("Тест на скорость.txt", STRCONCAT(" Время теста ",$time_test," мс, или ",$h," час. ",$m," мин. ",$s," сек. ",$ms," мс."))
HALT
-
Выводы.
Перебор функцией трёх совпадающих пикселов вторым способом IF_PIXEL_IN/PXL в 2 раза быстрее IF_PICTURE_IN так же из 3-х совпадающих пикселов. Заметьте трёх!
Такие маленькие картинки редко используют. А увеличение размеров влечёт рост времени поиска. Использование процента совпадения повлечёт рост времени ещё больше.
В примере IF_PIXEL_IN/PXL применялось регулярное смещение в ряд. В реальных операциях смещение желательно подобрать нерегулярное как по X так и по Y. Это уменьшит вероятность промежуточных совпадений и обеспечит уникальность.
Конечно в задачах не требующих скорости реакции или повторений на сотни тысяч проще вырезать картинку. Но и с быстрым способом больших проблем нет, всё делается быстро.
Впервые серьёзно задумался над данным вопросом после прочтения страждущего на этом форуме. Посмотрел приложение. Помните с хоккеем (сейчас уже не найду). Первая моя реакция была: фиг успеешь отследить, особенно на большой области экрана и тем более нескольких взаимнодвижущихся объектов с такой скоростью какая там была.
Так вот может пригодится?... ;)
-
Да я понимаю, что основная задержка при работе с экраном приходится на GETSCREEN, особенно при больших разрешениях. Было бы замечательно изменение этой команды введением дополнттельных параметров ограничивающих область, как это было сделано с COLORMODE. Конечно если такое возможно и если это целесообразно в плане увеличения скорости.
-
Хех, выводы сделал, а результаты выложить забыл.
шаблон 10 000 совпадений первого пикселя
Разрешение экрана 1280x1024
Картинка textures\pictest1.bmp
Количество повторов 30
Задержка мс 10
Время теста 7038 мс, или 0 час. 0 мин. 7 сек. 38 мс.
Разрешение экрана 1280x1024
Картинка textures\pictest1.bmp
Количество повторов 30
Задержка мс 10
Время теста 7015 мс, или 0 час. 0 мин. 7 сек. 15 мс.
шаблон 100 000 совпадений первого пикселя
Разрешение экрана 1280x1024
Картинка textures\pictest1.bmp
Количество повторов 30
Задержка мс 10
Время теста 7475 мс, или 0 час. 0 мин. 7 сек. 475 мс.
Разрешение экрана 1280x1024
Картинка textures\pictest1.bmp
Количество повторов 30
Задержка мс 10
Время теста 7420 мс, или 0 час. 0 мин. 7 сек. 420 мс.
шаблон 100 000 совпадений 3-х пикселей
Разрешение экрана 1280x1024
Картинка textures\pictest1.bmp
Количество повторов 30
Задержка мс 10
Время теста 7806 мс, или 0 час. 0 мин. 7 сек. 806 мс.
Разрешение экрана 1280x1024
Картинка textures\pictest1.bmp
Количество повторов 30
Задержка мс 10
Время теста 7521 мс, или 0 час. 0 мин. 7 сек. 521 мс.
шаблон 100 000 совпадений 15-и пикселей
Разрешение экрана 1280x1024
Картинка textures\pictest2.bmp
Количество повторов 30
Задержка мс 10
Время теста 8467 мс, или 0 час. 0 мин. 8 сек. 467 мс.
Разрешение экрана 1280x1024
Картинка textures\pictest2.bmp
Количество повторов 30
Задержка мс 10
Время теста 8395 мс, или 0 час. 0 мин. 8 сек. 395 мс.
шаблон 1 совпадение 15-и пикселей
Разрешение экрана 1280x1024
Картинка textures\pictest2.bmp
Количество повторов 30
Задержка мс 10
Время теста 8688 мс, или 0 час. 0 мин. 8 сек. 688 мс.
Разрешение экрана 1280x1024
Картинка textures\pictest2.bmp
Количество повторов 30
Задержка мс 10
Время теста 8578 мс, или 0 час. 0 мин. 8 сек. 578 мс.
шаблон 100 000 совпадений 3 пиксела ф-я PXL()
Разрешение экрана 1280x1024
Картинка textures\pictest2.bmp
Количество повторов 30
Задержка мс 10
Время теста 4288 мс, или 0 час. 0 мин. 4 сек. 288 мс.
Разрешение экрана 1280x1024
Картинка textures\pictest2.bmp
Количество повторов 30
Задержка мс 10
Время теста 4366 мс, или 0 час. 0 мин. 4 сек. 366 мс.