---
title: "한 줄로 배터리를 절반 쓰는 방법"
description: "targetFrameRate 를 30 으로 내리면 프레임 예산이 두 배가 됩니다. 최적화 코드를 짜기 전에 이 한 줄을 먼저 재 봐야 하는 이유."
author: "유니얼"
pubDate: 2026-09-09
category: "game-dev/unity/rendering"
tags: ["Unity", "최적화", "렌더링"]
canonical: https://blog.unialgames.com/posts/unity-target-framerate/
---
지금까지의 글은 전부 **같은 화면을 더 싸게 그리는 법** 이었습니다.
여기서 방향을 한 번 바꿉니다. **덜 자주 그리는 것** 도 선택지입니다.

```csharp
Application.targetFrameRate = 30;
```

이 한 줄이 앞의 글 여러 편을 합친 것보다 효과가 클 수 있습니다.

## 예산이 두 배가 된다

<x-compare>
<script type="application/json">
{
  "tabs": [
    { "label": "60fps", "text": "한 프레임에 쓸 수 있는 시간이 16.6밀리초입니다. 렌더링과 로직과 GC 가 전부 그 안에 들어가야 합니다.", "stats": [["프레임 예산", "16.6 ms"], ["초당 그리는 횟수", "60"], ["GPU 부하", "기준"]], "tone": "bad" },
    { "label": "30fps", "text": "예산이 33.3밀리초로 늘어납니다. 같은 콘텐츠가 갑자기 여유로워지고, 프레임 튐도 잘 안 보이게 됩니다.", "stats": [["프레임 예산", "33.3 ms"], ["초당 그리는 횟수", "30"], ["GPU 부하", "절반"]], "tone": "good" }
  ]
}
</script>
</x-compare>

지금 프레임이 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 빌드에서 "설정했는데 안 먹는다" 는 대개 이것입니다.

```csharp
QualitySettings.vSyncCount = 0;
Application.targetFrameRate = 30;
```

그리고 **120Hz 기기**가 늘었습니다. 아무것도 안 하면 Unity 가 기기 기본값을 따라가는데,
그러면 120으로 돌면서 배터리를 두 배로 씁니다.
`targetFrameRate` 를 명시하지 않는 것은 "기기가 알아서" 가 아니라
**"제일 비싼 쪽으로" 입니다.**

## 재는 법

30과 60의 차이를 숫자로 보려면 실기에서 A/B 를 해야 합니다.

- `targetFrameRate` 30과 60
- Render Scale 0.8과 1.0

네 조합을 각각 **10분씩** 돌립니다. 10분인 이유는 스로틀링이 그쯤에서 걸리기 시작해서입니다.
1분만 돌리면 네 조합이 다 잘 돌아서 아무것도 못 봅니다.

기록할 것은 셋입니다. 실제 평균 fps, 기기 온도, 배터리 잔량.
온도는 안드로이드면 개발자 옵션이나 `adb shell dumpsys battery` 로 볼 수 있습니다.

> 여기서 **10분 뒤의 fps** 가 진짜 숫자입니다.
> 시작 직후의 60fps 는 아무것도 증명하지 않습니다.

이 표를 한 번 만들어 두면 "우리 게임은 30이 맞다" 를 감이 아니라 근거로 말할 수 있습니다.
그리고 대개 그 표를 보고 나면 최적화 우선순위가 바뀝니다.