모래게임 Sandrop 20
오늘 한 일
- 진행도 분석(Firebase Analytics)을 붙임 — 유저가 몇 탄에서 그만두는지 보려고. 레벨 번호와 성패만 보낸다. 설정이 없거나 인터넷이 끊겨도 게임은 그대로 돌아간다
- 패키지 이름을
sandart에서sandrop으로 바로잡고, 홈화면 이름을샌드아트 Sandrop으로. 출시하면 영영 못 바꾸는 값이라 지금 정리했다 - 개인정보처리방침에 분석 조항 추가 (앞서 광고 조항을 넣은 것에 이어)
- 성능 정리 — 안 변하는 것을 매 프레임 다시 그리고 있었다 (아래 참조)
- 게임 화면 코드를 3483줄에서 2278줄로 쪼갬. 페인터·타일·HUD·장면 모델을 네 파일로
- 일일 접속 보상 — 상자 아홉 개 중 하나를 고른다. 코인 50~200, 아이템 각 2개, 하트 무제한 10·30분
- 실기기 피드백 반영 — 붓는 소리가 안 멈추던 것, 광고가 다음 레벨을 덮던 것, 가로 화면 방지, 코인·승리 소리 볼륨, 소주·청자 배경색, Kenney 도안 채도
막힌 부분
안 변하는 것을 매 프레임 다시 그리고 있었다
코드 상태를 점검하다 렌더링 쪽에서 낭비를 찾았다. 게임 루프가 매 프레임 화면을 새로 그리는데, 바뀌지도 않는 것까지 전부 다시 그리고 있었다.
가장 심한 건 좌측 상단의 작은 레벨 썸네일이었다. 30픽셀짜리 상자 안에 4096개 사각형을 초당 60번 다시 그리고 있었는데, 이게 게임 전체 그리기 작업의 절반을 차지했다. 판이 끝날 때까지 안 변하는 그림인데도.
- 해결: 안 변하는 부분에 경계를 둬서 한 번 그린 걸 재사용하게 했다
- 반대로 모래 캔버스에는 경계를 두지 않았다 — 거긴 실제로 매 프레임 바뀌므로 경계를 둬도 다시 그려야 해서 이득이 없다
- 승리·게임오버 화면이 떠 있어도 뒤에서 계속 60번씩 돌고 있던 것도 멈췄다(배터리·발열)
최적화는 “더 빨리 그리기”보다 “안 그려도 되는 걸 알아내기”가 먼저였다.
색을 매 프레임 다시 계산하고 있었다
모래 알갱이의 자글자글한 질감은 픽셀마다 밝기를 조금씩 다르게 줘서 만든다. 그 값이 픽셀 위치로만 정해지는데도 매 프레임 4096번 다시 계산하고 있었다. 초당 수십 메가바이트의 쓰레기가 생겨 정리 작업이 계속 돌았다.
- 해결: 판에 들어올 때 한 번만 계산해 두고 쓴다
- 표면 윤곽선 색은 더 심했는데, 그릴지 판단하기도 전에 칸마다 두 개씩 만들어 대부분 버리고 있었다. 필요한 만큼만 만들게 고쳤다
핵심 로직 최적화라 안전망을 먼저 깔았다
모래가 어디에 차는지 계산하는 캐시를 손봐야 했는데, 여기가 게임 규칙의 핵심이라 잘못 건드리면 그림이 다르게 채워진다. 문제는 기존 테스트가 그걸 못 잡는다는 것이었다 — 채운 칸의 개수와 클리어 여부만 보기 때문에, 모래가 엉뚱한 칸에 차도 통과한다.
그래서 최적화한 답과 예전 방식의 답이 같은지 매번 확인하는 검사를 넣었다(개발 중에만 돈다). 500레벨 전체를 봇으로 돌려도 한 번도 안 걸렸다.
- 남은 한계: 이 검사는 개발 빌드에서만 돈다. 출시 빌드에서는 꺼지므로, 캐시를 또 손대면 그때도 테스트를 돌려 확인해야 한다
붓는 소리가 계속 났다 — 두 번 고쳤는데도
어제 고쳤다고 생각한 버그가 다시 나왔다. 모래를 붓는 중에 최근 앱 목록 버튼을 누르면 소리가 안 멈추고 계속 반복됐다.
원인이 하나가 아니었다.
- 앱이 가려질 때 소리를 끄는데, 최근 앱 화면에서는 앱이 계속 화면에 그려져서 게임 루프가 안 멈춘다. 그래서 소리를 꺼도 다음 순간 루프가 다시 켰다
-
소리를 켜는 작업이 비동기라, 끄는 명령이 먼저 도착하고 켜는 작업이 나중에 끝나면 아무도 관리하지 않는 소리가 남았다
- 해결: 앱이 앞에 없으면 소리를 아예 못 켜게 빗장을 걸었다. 루프가 계속 돌든 말든 상관없어진다
- 40판쯤 연달아 하면 붓기 소리가 아예 안 나던 것도 같은 누수였던 것으로 보인다
광고가 다음 레벨 위를 덮었다
레벨을 깨고 다음으로 넘어갈 때, 다음 레벨이 먼저 뜨고 그 위를 광고가 덮었다.
광고를 띄우는 명령이 광고가 뜨는 순간 끝난 것으로 처리되고, 닫히는 건 별도 신호로 온다. 그래서 광고가 뜨자마자 다음 화면으로 넘어가 버렸다.
- 해결: 닫힘 신호를 기다렸다가 넘어가게 했다. 신호가 영영 안 오는 경우를 대비해 30초 상한도 뒀다
채도를 올렸더니 크루아상이 빨개졌다
Kenney 도안이 전체적으로 칙칙해서 채도를 1.3배 올렸는데, 크루아상이 구운 갈색에서 주황빛 빨강이 됐다.
원인은 상한이 없었던 것이다. 크루아상은 원래 채도가 0.6으로 이미 진한 편이었는데 곱하기만 하니 0.8까지 올라갔다.
- 해결: 상한을 두어 연한 색만 올리고 진한 색은 그대로 두게 했다
- 되돌릴 때 나눗셈으로 역산하면 원본이 정확히 복원되지 않아, 원본 이미지 178장을 다시 처리했다
다음에 할 일
- 릴리스 서명 (지금은 릴리스도 디버그 키로 서명돼 있어 업로드가 안 된다)
- 하트 5개를 광고 보고(하루 1회) 얻는 상점 옵션
- 배포 전 디버그 모드 제거
- 출시 직전: 출시된 레벨을 스냅샷으로 동결하고 생성기에 동결 모드를 넣어 이후 레벨만 추가 생성
- 언어 전환(한국어/영어) — 문구가 전부 한국어로 박혀 있고, 한글 서체가 쓰는 글자만 담은 서브셋이라 문구를 바꾸면 서브셋을 다시 만들어야 한다
- 스토어 등록물·Play Console (콘텐츠 등급·데이터 보안 양식·타겟층 설정)
- 남은 성능 과제: 캔버스를 이미지로 구워 한 번에 그리기, 게임 루프가 화면 전체를 새로 그리지 않게 하기