오토플레이 테스트 툴
봇이 맵을 돌며 성능을 재는 툴. 끼임을 「데이터의 모순」으로 잡고 오탐을 두 타이머로 걷어내는 방식이 제 것보다 나았습니다.
제가 이미 하고 있는 일을 더 잘하는 방법이 여기 있었습니다. 콘솔 게임에 탑재형 무인 오토플레이 성능 테스트 툴을 만든 발표입니다. 그래픽 옵션 30가지를 매 빌드마다 손으로 재는 게 불가능해서 봇이 스스로 맵을 돌며 성능을 측정하게 만들었습니다. 저도 봇을 맵에 풀어 놓는 일을 하고 있는데, 끼임을 판정하는 방식이 제 것보다 정확했습니다 — 그리고 그 차이가 코드 몇 줄입니다.
무엇을 만든 물건인가
게임 패키지 안에 들어가는 무인 테스트 봇입니다. 성능 최적화는 “측정 → 작업 → 같은 조건에서 재측정” 의 반복인데, 같은 조건을 30번 만들어 주는 사람이 없으면 성립하지 않습니다. 그래서 봇이 대신 돕니다.
콘솔이 설계를 지배했습니다. PC라면 밖에서 스크립트를 붙이면 되는데, 콘솔은 보안·규격상 외부 도구를 못 붙입니다. 그러니 자동화가 게임 안에 있어야 하고, 이 전제가 이후 전부를 결정합니다.
네 덩어리로 만들었습니다 — 경로 탐색 · 전투 · 미션 판별 · 아키텍처.
| 덩어리 | 무엇을 푸나 |
|---|---|
| 경로 탐색 | 복잡한 레벨에서 봇이 길을 못 찾거나 끼는 문제 |
| 전투 | 몬스터가 수십 마리 쏟아질 때 타겟 스캔이 프레임을 먹는 문제 |
| 미션 판별 | 사람이 입력한 데이터의 오타로 매칭이 깨지는 문제 |
| 아키텍처 | 한 곳이 멈추면 전체가 서는 문제 |
대표 기법 — 끼임을 「데이터의 모순」으로 잡는다
길찾기는 3단계 폴백입니다. ①표준 경로 탐색 → ②잘 끼는 연결 구간의 비용을 무한대로 올려 우회 → ③연결 구간과 높이 변화를 전부 배제하고 평지 우선. 셋 다 실패하면 텔레포트합니다.
그런데 제일 좋은 건 끼임을 감지하는 방식입니다. 길찾기는 “통과 가능” 이라고 했는데 실제로는 좁은 틈에 낀 상태 — 이걸 두 값의 모순으로 잡습니다.
- 가속도가 있다 — 이동 입력은 유지되고 있다. 봇은 가려고 한다.
- 평면 속도가 10cm/s 미만이다 — 실제로는 안 가고 있다.
둘이 동시에 참이면 물리적으로 모순이고, 그게 끼임입니다.
그리고 여기서 한 겹을 더 씁니다. 즉시 텔레포트하면 오탐이 납니다 — 스킬을 쓰느라 또는 상호작용하느라 의도적으로 멈춘 정상 상태를 끼임으로 오인합니다. 그래서 타이머 둘의 AND 게이트로만 확정합니다.
| 타이머 | 재는 것 | 임계 |
|---|---|---|
| 입력은 있는데 안 움직인 누적 시간 | 가속도 있음 + 속도 <10cm/s | 1.5초 |
| 목표까지 거리가 안 줄어든 누적 시간 | 벽에 막혀 제자리걸음 | 1.2초 |
둘 다 넘는 순간만 진짜 끼임입니다. 단순한 논리 하나로 길찾기 우회 로직을 통째로 걷어냈습니다.
나머지 둘도 실용적입니다. 전투는 전체 스캔을 캐시가 비었을 때만 하고 이후엔 가까운 K개만 갱신합니다 — 몬스터가 어그로로 다가온다는 성질을 이용한 겁니다. 미션 판별은 문자열 비교 대신 편집 거리로 유사도 75% 이상이면 같은 타입으로 봅니다. 사람이 입력한 데이터의 오타 하나로 봇이 미션에서 이탈하는 것을 막는 장치입니다.
깨본 결과
수치가 붙어 있는 게 이 발표의 강점입니다. 최적화 사례를 렌더 스레드 시간 평균 −48.9%, 상위 5% 구간 −42.6% 로 제시하고, 툴 자체 오버헤드는 프레임당 최대 1.1ms(목표 2ms 이내)라고 밝힙니다. 재는 도구가 재는 대상을 얼마나 방해하는지를 같이 재서 내놓은 것이 드뭅니다.
한계도 스스로 말합니다 — 시각 버그는 판단 불가. 성능은 숫자로 나오지만 “화면이 이상한가” 는 봇이 못 봅니다.
⚠ 다만 −48.9%는 최적화 작업의 효과이지 툴의 효과가 아닙니다. 툴은 그 효과를 재준 것입니다. 인용할 때 이 둘을 붙이면 과장이 됩니다.
⚠ 그리고 임계값 1.5초·1.2초의 근거가 없습니다. 어떻게 정했는지, 다른 값에서 오탐이 어땠는지가 발표에 없습니다. 제 환경에 그대로 가져오면 안 되고 다시 재야 하는 숫자입니다.
내 환경에 대봤다
저도 봇을 맵에 풀어 놓고 걷다 빠지는 지점을 찾습니다. 그런데 끼임 판정을 시간 하나로만 하고 있었습니다 — “N초 동안 위치가 안 변하면 끼임”. 그래서 의도적으로 멈춘 정상 상태를 끼임으로 셉니다.
모순 감지가 제 쪽에 없던 것입니다. “가려는 입력은 있는데 실제로 안 간다” 는 위치만 봐서는 절대 안 나오는 신호입니다. 위치가 안 변한 것은 끼임일 수도 있고 그냥 서 있는 것일 수도 있는데, 입력을 같이 보면 둘이 갈립니다.
AND 게이트는 그다음 층입니다. 모순이 잡혀도 순간적일 수 있으니, 두 시계가 동시에 임계를 넘을 때만 확정합니다. 제 것은 층이 하나뿐이라 후보와 확정이 같은 판정이었습니다.
전투 캐싱과 미션 판별은 제 상황과 안 맞습니다. 제 봇은 전투를 안 하고, 미션 이름을 문자열로 매칭하는 자리도 없습니다.
판정
| 무엇 | 판정 |
|---|---|
| 모순 감지 — 입력과 실제를 같이 본다 | 채택. 위치만 봐서는 안 나오는 신호다 |
| 타이머 AND 게이트로 오탐 걷기 | 채택. 후보와 확정을 층으로 나눈다 |
| 3단계 경로 폴백 | 보류. 제 쪽은 폴백이 필요할 만큼 레벨이 복잡하지 않다 |
| 전투 K개 캐싱 · 편집 거리 매칭 | 해당 없음. 그 문제가 제게 없다 |
| 1.5초 · 1.2초 임계값 | ⚠ 그대로 쓰지 않는다. 근거가 발표에 없다 — 제 환경에서 다시 잰다 |
| −48.9% 수치 인용 | ⛔ 금지. 최적화의 효과이지 툴의 효과가 아니다 |
이 편에서 값을 치른 교훈은 이겁니다 — 같은 문제를 이미 풀고 있어도, 남이 한 겹 더 쌓아 둔 것이 보입니다. 저는 끼임을 시간으로 판정하고 있었고 그게 틀린 건 아닙니다. 다만 후보를 잡는 층과 오탐을 걷는 층을 나누지 않았을 뿐입니다. 층을 나누자마자 오탐의 원인이 이름을 갖게 됐습니다 — “의도적으로 멈춘 정상 상태”.
그리고 ⚠ 도구가 대상을 얼마나 방해하는지를 같이 재는 습관은 그대로 가져올 만합니다. 제 QA 자동화도 게임 안에서 돌면서 게임을 느리게 만들 수 있는데, 그걸 재본 적이 없습니다.