1

Тема: AHK: уменьшить нагрузку на CPU.

Здравствуйте. Есть кусок кода:

;OPTIMIZATIONS START
#NoEnv
#MaxHotkeysPerInterval 99000000
#HotkeyInterval 99000000
#KeyHistory 0
ListLines Off
Process, Priority, , A
SetBatchLines, -1
SetKeyDelay, -1, -1
SetMouseDelay, -1
SetDefaultMouseSpeed, 0
SetWinDelay, -1
SetControlDelay, -1
SendMode Input
DllCall("ntdll\ZwSetTimerResolution","Int",5000,"Int",1,"Int*",MyCurrentTimerResolution) ;setting the Windows Timer Resolution to 0.5ms, THIS IS A GLOBAL CHANGE
;OPTIMIZATIONS END
vk45::
Loop
{
GetKeyState, state, vk45
if state = U
break

CoordMode, Pixel, Window
ImageSearch, FoundX, FoundY, 575, 657, 636, 719, C:\Users\User\AppData\Roaming\MacroCreator\Screenshots\Screen_20221120195054.png ; Живой жар
If (ErrorLevel = 0)
{
	Send, {1}
}

}
Return

End::
  ExitApp
Return

Есть проблема в том что скрипт при зажатой клавише все время ищет картинку. И это сильно грузит проц, прям ощущается наглядно. Пробывал через поиск пикселя все так же грузит долго. Есть ли способ что пока пиксель или картинка не найдется полностью скрипт не будет искать, и только при полном соответствии он будет срабатывать.

2

Re: AHK: уменьшить нагрузку на CPU.

Для начала уберите всё вот это:

;OPTIMIZATIONS START
#NoEnv
#MaxHotkeysPerInterval 99000000
#HotkeyInterval 99000000
#KeyHistory 0
ListLines Off
Process, Priority, , A
SetBatchLines, -1
SetKeyDelay, -1, -1
SetMouseDelay, -1
SetDefaultMouseSpeed, 0
SetWinDelay, -1
SetControlDelay, -1
SendMode Input
DllCall("ntdll\ZwSetTimerResolution","Int",5000,"Int",1,"Int*",MyCurrentTimerResolution) ;setting the Windows Timer Resolution to 0.5ms, THIS IS A GLOBAL CHANGE
;OPTIMIZATIONS END

У интерпретатора эти заклинания из нубовского карго-культа могут вызвать в лучшем случае только приступ хохота, а в худшем паралич.
Во-вторых, поясните, что вы имели в виду под

FRATER1234 пишет:

пока пиксель или картинка не найдется полностью скрипт не будет искать

? Что и когда ему искать?
Я б советовал просто добавить Sleep, 50 в цикл.

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

3 (изменено: FRATER1234, 2022-12-27 10:17:50)

Re: AHK: уменьшить нагрузку на CPU.

Показываю то что хочу отслеживать. https://imgur.com/a/Y7z4LOw. У данной иконки есть прокрутка, которая сообщает о готовности. Так вот, пока иконка серая скрипт должен спать, не искать пиксель. Как только иконка становиться нормального цвета без затемнения, скрипт должен сработать. Сейчас у меня скрипт при зажатой клавише, он все время делает поиск в заданной области, тем самым нагружая процессор. И вот этот момент хочется немного оптимизировать. По поводу того что указали убрать, спасибо помогло хорошо так облегчить жизнь скрипту не так сильно стал грузить, но все же осталась проблема с тем что при зажатой клавише он все время делает поиск. А хотелось бы просто чтоб при зажатой клавии, пока нету картинки или пикселя для поиска, скрипт спал, и срабатывал только тогда когда был найден пиксель или картинка. Был бы очень благодарен если может есть аналог как ускорить или упростить. Спасибо заранее за помощь.

4

Re: AHK: уменьшить нагрузку на CPU.

Я не особо понял по картинке, что нужно искать. Можете вместо поиска картинки или пикселя использовать определение цвета пикселя PixelGetColor в каких-то координатах.

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

