|
Количество нажатий send ограничено FPS в клиенте |
|
|
Sheeck |
21.3.2021, 16:09
|
Neophyte
Сообщений: 36
Регистрация: 5.8.2012 Группа: Пользователи Наличность: 0
Пользователь №: 15.174
Возраст: 29
|
Цитата(cirus @ 21.3.2021, 15:41) Нет никаких проверок. Чем быстрее проц, тем быстрее обрабатывается скрипт. Фпс на клики и нажатия клавиш вообще никак не влияет.
влияет, если принудительно снизить фпс клиента до 1ед, либо просто сделать окно клиента неактивным в фоне, то скрипт вообще может 2 минуты эти команды обрабатывать, даже если нагрузка на проц 30% а не 100% и этот же скрипт при полной нагрузке на проц по блокноту отрабатывает эти нажатия раз в 100 быстрее, т.к. у блокнота фпс под 1000 а если отвязать скрипт от клиента игры и запустить его то вся эта часть скрипта с нажатиями обработается за 1секунду даже при полной нагрузке на проц отсюда и возникает ощущение что после каждого нажатия в клиент, пилот ждет какойто ответ либо выставляют какуюто задержку основываясь на производительности клиента можете на самом деле все это проверить сами
|
|
|
|
cirus |
21.3.2021, 16:48
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26702
Пользователь №: 16.971
Возраст: 29
|
Цитата пилот ждет какойто ответ Ждёт ответ от приложения, когда будет обработано сообщение. Так быстрее будет?: Код [/code] [code]--lua local ffi = require("ffi") log 'clear' log 'mode compact' local WM_CHAR = 0x0102 ffi.cdef[[ bool PostMessageA(int hWnd, int Msg, unsigned int wParam, unsigned int lParam); bool SendMessageA(int hWnd, int Msg, unsigned int wParam, unsigned int lParam); ]]
function _send (text) local h = workwindow() for s in string.gmatch(text, ".") do -- цикл, ищет все слова в строке ffi.C.PostMessageA(h, WM_CHAR, s:byte(), 1) -- не ждать ответ от приложения -- ffi.C.SendMessageA(h, WM_CHAR, s:byte(), 1) -- ждать ответ от приложения end end
local t = os.clock() for i=1, 20 do -- повторить 20 раз _send('d1234536d123345d123453') _send('673890d12345-=') end log('Затрачено времени: ' .. tostring(os.clock()-t))
|
|
|
|
cirus |
21.3.2021, 17:48
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26702
Пользователь №: 16.971
Возраст: 29
|
Цитата напиши пожалуйста для send217 приложение просто сенд не воспринимает Если б ещё знать как он реализован. Возможно так: Код --lua local ffi = require("ffi") log 'clear' log 'mode compact' local WM_KEYDOWN = 0x0100 local WM_KEYUP = 0x0101 ffi.cdef[[ bool PostMessageA(int hWnd, int Msg, unsigned int wParam, unsigned int lParam); short VkKeyScanA(char ch); ]]
function _send (text) local h = workwindow() for s in string.gmatch(text, ".") do -- цикл, ищет все слова в строке local code = bit.band(ffi.C.VkKeyScanA(s:byte()), 0xff) ffi.C.PostMessageA(h, WM_KEYDOWN, code, 1) ffi.C.PostMessageA(h, WM_KEYUP, code, 1) -- убрать эту строку если по два символа будет вводить end end
local t = os.clock() for i=1, 20 do -- повторить 20 раз _send('d1234536d123345d123453') _send('673890d12345-=') end log('Затрачено времени: ' .. tostring(os.clock()-t))
|
|
|
|
Sheeck |
21.3.2021, 18:03
|
Neophyte
Сообщений: 36
Регистрация: 5.8.2012 Группа: Пользователи Наличность: 0
Пользователь №: 15.174
Возраст: 29
|
Цитата(cirus @ 21.3.2021, 17:48) Если б ещё знать как он реализован. Возможно так:
Затрачено времени: 0.0049999999999955 нажатия клавиш не проходят, проверил на блокноте пишет в логах Затрачено времени: 0.017999999999972 в блокнот проходят а есть возможность включить репит определенного блока нажатий на скажем 5-8с реальный по системному времени? вот как у меня repeat 20 только было бы repeat_for_8000ms
|
|
|
|
Sheeck |
21.3.2021, 20:29
|
Neophyte
Сообщений: 36
Регистрация: 5.8.2012 Группа: Пользователи Наличность: 0
Пользователь №: 15.174
Возраст: 29
|
Цитата(DarkMaster @ 21.3.2021, 19:07) Он никогда и не подстраивался под фпс и ничего не учитывал.
а почему тогда получается так что в клиент с низким фпс спам нажатий очень долго исполняется? настолько большая разнциа что один и тотже скрипт может выполняться в разы дольше или быстрее именно sned217 нажатия интересуют, ничего другого игра не воспринимает
|
|
|
|
Sheeck |
22.3.2021, 10:56
|
Neophyte
Сообщений: 36
Регистрация: 5.8.2012 Группа: Пользователи Наличность: 0
Пользователь №: 15.174
Возраст: 29
|
Цитата(DarkMaster @ 22.3.2021, 7:34) разработчик вашего приложения.
ffi.C.PostMessageA(h, WM_KEYDOWN, code, 1) ffi.C.PostMessageA(h, WM_KEYUP, code, 1) можете сюда напрямую вбить код клавиши.
причем тут приложение если пилот во все приложение обычной командой send или send217 отправляет нажатие и время обработки скрипта пилотом напрямую зависит от производительности приложения, если его засуспендить то и скрипт в пилоте чуть ли не замирает а в какихто моментах пилот просто зависает пока приложение не разморозить, это не только этой игры касается я давно это и везде замечаю разумеется я про обычные команды сенд в пилоте, без луа там и прочих махинаций да команды работают спасибо, а до _send('num_1') както это можно ужать? вот как cirus сделал для обычный 12345 нажатий?
|
|
|
|
DarkMaster |
22.3.2021, 11:14
|
Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27680
Пользователь №: 11.279
|
Цитата причем тут приложение если пилот во все приложение Есть вин апи. В вин апи есть две функции - send и post. Send отправляет гарантированное нажатие с ожиданием ответа от приложения, что команда получена. Post - шлет вслепую, иногда это приводит к очень большим проблемам и непрогнозируемым сбоям скриптов. Пилот же лишь представляет интерфейс для работы с этими функциями. В нормально написанном приложении либо нет нагрузки, которая может заблокировать принятие эвента по нажатию клавиши (например, калькулятор), либо обработка эвентов вынесена в отдельный поток, чтобы не было блокировки. Держать в одном потоке эвенты и обрабатывать графику примерно тоже самое, что делать яйцо фаберже в кузове белаза, когда в него руду насыпают. Цитата а до _send('num_1') както это можно ужать? создать таблицу ascii кодов с читаемым значением и добавить парсинг. Хотя как по мне, то проще отдельную функцию сделать под многосимвольные клавиши и выкинуть парсинг как таковой. Либо вообще не заморачиваться, выкинуть парсинг, отсылать сразу коды клавиш.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
cirus |
22.3.2021, 11:57
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26702
Пользователь №: 16.971
Возраст: 29
|
код
Код --lua local ffi = require("ffi") log 'clear' log 'mode compact' local WM_KEYDOWN = 0x0100 local WM_KEYUP = 0x0101 ffi.cdef[[ bool PostMessageA(int hWnd, int Msg, unsigned int wParam, unsigned int lParam); short VkKeyScanA(char ch); ]]
-- таблица с кодами клавиш -- добавить нужные клавиши local VirtualKey = { ['num_1'] = 0x61, ['num_2'] = 0x62, ['F1'] = 0x70, ['F2'] = 0x71 }
function _send (text) local h = workwindow() local code = text:match('%{(.+)%}') -- если в тексте есть фигурные скобки {}, то считается что надо нажать клавишу из таблицы if code then if VirtualKey[code] then -- если в таблице есть нужный элемент ffi.C.PostMessageA(h, WM_KEYDOWN, VirtualKey[code], 1) ffi.C.PostMessageA(h, WM_KEYUP, VirtualKey[code], 1) else log('В таблице отсутствует клавиша: ' .. code) end return end
for s in text:gmatch(".") do -- отправить текст посимвольно local code = bit.band(ffi.C.VkKeyScanA(s:byte()), 0xff) ffi.C.PostMessageA(h, WM_KEYDOWN, code, 1) ffi.C.PostMessageA(h, WM_KEYUP, code, 1) -- убрать эту строку если по два символа будет вводить end end
_send('qwe123') -- отправить текст _send ('{num_2}') -- нажать num2 _send ('{num_1}') -- нажать num1 _send ('{F1}') -- нажать f1 virtual-key-codes
|
|
|
|
Sheeck |
22.3.2021, 13:09
|
Neophyte
Сообщений: 36
Регистрация: 5.8.2012 Группа: Пользователи Наличность: 0
Пользователь №: 15.174
Возраст: 29
|
Цитата(DarkMaster @ 22.3.2021, 11:14) Есть вин апи
Так про взаимодействие с вин апи понял да, НО как раз таки пост не нарушает работу скрипта, ему просто пофиг даже если он огромным количеством отправок руинит приложение, только что попробовал без делеея поспамить, приложение зависло намертно, а вот сенд и ожидание ответа от приложения в вин апи и получение ответа от вин апи пилотом ломает посути выполнения скрипта, к примеру если идет отправка через сенд в приложение и оно зависает, вайтскрин, ну думаю на винде все знают что это, так вот, если приложение зависает то и скрипт в пилоте а иногда и сам пилот тоже намертво зависают, пока не закрыть приложение. для эксперемента написал на ахк простенький скрипт там есть и сенд и сендрав и сендинпат, с бесконечным циклом и спамом, запустил спамить кнопки в приложения, очевидно что оно тоже зависло, но вот скрипт по логам продолжает работать ему хоть бы хны, получается что все же пилот дожидается ответа от вин апи который в свою очередь ждет ответа от приложения о получении нажатия кнопки, а вот именно пост через пилот не руинит выполнение самого скрипта неважно что происходит с приложением, сразу оговорюсь это просто наблюдения я валенок и возможно где то затупил
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|