한 줄로 배터리를 절반 쓰는 방법
지금까지의 글은 전부 같은 화면을 더 싸게 그리는 법 이었습니다. 여기서 방향을 한 번 바꿉니다. 덜 자주 그리는 것 도 선택지입니다.
Application.targetFrameRate = 30;
이 한 줄이 앞의 글 여러 편을 합친 것보다 효과가 클 수 있습니다.
예산이 두 배가 된다
지금 프레임이 20밀리초 걸린다고 해 봅시다. 60 목표면 매 프레임 미달 이라 화면이 계속 끊깁니다. 30 목표면 13밀리초가 남습니다. 완전히 안정적입니다.
같은 코드입니다. 고친 게 하나도 없습니다.
발열과 배터리
모바일에서는 이게 프레임 이야기로 끝나지 않습니다.
GPU 가 절반만 일하면 발열이 줄고, 발열이 줄면 스로틀링이 안 걸립니다. 스로틀링은 무서운 게, 처음 3분은 60fps 로 잘 돌다가 기기가 뜨거워지면 갑자기 40으로 떨어지고 다시는 안 올라옵니다.
처음부터 30으로 고정한 쪽이, 60으로 돌다 스로틀링에 걸리는 쪽보다 체감이 더 안정적입니다. 40과 60을 오가는 것보다 30으로 붙어 있는 게 덜 거슬립니다.
배터리도 같은 이야기입니다. 30분 플레이에 배터리가 20퍼센트 빠지는 게임과 10퍼센트 빠지는 게임은 리텐션이 다릅니다. 리뷰에 그대로 적힙니다.
그런데 공짜는 아니다
30fps 는 확실히 잃는 게 있습니다.
- 입력 지연이 늘어납니다. 최악의 경우 한 프레임인 33밀리초입니다
- 카메라 팬이 뚝뚝 끊겨 보입니다. 배경이 옆으로 흐르는 화면에서 특히 티가 납니다
- 빠른 액션의 손맛이 죽습니다
그래서 장르가 정합니다.
| 장르 | 권장 |
|---|---|
| 퍼즐, 카드, 방치형, 턴제 | 30 으로 충분합니다. 60일 이유가 없습니다 |
| 횡스크롤 플랫포머, 러너 | 60이 낫습니다. 카메라가 계속 흐릅니다 |
| 액션, 대전 | 60. 입력 지연이 곧 게임성입니다 |
| RPG, 시뮬레이션 | 30. 전투 중에만 60으로 올리는 것도 방법입니다 |
런타임에 바꿀 수 있다는 것도 기억해 두면 좋습니다. 메뉴와 로딩 화면은 30, 전투는 60 식으로 장면마다 다르게 둘 수 있습니다. 그리고 설정 화면에 옵션으로 내놓으면 사용자가 알아서 고릅니다.
vSync 와 같이 봐야 한다
targetFrameRate 는 vSync 가 꺼져 있을 때만 동작합니다.
QualitySettings.vSyncCount 가 0 이 아니면 그쪽이 이깁니다.
모바일은 vSync 개념이 좀 다르고 targetFrameRate 가 먹지만,
에디터나 PC 빌드에서 “설정했는데 안 먹는다” 는 대개 이것입니다.
QualitySettings.vSyncCount = 0;
Application.targetFrameRate = 30;
그리고 120Hz 기기가 늘었습니다. 아무것도 안 하면 Unity 가 기기 기본값을 따라가는데,
그러면 120으로 돌면서 배터리를 두 배로 씁니다.
targetFrameRate 를 명시하지 않는 것은 “기기가 알아서” 가 아니라
“제일 비싼 쪽으로” 입니다.
재는 법
30과 60의 차이를 숫자로 보려면 실기에서 A/B 를 해야 합니다.
targetFrameRate30과 60- Render Scale 0.8과 1.0
네 조합을 각각 10분씩 돌립니다. 10분인 이유는 스로틀링이 그쯤에서 걸리기 시작해서입니다. 1분만 돌리면 네 조합이 다 잘 돌아서 아무것도 못 봅니다.
기록할 것은 셋입니다. 실제 평균 fps, 기기 온도, 배터리 잔량.
온도는 안드로이드면 개발자 옵션이나 adb shell dumpsys battery 로 볼 수 있습니다.
여기서 10분 뒤의 fps 가 진짜 숫자입니다. 시작 직후의 60fps 는 아무것도 증명하지 않습니다.
이 표를 한 번 만들어 두면 “우리 게임은 30이 맞다” 를 감이 아니라 근거로 말할 수 있습니다. 그리고 대개 그 표를 보고 나면 최적화 우선순위가 바뀝니다.