1

Тема: AHK: медленная работа PixelSearch

Добрый день!
У меня был ранее написанный скрипт (года три назад), выполняющий некую работу. Сегодня запустил, а он сильно тормозит. Оказалось, что тормоза идут при выполнении  команды PixelSearch. Квадрат 30х30 она прочёсывает секунд за 15 (если он пустой). Раньше она работала раз в 100 быстрее.

PixelSearch, X, Y, 1000, 160, 1030, 190, 0x0000c6 
if ErrorLevel
	MsgBox, That color was not found in the specified region.
else
	MsgBox, A color within 3 shades of variation was found at X%X% Y%Y%.

AHK стоит последней версии v1.1.23.05, Windows 7 x64.

Это теперь так и должно быть, или я что-то не учёл?

2

Re: AHK: медленная работа PixelSearch

Можно быстрый режим использовать.


PixelSearch, X, Y, 1000, 160, 1030, 190, 0x0000c6, 0, Fast
if ErrorLevel
    MsgBox, That color was not found in the specified region.
else
    MsgBox, A color within 3 shades of variation was found at X%X% Y%Y%.

3

Re: AHK: медленная работа PixelSearch

Точно, так работает значительно быстрее. Спасибо.

4

Re: AHK: медленная работа PixelSearch

Tsubasa пишет:

Квадрат 30х30 она прочёсывает секунд за 15

Так медленно не должно быть. А что за три года изменилось, может быть ОС? Или процессор занят чем-то другим.

5 (изменено: YMP, 2016-04-17 10:53:37)

Re: AHK: медленная работа PixelSearch

А вы у себя проверили? У меня тоже секунд 15 занимает, что выглядит странно. Что там так долго делать, не понятно.

Процессор явно ни при чём, ОС — Win10.

6

Re: AHK: медленная работа PixelSearch

У меня старый компьютер, ещё дольше ищет.
SetBatchLines, -1 помогло уменьшить время в полтора раза. Проверял на старой версии AutoHotkey - то же самое. А с параметром Fast почти мгновенно отрабатывает. Значит она всегда так и работала. Просто до этого мало кто искал по 900 точек за раз.

7

Re: AHK: медленная работа PixelSearch

У меня операционка не менялась, Windows 7 Prof. Точнее, стояла та же самая, потом снёс и поставил заново. Может быть, какие-то обновления винды сыграли роль?

У меня программа искала даже не 900 точек (это я уж совсем сузил область), а на экране 1920х1080. Три года назад такой поиск отрабатывал за пару секунд, не больше (а если искомая точка находилась ближе к левому верхнему краю, то и вообще почти мгновенно). А теперь та версия скрипта прочёсывает экран так долго, что можно успеть заварить чай и провести чайную церемонию. С Fast-ом стало так же быстро, как раньше.

8

Re: AHK: медленная работа PixelSearch

Если 900 раз запустить команду для отдельного пикселя, то ищет действительно долго.
А если искать один раз, но в большом регионе, то всё отрабатывает быстро. 1000x1000 пикселей прочёсывает за 3 секунды. Windows XP, AutoHotkey 1.1.23.05.

9

Re: AHK: медленная работа PixelSearch

Долго, порядка 0,5-1 сек, выполняется следующий код:


e::
{
HP_1 := HP_2 := HP_3 := HP_4 := HP_5 := ""	;очистка переменных

Loop, 5
	{
;ищет чёрный пиксель в пяти горизонтальных полосках размером 1*51 пиксель
	PixelSearch, x, y, x_%A_Index%_1, y_Search, x_%A_Index%_2, y_Search, 0x000000, Fast
;и вычисляет длину этой полоски до чёрного пикселя
	HP_%A_Index% = % x - x_Search_%A_Index%_1
	}

MsgBox, %HP_1% %HP_2% %HP_3% %HP_4% %HP_5%
return
}	
q::reload

Точнее сказать не могу, потому что - и это вторая проблема - не могу нарыть, как засечь время выполнения скрипта.
Что тут можно сделать?

10

Re: AHK: медленная работа PixelSearch

В коде не заданы координаты поиска.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11 (изменено: Foma, 2021-06-24 17:53:29)

