뜯어본 것공개

오토플레이 테스트 툴

봇이 맵을 돌며 성능을 재는 툴. 끼임을 「데이터의 모순」으로 잡고 오탐을 두 타이머로 걷어내는 방식이 제 것보다 나았습니다.

제가 이미 하고 있는 일을 더 잘하는 방법이 여기 있었습니다. 콘솔 게임에 탑재형 무인 오토플레이 성능 테스트 툴을 만든 발표입니다. 그래픽 옵션 30가지를 매 빌드마다 손으로 재는 게 불가능해서 봇이 스스로 맵을 돌며 성능을 측정하게 만들었습니다. 저도 봇을 맵에 풀어 놓는 일을 하고 있는데, 끼임을 판정하는 방식이 제 것보다 정확했습니다 — 그리고 그 차이가 코드 몇 줄입니다.

제약 둘이 설계를 통째로 결정했다 벽 1 — 조합 플랫폼별 그래픽 옵션을 합치면 약 30가지 매 빌드마다 손으로? 불가능하다 벽 2 — 플랫폼 콘솔은 외부 자동화 도구를 못 붙인다 → 게임 패키지 안에 탑재하는 수밖에 그래서 철학이 하나로 정해진다 완벽한 재현은 포기한다 — 무슨 일이 있어도 멈추지 않고 데이터를 이어 모은다 ⇒ 뒤에 나오는 설계 넷이 전부 이 한 문장에서 파생된다 폴백도 타임아웃 가드도 텔레포트도, "멈추지 않는다"를 지키려고 붙은 장치다
제약이 둘뿐인데 설계 전체가 거기서 나온다. 철학이 먼저가 아니라 제약이 먼저였다.

무엇을 만든 물건인가

게임 패키지 안에 들어가는 무인 테스트 봇입니다. 성능 최적화는 “측정 → 작업 → 같은 조건에서 재측정” 의 반복인데, 같은 조건을 30번 만들어 주는 사람이 없으면 성립하지 않습니다. 그래서 봇이 대신 돕니다.

콘솔이 설계를 지배했습니다. PC라면 밖에서 스크립트를 붙이면 되는데, 콘솔은 보안·규격상 외부 도구를 못 붙입니다. 그러니 자동화가 게임 안에 있어야 하고, 이 전제가 이후 전부를 결정합니다.

네 덩어리로 만들었습니다 — 경로 탐색 · 전투 · 미션 판별 · 아키텍처.

덩어리 무엇을 푸나
경로 탐색 복잡한 레벨에서 봇이 길을 못 찾거나 끼는 문제
전투 몬스터가 수십 마리 쏟아질 때 타겟 스캔이 프레임을 먹는 문제
미션 판별 사람이 입력한 데이터의 오타로 매칭이 깨지는 문제
아키텍처 한 곳이 멈추면 전체가 서는 문제

대표 기법 — 끼임을 「데이터의 모순」으로 잡는다

길찾기는 3단계 폴백입니다. ①표준 경로 탐색 → ②잘 끼는 연결 구간의 비용을 무한대로 올려 우회 → ③연결 구간과 높이 변화를 전부 배제하고 평지 우선. 셋 다 실패하면 텔레포트합니다.

그런데 제일 좋은 건 끼임을 감지하는 방식입니다. 길찾기는 “통과 가능” 이라고 했는데 실제로는 좁은 틈에 낀 상태 — 이걸 두 값의 모순으로 잡습니다.

  • 가속도가 있다 — 이동 입력은 유지되고 있다. 봇은 가려고 한다.
  • 평면 속도가 10cm/s 미만이다 — 실제로는 안 가고 있다.

둘이 동시에 참이면 물리적으로 모순이고, 그게 끼임입니다.

그리고 여기서 한 겹을 더 씁니다. 즉시 텔레포트하면 오탐이 납니다 — 스킬을 쓰느라 또는 상호작용하느라 의도적으로 멈춘 정상 상태를 끼임으로 오인합니다. 그래서 타이머 둘의 AND 게이트로만 확정합니다.

타이머 재는 것 임계
입력은 있는데 안 움직인 누적 시간 가속도 있음 + 속도 <10cm/s 1.5초
목표까지 거리가 안 줄어든 누적 시간 벽에 막혀 제자리걸음 1.2초

둘 다 넘는 순간만 진짜 끼임입니다. 단순한 논리 하나로 길찾기 우회 로직을 통째로 걷어냈습니다.

나머지 둘도 실용적입니다. 전투는 전체 스캔을 캐시가 비었을 때만 하고 이후엔 가까운 K개만 갱신합니다 — 몬스터가 어그로로 다가온다는 성질을 이용한 겁니다. 미션 판별은 문자열 비교 대신 편집 거리로 유사도 75% 이상이면 같은 타입으로 봅니다. 사람이 입력한 데이터의 오타 하나로 봇이 미션에서 이탈하는 것을 막는 장치입니다.

깨본 결과

끼임 판정 — 후보를 모순으로 잡고, 확정을 AND 로 건다 모순 감지 가려는 입력은 있는데 실제 속도는 10cm/s 미만 타이머 둘의 AND 안 움직인 시간 1.5초 초과 거리 안 줄어든 시간 1.2초 초과 확정 → 텔레포트 멈추지 않고 계속 돈다 데이터 수집이 안 끊긴다 내 쪽은 시간 하나로만 판정한다 — 그래서 의도적으로 멈춘 것도 끼임으로 센다 모순 감지가 후보를 좁히고, AND 게이트가 오탐을 걷는다. 둘이 다른 일을 한다 ⚠ 그리고 이 툴이 못 잡는 것을 발표가 먼저 말한다 — 시각 버그는 판단 불가 성능은 숫자로 나오지만 "화면이 이상한가"는 봇이 못 본다. 그 자리는 여전히 사람이다
모순 감지와 AND 게이트는 같은 문제를 푸는 게 아니다. 하나는 후보를 만들고 하나는 오탐을 걷는다.

수치가 붙어 있는 게 이 발표의 강점입니다. 최적화 사례를 렌더 스레드 시간 평균 −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 자동화도 게임 안에서 돌면서 게임을 느리게 만들 수 있는데, 그걸 재본 적이 없습니다.