본문 바로가기

블로그 / 기술

50층을 어떻게 재나: PallMark 촬영·측정 전용 실행 옵션을 만든 이야기

탑을 오르는 로그라이크는 원하는 층·클래스 상태로 들어갈 방법이 없어 스크린샷도 성능 측정도 막혔다. 제품 경로를 그대로 지나가는 숨은 실행 옵션을 만들어 1·30·50층 fps를 재고 깨끗한 컷을 찍은 기록이다.

Salmonholic ·· 4분 읽기

-pallmark-capture 실행 옵션으로 50층·각인병·레벨 50 상태로 바로 들어가는 흐름을 보여주는 도식

PallMark는 아직 개발 중인 게임이고, Steam 출시를 준비하고 있다. 스토어에 올릴 스크린샷 8컷을 찍어야 했고, 성능 목표인 144fps를 깊은 층에서도 지키는지 확인해야 했다. 그런데 두 가지가 같은 벽에 막혔다. 원하는 상태의 게임 화면에 들어갈 방법이 없었다.

측정하고 싶은 층에 들어갈 수가 없었다

PallMark는 탑을 한 층씩 오르는 게임이다. 그래서 “30층에서 각인병이 적 수십 마리와 싸우는 장면”을 보려면 거기까지 올라가야 한다. 내 저장 데이터는 최고 6층이었다. 1층은 캐릭터 레벨이 1이라 제대로 보기도 전에 1분 안에 죽는다. 깊은 층에 들어가 그 상태를 붙잡고 있을 방법 자체가 없었다.

자동 주행 봇으로 얻은 장면도 써 봤지만 두 가지가 걸렸다. 바닥에 떨어진 아이템 이름표가 화면을 어지럽혔고, 구도가 스토어용으로 약했다. 게다가 6층을 끝내고 캐릭터 선택 화면으로 돌아가면 앞 층의 아이템 이름표가 화면에 남는 결함도 있었다. 먼저 이름표가 씬 전환과 세션 종료 때 깨끗이 정리되게 고치고, 반증 시험으로 다시 안 남는지 확인했다.

성능도 마찬가지였다. 마을은 쉽게 잴 수 있었지만, 정작 느릴 법한 30·50층은 그 상태로 들어갈 수가 없으니 숫자가 없었다. 느낄 수는 있어도 잴 수가 없는 상태였다.

제품 경로를 그대로 지나가는 실행 옵션

그래서 촬영과 측정 전용으로 숨은 실행 옵션을 만들었다. 명령줄에 -pallmark-capture가 있을 때만 켜지고, 일반 메뉴에는 나오지 않는다. 옵션이 없으면 아무 일도 일어나지 않는다는 것을 반증 시험으로 고정해 두었다.

-pallmark-capture
  -capture-class marked      # 클래스
  -capture-floor 50          # 몇 층
  -capture-level 50          # 캐릭터 레벨
  -capture-gear floor-tier   # 그 층 등급 장비
  -capture-perf-seconds 60   # 60초 측정

중요한 건 이 옵션이 가짜 화면을 띄우는 게 아니라는 점이다. 평소와 똑같은 부트 흐름을 자동으로 밟는다. 타이틀에서 클래스를 고르고, 마을에 도착하고, 탑 입구로 걸어가 지정한 층으로 들어간다. 레벨마다 뜨는 실제 스킬 선택 창도 그대로 뜨고, 자동으로 하나씩 고른다. 지정한 핫바가 있으면 그 선택이 끝난 뒤 덮어쓴다. 저장 파일은 건드리지 않는 임시 세션이라 내 진행 데이터가 바뀌지 않는다.

촬영·측정 모드가 제품 부트 경로를 그대로 지나가는 다섯 단계

가짜 클라이언트를 따로 만들지 않은 이유는 분명하다. 측정하려는 건 실제로 사용자가 보게 될 화면이다. 측정용으로 가볍게 만든 길을 재면 숫자가 거짓말을 한다. 그래서 자동 빌드 점검이 쓰는 것과 같은 제품 경로를 쓰고, 촬영할 때만 바닥 이름표를 숨기는 옵션(-capture-hide-loot-labels)을 따로 두었다.

3초 기다린 뒤 프레임마다 시간을 적는다

측정 옵션을 켜면 준비가 끝난 뒤 프레임마다 시간을 파일에 적는다. 열은 세 개다. 프레임 번호, 시작부터 흐른 초, 그 프레임에 걸린 밀리초. 단, 준비 직후 3초는 건너뛴다. 씬과 셰이더가 처음 올라오는 동안의 튀는 값을 빼기 위해서다. 이렇게 모은 프레임 시간으로 평균 fps뿐 아니라 하위 1%와 p95까지 계산할 수 있다.

이 옵션으로 각인병을 골라 마을·1층·30층·50층을 각각 60초씩 쟀다. 노트북 GPU, 1920×1080, 수직동기화를 끈 상태다.

장소 평균 fps 하위 1% low p95(ms)
마을 211 133 6.40
1층 162 78 9.20
30층 88 34 20.5
50층 93 29 25.0

장소별 평균 fps와 하위 1% low. 30·50층이 목표 144fps 아래로 떨어진다

144fps는 한 프레임에 6.944ms 안에 끝내야 한다는 뜻이다. 마을과 1층은 여유가 있지만, 30·50층은 평균조차 목표의 절반 근처다. 50층은 1분 시점에 화면에 보이는 적이 12~48마리, 화면 밖까지 치면 활성 적이 수십에서 100마리가 넘는다. 거기에 피해 숫자, 공격 예고, 장판 이펙트가 겹친다.

숫자가 생기자 다음 할 일이 분명해졌다

성능 목표 144fps는 9월 초에 다시 확인하고 낮추지 않기로 정했다. 그러니 선택지는 두 가지가 아니다. 느껴지는 적을 줄이는 것은 금지다. 사방에서 몰려드는 밀도가 이 게임의 핵심이기 때문이다. 화질을 몰래 떨어뜨려 숫자만 맞추는 것도 안 된다. 남은 길은 같은 화면을 더 싸게 그리는 것뿐이고, 그 작업은 어디가 비싼지 정확히 알아야 시작할 수 있다.

이 실행 옵션이 한 일이 그것이다. “깊은 층이 느린 것 같다”를 “30층 평균 88, 50층 평균 93, 1% low는 30 근처”라는 반복 가능한 숫자로 바꿨다. 같은 명령 한 줄이면 수정 전후를 같은 조건에서 다시 잴 수 있다. 측정 도구가 먼저 있어야 최적화가 거짓 없이 진행된다.

이 숫자를 들고 들어간 최적화 쪽 이야기는 적 무리 AI와 144fps에 적었다. 깊은 층을 어렵게 만든 밸런스 조정은 50층 밸런스 이틀에 있다. 게임 자체는 PallMark 게임 페이지에서 소개를 볼 수 있다.

#PallMark#성능 측정#Unity#개발 도구#스크린샷#144fps

함께 읽으면 좋은 글

전체 글 →