모래게임 Sandrop TIL 27
재 보려다 못 잰 성능
몇 분을 플레이했는데 42프레임만 잡혔다
전에 최적화할 때 나중에 하기로 남겨 둔 성능 항목이 하나 있었다. 캔버스(모래가 채워지는 그림판)를 매 프레임 다시 그리는 게 무거운지, 무거우면 그리는 방식을 바꿀지 정하는 건데 한 번도 재 본 적이 없었다. 이번에 재 보기로 했다.
안드로이드 기본 도구로 프레임 통계를 뽑았더니 몇 분을 플레이했는데 42프레임만 잡혔다. 초당 60프레임이면 만 단위가 나와야 한다. 5초짜리 프레임 같은, 있을 수 없는 값도 섞여 있었다.
이 도구는 안드로이드 화면 부품(뷰)이 그리는 것을 잰다. 그런데 Flutter는 그 부품을 거치지 않고 자기 표면(surface)에 직접 그린다. 도구가 보고 있는 것과 재려는 것이 아예 달랐다.
- 숫자가 나왔다고 잰 게 아니다. 해석하기 전에 표본 수와 값의 범위가 말이 되는지 먼저 본다
- 이상한 값이 섞였을 때 “그건 빼고 보자”로 넘어가지 않는다. 도구가 틀렸다는 신호일 수 있다
- 익숙한 도구를 집기 전에 그게 무엇을 세는 도구인지 본다. 게임 엔진·웹뷰·Flutter처럼 화면을 직접 그리는 것들은 대개 이 함정이 있다
재지 못한 채로 내리기로 했다
제대로 재는 방법은 따로 있었지만, 그 전에 출시본을 내 폰에 깔아 직접 플레이해 보니 버벅임이 없었다. 원래 이 항목은 최적화 때 “재 보고 문제가 없으면 뺀다”는 조건을 달아 남겨 둔 것이다. 숫자로 재지는 못했어도 체감으로 여유가 있는 건 확인됐다.
그래서 보류로 내렸다. 다만 그냥 내리면 나중에 같은 고민을 처음부터 다시 하게 되니 세 가지를 같이 적었다.
- 내린 이유 — 어느 기기에서 어떻게 확인했는지
- 다시 볼 조건 — 저사양 기기가 생기거나, 오래 플레이할 때 발열·배터리 불만이 실제로 들어올 때
- 다음에 잴 방법 — 이번에 헛짚은 도구와 제대로 재는 방법. 안 적으면 다음에도 익숙한 도구부터 집는다
조건 없이 내린 건 보류가 아니라 잊음이다.
광고가 안 떴다
11탄부터 나와야 할 광고가 14탄까지 안 나왔다
11탄부터 전면 광고가 나와야 하는데 14탄까지 직접 해 봐도 한 번도 안 나왔다. 조건을 잘못 걸었나 싶어 Claude에게 확인하게 했더니 로그에 답이 있었다. 광고를 싣다 실패했고, 실패 코드는 재고 없음(no fill)이었다. 요청은 제대로 나갔고 줄 광고가 없었을 뿐이다.
앱이 아직 심사 중이라 광고 재고가 거의 안 붙는다. 신규 앱은 출시 직후에도 며칠간 흔한 일이다. 우리 쪽 처리도 같이 확인됐다. 실패하면 간격을 두고 다시 싣고, 준비가 안 됐으면 게임을 막지 않고 넘어간다.
- 안 뜨는 것과 못 뜨는 것은 다르다. 로그의 오류 코드를 보기 전에는 구별이 안 된다
- 개발 중에는 테스트 광고가 늘 나오므로 재고 없음을 겪을 일이 없다. 실제 광고로 바꾼 뒤 안 나와도 놀라지 않는다
- 반대로 실제 광고로 바꾸는 걸 잊어도 테스트 광고가 계속 나와서 눈치채기 어렵다. 양쪽으로 조심할 자리다
콘솔이 게임 서비스를 붙이겠냐고 물었다
분석 도구로 보고 있으니 괜찮다고 여기기 쉽다
Play Console이 게임 서비스(업적·리더보드·클라우드 저장을 다루는 구글 기능)를 붙이겠냐고 물었다. 지금 붙일 이유가 없어 보여서 일단 넘기기로 했다. 그런데 Claude와 이야기하다 보니 짚어 둘 게 있었다.
이 게임은 분석 도구로 “몇 탄에서 사람들이 그만두는가”를 보고 있다. 그래서 유저 데이터를 어느 정도 다루고 있다고 느끼기 쉽다. 그런데 그건 집계다. 개인의 진행 상황을 지켜 주는 것과는 상관이 없다. 지금 진행 상황은 기기 안에만 있어서, 300탄까지 깬 사람이 폰을 바꾸거나 앱을 지우면 처음부터다.
- “데이터를 보고 있다”와 “데이터를 지키고 있다”를 구분한다. 집계는 우리가 판단하려고 쓰는 것이고, 복원은 유저가 잃지 않으려고 필요한 것이다
붙이면 로그인이 따라온다
그래서 클라우드 저장을 백로그에 적었다. 다만 지금 넣지는 않기로 했다. 붙이면 로그인이 생기고, 지금의 “계정 없음·로그인 없음”이라는 단순함이 사라진다. 개인정보처리방침에 조항을 넣어야 하고 스토어의 데이터 보안 양식(앱이 무엇을 수집하는지 신고하는 항목)도 다시 써야 한다.
- 기능 하나가 아니라 딸려 오는 것까지 묶어서 값을 매긴다
- 붙일 시점을 “언젠가”가 아니라 조건으로 적는다. 이번엔 “실제로 요청이 들어올 때”로 뒀다. 지금 넣으면 아무도 안 쓰는 로그인 화면만 는다