Методы распознавания
Как только ваш макрос выходит за рамки простых касаний, главным фактором надёжности становится не сам клик, а то, как вы распознаёте цель. Сложные макросы работают лучше всего, когда для автоматизируемого интерфейса выбирается правильный метод распознавания.
Начните с простейшего надёжного сигнала
Перед настройкой параметров сначала выберите наиболее стабильный сигнал:
- Используйте фиксированные координаты, только если положение цели никогда не меняется
- Используйте распознавание изображений, когда визуальная форма стабильна и уникальна
- Используйте распознавание текста, когда подписи распознать проще, чем значки
- Используйте
Region()меньшего размера, когда вы примерно знаете, где должна появиться цель
Если работают несколько стратегий, отдавайте предпочтение той, у которой наименьшая область поиска и наименьшая неоднозначность.
Screen или Region
Самая частая ошибка производительности — поиск по всему экрану для всех задач.
Используйте Screen, когда:
- цель может появиться почти где угодно
- вы создаёте первую версию макроса
- вы изучаете новый сценарий приложения
Используйте Region, когда:
- цель всегда появляется в известной части интерфейса
- на экране есть повторяющиеся значки или повторяющийся текст
- нужно более быстрое и стабильное сопоставление
local actionArea = Region(900, 1600, 1080, 2200)
actionArea:click("continue-button.jpg")
Методика подгонки области (Fit Region)
Один из самых полезных продвинутых методов — так называемая fit region (подгонка области).
Идея такова:
- Найти объект один раз с помощью
Screen:find() - Преобразовать это совпадение в подогнанную
Regionс помощьюresult:getRegion() - Повторно использовать эту подогнанную область для последующих поисков, если размер объекта остаётся стабильным
Это хорошо работает, когда:
- объект всегда имеет одинаковую ширину и высоту
- содержимое объекта может меняться, но его контейнер остаётся неизменным
- полноэкранный поиск затратен и выполняется часто
local result = Screen:find("inventory-panel.jpg")
if result then
local fitRegion = result:getRegion()
local collectButton = fitRegion:find("collect-button.jpg")
if collectButton then
fitRegion:click("collect-button.jpg")
end
end
Почему это эффективно:
- первый полноэкранный поиск — самая затратная операция
- после нахождения объекта все последующие поиски ограничиваются подогнанными границами
- это может значительно снизить затраты на OCR и сопоставление изображений в повторяющихся процессах
Используйте подгонку области, когда:
- есть стабильная панель, карточка, всплывающее окно, слот или контейнер
- макрос многократно взаимодействует внутри одного и того же найденного объекта
- один и тот же объект появляется в разных местах, но сохраняет свои размеры
Избегайте подгонки области, когда:
- объект сильно меняет размер между экранами или устройствами
- целевая область динамически расширяется или сворачивается
- первое совпадение слишком общее и может привязаться не к тому контейнеру
На практике подгонка области — один из лучших способов превратить медленный макрос Screen в быстрый макрос Region без жёсткого задания координат.
Распознавание изображений или распознавание текста
Предпочитайте распознавание изображений, когда:
- цель в основном графическая
- язык интерфейса может меняться
- текст стилизован или отрисован внутри кнопки
- OCR испытывает затруднения, потому что текст слишком мелкий или низкоконтрастный
Предпочитайте распознавание текста, когда:
- подпись меняет положение, но сохраняет одинаковую формулировку
- один и тот же визуальный компонент встречается во многих темах или состояниях
- форма кнопки меняется, но подпись остаётся читаемой
- нужно сопоставить текст, динамически генерируемый приложением
OCR слово за словом или строка за строкой
При использовании распознавания текста метод распознавания имеет значение:
- Используйте
setDetectionMethod(1)для одного слова или очень короткой подписи - Используйте
setDetectionMethod(2), когда цель — фраза или целая строка
Screen:click("Login", ClickParams():setDetectionType("TEXT"):setDetectionMethod(1))
Screen:wait("Your session has expired", 5000, FinderParams():setDetectionType("TEXT"):setDetectionMethod(2))
Постепенная настройка оценки совпадения
Слишком высокая оценка совпадения приводит к пропускам. Слишком низкая оценка приводит к ложным срабатываниям.
Практический процесс настройки:
- Начните с оценки по умолчанию
- Если цель пропускается, немного снизьте оценку
- Если сопоставляется не то, что нужно, немного повысьте оценку
- Если происходят оба случая, сначала сократите область поиска, прежде чем дальше менять оценку
В большинстве случаев снижение неоднозначности с помощью Region() безопаснее, чем слишком агрессивная настройка оценки совпадения.
Используйте оттенки серого только тогда, когда это помогает
Оттенки серого могут повысить скорость, а иногда и стабильность, но это не всегда означает улучшение.
Используйте оттенки серого, когда:
- цель определяется в большей степени формой, чем цветом
- изменения освещения или цвета делают сопоставление нестабильным
- нужно более быстрое сопоставление на устройствах попроще
Избегайте полагаться на оттенки серого, когда:
- цвет — главное отличие между похожими целями
- вы пытаетесь различить активное и неактивное состояния по цвету
Динамическое масштабирование
Если один и тот же макрос запускается на устройствах с разным разрешением, динамическое масштабирование помогает сохранить работоспособность распознавания изображений.
Используйте динамическое масштабирование, когда:
- шаблон был захвачен на одном устройстве, а выполняется на другом
- один и тот же макет приложения меняет размер на разных телефонах или планшетах
Но если интерфейс и без того весьма стабилен на одном устройстве, хорошо обрезанный шаблон плюс подходящая область обычно надёжнее, чем избыточная настройка масштабирования.
Агрессивно обрезайте шаблоны
Хороший шаблон должен содержать только то, что делает цель уникальной.
Хороший шаблон:
- сам значок
- область уникальной подписи
- минимальный стабильный визуальный паттерн
Плохой шаблон:
- большое окружающее пустое пространство
- анимированный фон
- содержимое, которое меняется при каждом запуске
- соседние элементы, не являющиеся частью цели
Двухэтапное распознавание для сложных экранов
Когда экран зашумлён, используйте поэтапный подход:
- Дождитесь стабильного элемента-якоря
- Сузьте область поиска
- Распознайте конечную цель внутри этой области
Screen:wait("settings-title.jpg", 5000)
local footerArea = Region(0, 1700, 1080, 2400)
footerArea:click("save-button.jpg")
Рекомендуемый шаблон
Для сложных макросов обычно безопасен следующий порядок действий:
- Дождитесь стабильного состояния
- Ограничьте область поиска
- Осознанно выберите распознавание изображений или текста
- Настраивайте оценку только после уменьшения неоднозначности
- Проверьте результат перед продолжением