5

Re: AHK: уменьшить нагрузку на CPU.

FRATER1234 пишет:

хотелось бы просто чтоб при зажатой клавии, пока нету картинки или пикселя для поиска, скрипт спал, и срабатывал только тогда когда был найден пиксель или картинка

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

6

Re: AHK: уменьшить нагрузку на CPU.

Прошу конечно прощение за мои тупые формулировки В идеале конечно хочется добиться чтоб скрипт срабатывал 1 нажатие когда срабатывает ImageSearch. Чтоб при зажатой клавише скрипт не выполнял функцию ImageSearch когда нет совпадений, а только тогда когда есть совпадение. Я попробовал поиграться с функцией sleep, но результаты разные выходили. Так как скорость появление новых иконок в игре меняется в зависимости от моего фпс пк. Если фпс у меня в районе 100+ sleep срабатывает как часы. Но стоит фпс опуститься до 30 или ниже. То Sleep уже не так эффективно работает на тех же цифрах которые я выставил он либо может не сработать с задержкой, либо сработает моментально. Я просто не могу найти решение. Пока что я вот так вот сделал:

vk45::
Loop
{
GetKeyState, state, vk45
if state = U
break

CoordMode, Pixel, Window
PixelSearch, FoundX, FoundY, 499, 161, 572, 236, 0x7DA0D0, 0, Fast RGB
If (ErrorLevel = 0)
{
	Send, {1}
	sleep 150
}

}
Return

End::
  ExitApp
Return

7

Re: AHK: уменьшить нагрузку на CPU.

А как по вашему скрипт узнаёт, что есть совпадения или нет?

8 (изменено: FRATER1234, 2022-12-27 21:45:24)

Re: AHK: уменьшить нагрузку на CPU.

Я немного попробовал сделать вот так вот

vk45::
Loop
{
GetKeyState, state, vk45
if state = U
break

PixelGetColor, color, 575, 657, 636, 719, RGB
If (color = 0xE97FFF)
{
Send, {1 down}
sleep 10
Send, {1 up}
}

}
Return

End::
  ExitApp
Return

Но не сработал. Есть вероятность того что ошибся в координатах. Но я делаю поиск координат через Pulover's Macro Creator выделяю область.
P.S сорян нашел ошибку в координатах просто указав X Y без области. Теперь работает.

9 (изменено: Clannad5, 2022-12-28 06:35:16)

Re: AHK: уменьшить нагрузку на CPU.

FRATER1234 пишет:

Есть ли способ что пока пиксель или картинка не найдется полностью скрипт не будет искать, и только при полном соответствии он будет срабатывать.

Поиск изображения или пикселя работает тогда, когда ваш скрипт сталкивается с подобными командами как ImageSearch, в других случаях он не сможет понять, что у вас находится на экране.

Однако вы можете производить частичное сканирование определенной области и когда эта область будет найдена, уже производить поиск в "полной" области, где нужно тратить больше ресурсов на сканирование.

Например:
Вам необходимо найти в инвентаре зельку.
У вас есть инвентарь, который открывается на клавишу E.
Вы можете сделать как минимум два варианта:
1. Вы начинаете сканировать каждый раз, в течение N-времени после нажатия Е.
2. Вы начинаете сканировать весь инвентарь целиком только тогда, когда ваш скрипт нашел хотя бы маленький кусочек того, что может появиться только в инвентаре и если этот кусочек инвентаря найден, то сканируется весь инвентарь на наличие зелий.

Не нужно каждый раз сканировать весь экран, т.к это слишком затратно, всегда можно сканировать часть того, что может заставить скрипт отсканировать область побольше.

10

Re: AHK: уменьшить нагрузку на CPU.

Clannad5Спасибо за подсказку.

11 (изменено: __Михаил__, 2023-01-01 00:07:59)

Re: AHK: уменьшить нагрузку на CPU.