Re: AHK: медленная работа PixelSearch

как засечь время выполнения скрипта.
Что тут можно сделать?

e::
{
Start := A_TickCount
...
TimeMSC := A_TickCount - Start
MsgBox, Время выполнения этой части кода: %TimeMSC% миллисекунд.
...
}	
q::reload

  Добавил нужное в код.

12 (изменено: isxodnik, 2021-06-25 03:50:00)

Re: AHK: медленная работа PixelSearch

teadrinker пишет:

В коде не заданы координаты поиска.

Там длинная портянка переменных, не хотел захламлять:


e::
;объявляем переменные для PixelSearch, ищем 0x000000:

;по оси X
;первый фрейм (player)
x_Search_5_1 := 2278	;начало поиска
x_Search_5_2 := 2329	;конец поиска
HP_5 :=						;результат ( = PixelSearch - (x_Search_5_1 - 1))

;второй фрейм (party1)
x_Search_1_1 := 2337	;начало
x_Search_1_2 := 2388	;конец
HP_1 :=						;результат

;третий фрейм (party2)
x_Search_2_1 := 2395
x_Search_2_2 := 2446
HP_2 :=

;четвёртый фрейм (party3)
x_Search_3_1 := 2454
x_Search_3_2 := 2505
HP_3 :=

;пятый фрейм (party4)
x_Search_4_1 := 2512
x_Search_4_2 := 2564
HP_4 :=

;по оси Y, общее для всех
y_Search := 1329

{
Start := A_TickCount

HP_1 := HP_2 := HP_3 := HP_4 := HP_5 := ""	;очистка переменных

Loop, 5
	{
;ищет чёрный пиксель в пяти горизонтальных полосках размером 1*51 пиксель
	PixelSearch, x, y, x_Search_%A_Index%_1, y_Search, x_Search_%A_Index%_2, y_Search, 0x000000
;и вычисляет длину этой полоски до чёрного пикселя
	HP_%A_Index% = % x - x_Search_%A_Index%_1
	}

TimeMSC := % A_TickCount - Start

MsgBox, %HP_1% %HP_2% %HP_3% %HP_4% %HP_5%, Время выполнения этой части кода: %TimeMSC% миллисекунд.
return
}
q::reload
Foma пишет:

Добавил нужное в код.

Спасибо! Результаты странные - от 109-125 до 4100 - 4700 мс... То есть может, но не всегда хочет?
На всякий случай - проц i9-10900, 128 гб оперативы.

13

Re: AHK: медленная работа PixelSearch

В выложенном коде нет ничего, что могло бы оправдать 4100 - 4700 мс. Возможно что-то приостанавливает выполнение данного цикла, что именно, можно только гадать. Не вижу в вашем коде CoordMode. По умолчанию координаты отсчитываются от активного окна, а не от экрана.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14 (изменено: isxodnik, 2021-06-25 13:31:55)

Re: AHK: медленная работа PixelSearch

Воспользовался подсказкой из соседней темы:


#NoEnv
#MaxHotkeysPerInterval 99000000
#HotkeyInterval 99000000
#KeyHistory 0
ListLines Off
Process, Priority, , R
SetBatchLines, -1
SetWinDelay, -1
SetControlDelay, -1

Получил время выполнения 62 - 78 чаще всего - 94 мс. Супер! Правда, напоминаю сам себе мартышку, которую посадили набирать "Войну и мир"... Зато работает!

teadrinker пишет:

Не вижу в вашем коде CoordMode. По умолчанию координаты отсчитываются от активного окна, а не от экрана.

Ага. В этом есть смысл, но к этому вопросу я вернусь позже, когда (если) всё будет работать как надо. Снимать координаты - простая, но нудная работа.
...
Да блин! опять 1-4 секунды тот же самый кусок кода!
...
Всё упирается в PixelSearch. Один вызов этой функции, без петель и переменных, на такой же полоске, занимает 860 мс.
Гуглю - все жалуются на низкую скорость. И понятно, PixelSearch работает со скриншотами...
(как я тогда получил 78 мс?)
Чем его можно заменить?