Здравствуйте, возможно ли анализировать область экрана быстрее чем функцией 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