FRATER1234
Что мешает вычислить время на восстановление перка / скила и т.д. для более точного определения времени когда скрипту нужно начинать сканировать пиксель / область окна на наличие нужной картинки? Это позволит отсрочить нагрузку на процессор в то время когда перк / скил ещё не готов. Например запустили свой скрипт, он ждёт допустим 2-3 секунды и лишь затем начнёт проверки и эмуляции нажатия клавиши, после чего снова 2-3 секунды ожиданий.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

12

Re: AHK: уменьшить нагрузку на CPU.

__Михаил__
Познаний в этом мало. Знать бы еще какая функция. Или образец приблизительный как это могло выглядеть. Звучит сочно, но в реализации с моей стороны пока пусто.

13

Re: AHK: уменьшить нагрузку на CPU.

FRATER1234
Вы кастанули умение - скрипт среагировал на нажатие клавиши этого умения.
Запустился таймер, например 3 секунды.
Началась проверка нужного элемента на экране.
Нашлось.
Повторить всё что выше.

14 (изменено: __Михаил__, 2023-01-01 00:07:40)

Re: AHK: уменьшить нагрузку на CPU.

FRATER1234
Только вы знаете как часто можно активировать кнопку, поэтому мы не знаем что подсказать.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

15

Re: AHK: уменьшить нагрузку на CPU.

Ну смотрите. Global Cooldown способностей 1.5 сек. Когда при нажатии кнопки у меня 1.5 сек еще не доступна способность. Я так понимаю можно сделать через sleep это с небольшим интервалом. Но есть еще один нюанс. Если скорость персонажа увеличивается от базовой то за каждый процент скорости которую мы получаем в игре, скоращается время Global Cooldown. И получается так что если у нас 1.5 сек на Global Cooldown то если на 1% увеличивается скорость то это 0.1% скоращает время действия Global Cooldown и мы уже получаем не 1.5 сек и т.д. Я попробовал привязать к 1.5 сек кулдауну sleep вроде бы неплохо. Но как описал что если скорость персонажа растет то мы сокращаем время действия отката способностей и уже тогда sleep работает во вред мне. Так как идет хард привязка к 1.5 сек.

16

Re: AHK: уменьшить нагрузку на CPU.

FRATER1234
Берите минимальную задержку, которая возможна.
Я вообще не вижу каких-либо проблем использовать проверку всегда, если только у вас не слабый процессор настолько, что не способен выдерживать нагрузку в один пиксель.
Установите просто Sleep 10-50 хотя бы, чтобы комп не страдал, заполняя все частоты вашим поиском.

17

Re: AHK: уменьшить нагрузку на CPU.

Если комп слабый и не вывозит - нужно менять настройки в игре на минимальные, проверить комп на майнеры и прочие вирусы. В крайнем случае уже менять проц (и всё для него подходящее: мат. плату, RAM память, блок питания) на современный.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

18 (изменено: Madmer, 2023-01-07 20:45:18)

Re: AHK: уменьшить нагрузку на CPU.

FRATER1234
Проще всего это сделать через таймер. Вы написали, что кулдаун сокращается в зависимости от скорости. Хорошо, всё равно же есть минимально возможный кулдаун, вот его и ставьте в переменную, которая отвечает за время запуска таймера. Сам таймер будет искать вашу картинку. Если картинка найдена, то запускаете таймер заного. Если не найдена, то вместо запуска таймера уже ищите нужную вам картинку, например, каждые 50мс(чаще смысл есть едва ли). Как только найдёте картинку, то, опять же, запускаете таймер. Только не забудьте в метке, на которую ссылается таймер, сразу же его остановить в любом случае.
Только не указывайте в ссылке на метку для таймера функции, иначе запустив его 1 раз уже не остановите. Более того, сколько раз запустите данный таймер через ссылку на функцию, столько одновременно одинаковых таймеров работать и будет. Для останавливаемых таймеров только метки!

19

Re: AHK: уменьшить нагрузку на CPU.

Еще можно попробовать искать  совпадения через opencv matchtemplate+gpu.