감지 전략
매크로가 단순한 탭을 넘어서면, 안정성에 있어 가장 중요한 요소는 클릭 자체가 아니라 대상을 어떻게 감지하느냐입니다. 고급 매크로는 자동화하는 UI에 맞는 올바른 감지 전략을 선택할 때 가장 잘 작동합니다.
가장 단순하면서 안정적인 신호로 시작
설정을 조정하기 전에 먼저 가장 안정적인 신호를 선택하세요:
- 대상 위치가 절대 변하지 않을 때만 고정 좌표 사용
- 시각적 모양이 안정적이고 구별되는 경우 이미지 감지 사용
- 아이콘보다 라벨을 인식하기 쉬운 경우 텍스트 감지 사용
- 대상이 대략 어디에 나타날지 이미 알고 있을 때 더 작은
Region()사용
여러 전략이 작동한다면, 검색 영역이 가장 작고 모호함이 가장 적은 것을 선호하세요.
Screen vs Region
가장 흔한 성능 실수는 모든 것을 전체 화면에서 검색하는 것입니다.
다음과 같은 경우 Screen을 사용하세요:
- 대상이 거의 어디든 나타날 수 있을 때
- 매크로의 첫 버전을 만들고 있을 때
- 새로운 앱 흐름을 탐색하고 있을 때
다음과 같은 경우 Region을 사용하세요:
- 대상이 항상 UI의 알려진 섹션에 나타날 때
- 화면에 반복되는 아이콘이나 반복되는 텍스트가 있을 때
- 더 빠르고 안정적인 매칭을 원할 때
local actionArea = Region(900, 1600, 1080, 2200)
actionArea:click("continue-button.jpg")
Fit Region 기법
가장 유용한 고급 기법 중 하나는 fit region입니다.
핵심 아이디어는:
Screen:find()를 사용하여 객체를 한 번 찾기result:getRegion()을 사용하여 해당 일치 항목을 맞춤Region으로 변환- 객체 크기가 안정적으로 유지되는 경우 다음 검색에 해당 맞춤 영역 재사용
다음과 같은 경우에 잘 작동합니다:
- 객체가 항상 동일한 너비와 높이를 가질 때
- 객체 내용은 변경될 수 있지만 컨테이너 영역은 일관되게 유지될 때
- 전체 화면 검색이 비용이 많이 들고 자주 반복될 때
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 및 이미지 매칭 비용을 크게 줄일 수 있음
다음과 같은 경우 fit region을 사용하세요:
- 안정적인 패널, 카드, 팝업, 슬롯 또는 컨테이너가 있을 때
- 매크로가 동일하게 일치된 객체 내에서 반복적으로 상호작용할 때
- 동일한 객체가 다른 위치에 나타나지만 동일한 크기를 유지할 때
다음과 같은 경우 fit region 사용을 피하세요:
- 객체가 화면이나 기기 간에 크게 크기가 조정될 때
- 대상 영역이 동적으로 확장되거나 축소될 때
- 첫 번째 일치 항목이 너무 일반적이어서 잘못된 컨테이너에 바인딩될 수 있을 때
실제로 fit region은 좌표를 하드코딩하지 않고 느린 Screen 매크로를 빠른 Region 매크로로 변환하는 가장 좋은 방법 중 하나입니다.
이미지 감지 vs 텍스트 감지
다음과 같은 경우 이미지 감지를 선호하세요:
- 대상이 주로 그래픽일 때
- UI 언어가 변경될 수 있을 때
- 텍스트가 양식화되어 있거나 버튼 안에 렌더링될 때
- 텍스트가 너무 작거나 대비가 낮아 OCR이 어려울 때
다음과 같은 경우 텍스트 감지를 선호하세요:
- 라벨이 위치는 변경되지만 동일한 문구를 유지할 때
- 동일한 시각적 컴포넌트가 여러 테마나 상태로 나타날 때
- 버튼 모양은 변경되지만 라벨은 읽을 수 있게 유지될 때
- 앱에 의해 동적으로 생성된 텍스트를 매칭해야 할 때
단어별 vs 줄별 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()으로 모호성을 줄이는 것이 일치 점수를 너무 공격적으로 올리는 것보다 안전합니다.
도움이 될 때만 그레이스케일 사용
그레이스케일은 속도를 향상시킬 수 있고 때로는 일관성을 개선할 수도 있지만, 무조건 더 좋은 것은 아닙니다.
다음과 같은 경우 그레이스케일을 사용하세요:
- 대상이 색상보다 모양으로 더 정의될 때
- 조명이나 색상 변화로 인해 매칭이 불안정할 때
- 저사양 기기에서 더 빠른 매칭을 원할 때
다음과 같은 경우 그레이스케일에 의존하는 것을 피하세요:
- 색상이 유사한 대상 간의 주요 차이점일 때
- 색상으로 활성 및 비활성 상태를 구분하려 할 때
동적 스케일링
동일한 매크로가 해상도가 다른 기기에서 실행되는 경우, 동적 스케일링은 이미지 감지가 계속 사용 가능하도록 유지하는 데 도움이 될 수 있습니다.
다음과 같은 경우 동적 스케일링을 사용하세요:
- 템플릿이 한 기기에서 캡처되었지만 다른 기기에서 실행될 때
- 동일한 앱 레이아웃이 폰이나 태블릿에서 크기가 조정될 때
하지만 UI가 이미 단일 기기에서 매우 일관적이라면, 잘 다듬어진 템플릿과 좋은 영역이 스케일링을 과도하게 조정하는 것보다 일반적으로 더 안정적입니다.
템플릿 적극적으로 자르기
좋은 템플릿은 대상을 고유하게 만드는 요소만 포함해야 합니다.
좋은 템플릿:
- 아이콘 자체
- 고유한 라벨 영역
- 최소한의 안정적인 시각적 패턴
나쁜 템플릿:
- 주변의 큰 여백
- 애니메이션되는 배경
- 실행할 때마다 변경되는 콘텐츠
- 대상의 일부가 아닌 주변 요소
어려운 화면을 위한 2단계 감지 사용
화면이 복잡한 경우 단계적 접근 방식을 사용하세요:
- 안정적인 앵커 요소 대기
- 검색 영역 좁히기
- 해당 영역 내에서 최종 대상 감지
Screen:wait("settings-title.jpg", 5000)
local footerArea = Region(0, 1700, 1080, 2400)
footerArea:click("save-button.jpg")
권장 패턴
고급 매크로의 경우 일반적으로 가장 안전한 순서는 다음과 같습니다:
- 안정적인 상태 대기
- 검색 영역 제한
- 의도적으로 이미지 또는 텍스트 감지 선택
- 모호성을 줄인 후에만 점수 조정
- 계속하기 전에 결과 확인