1 (изменено: alexii, 2012-04-06 21:14:21)

Тема: AHK: Задержка скрипта

есть такая функция:

checkcolors()
{
    num=0
    Global color1, color2
    PixelGetColor, color, 940, 100
    if color = %color1%
    {
        num:=num+1
    }
    PixelGetColor, color, 940, 530
    if color=%color2%
    {
        num:=num+1
    }
    return num
}

и если её использовать:

1::
if checkcolors() = 2
     Send, h
else
    Send, {1}

То чувствуется задержка при нажатии на кнопку "1" прописал в скрипте Process, Priority, , High, но не сильно помогло... может это из-за функции PixelGetColor (мб она медленная сама по себе) Есть ли более быстрые замены? Или есть способы ускорить работу скрипта?

2 (изменено: Александр_, 2012-04-06 20:22:37)

Re: AHK: Задержка скрипта

Lawlietb32 пишет:

чувствуется задержка

Лучше оперировать цифрами, пример замера времени выполнения функции PixelGetColor(временем выполнения самого цикла пренебрегаем):

SetBatchLines, -1
n := 100
t := A_TickCount
loop %n%
{
   PixelGetColor, color, 1, 1
}
msgbox % (A_TickCount-t)/n

Обратите внимание на первую строчку(имена функций кликабельны).

3

Re: AHK: Задержка скрипта

Александр_, попробовал... с данной функцией показывает 47 (минимальное), а если просто переназначить кнопку - 15... думаю разница ощутима...

4

Re: AHK: Задержка скрипта

Lawlietb32 пишет:

Александр_, попробовал... с данной функцией показывает 47 (минимальное), а если просто переназначить кнопку - 15... думаю разница ощутима...

Что значит "переназначить кнопку"?

5

Re: AHK: Задержка скрипта

ну...

1::2

этот код выполняется в три раза быстрее

1::
if checkcolors() = 2
     Send, h
else
    Send, {1}

6

Re: AHK: Задержка скрипта

Интересует как именно вы проверили скорость выполнения первого кода.

7 (изменено: Lawlietb32, 2012-04-07 02:46:55)

Re: AHK: Задержка скрипта

SetBatchLines, -1
1::
t := A_TickCount
Send, {2}
msgbox % (A_TickCount-t)
return

8

Re: AHK: Задержка скрипта

Ясно, по-моему тут уже ничего не оптимизировать. Но задержку в 50 миллисекунд почти невозможно заметить(это на ~25% медленнее, чем смена кадров в обычном видео).

9 (изменено: creature.ws, 2012-04-07 03:38:38)

Re: AHK: Задержка скрипта

PixelGetColor в среднем занимает 17 мс (ahk_l x64, win7, эффекты aero включены)
Прочий код функции из первого поста 0.001 мс.
Да, PixelGetColor такая сама по себе медленная

10

Re: AHK: Задержка скрипта

спасибо за консультацию = )

11 (изменено: Irbis, 2012-04-07 12:36:57)

Re: AHK: Задержка скрипта

Дополнительный  эффект "задержки" дает Send. SendMode Input заставит скрипт работать быстрей:

; AHK_L 1.1.7.3 Win7 x86
SetBatchLines, -1
; SendMode Input ; раскомментировать и сравнить
return
$1::
DllCall("QueryPerformanceFrequency", "Int64*", Fq)
DllCall("QueryPerformanceCounter", "Int64*", L1)
 loop 50
   Send 1
DllCall("QueryPerformanceCounter", "Int64*", L2)
msgbox % (L2-L1)/Fq*20 " mc" ; 50 циклов * 20 = 1000 (миллисекунд)
return

12

Re: AHK: Задержка скрипта

Irbis, обалдеть! Разница в в разы лучше! у меня около повышение скорости в 15 раз = ) Спасибо!

13 (изменено: creature.ws, 2012-04-07 16:05:25)

Re: AHK: Задержка скрипта

Это не скорости повышение, а явное различие режимов отправки нажатий в параметрах по умолчанию, доступных к изменению при помощи SetKeyDelay:

If SetKeyDelay is never used by a script, the default Delay for the tradional SendEvent mode is 10 (20 for .aut scripts). For SendPlay mode, the default Delay is -1. The default PressDuration (below) is -1 for both modes.

SendInput — «быстрее» так как отсутствуют паузы между «эмулированными нажатиями клавиш».
В контексте скорости выполнения скрипта из первого поста различия будут заключаться в том, что при использовании Send подпрограмма, вызываемая при нажатии клавиши [1], завершится на условные 15 мс позже, чем при использовании SendInput. «Нажатие» {1} будет отправлено системе условно одновременно в обоих случаях.

Кстати, если вы так и используете горячую клавишу отправляющую системе «саму себя» — лучше добавить перед меткой хоткея $.

14

Re: AHK: Задержка скрипта

Странно, на другом компьютере с WinXP SendMode Input дает обратный эффект. А вот если его заменить на

SetKeyDelay, 0, 0

то задерка и вправду будет минимальной