CPU 병목과 GPU 병목

심지태
∙∙조회 8

병목(Bottleneck)은 한 프레임을 처리하는 과정에서 가장 오래 걸려 전체 프레임 속도를 제한하는 부분입니다. CPU와 GPU는 서로 다른 프레임의 작업을 병렬로 처리하지만, 둘 중 더 느린 쪽을 기다려야 하므로 프레임 시간은 일반적으로 CPU 시간과 GPU 시간 중 더 긴 쪽의 영향을 받습니다. 병목이 아닌 부분만 최적화하면 FPS가 거의 오르지 않을 수 있습니다.

CPU 병목

CPU 병목은 게임 로직이나 렌더링 명령 준비가 늦어 GPU가 CPU의 작업을 기다리는 상태입니다.

주요 원인내용
Script복잡한 Update(), 반복문, 탐색 및 AI 계산
Physics많은 Rigidbody·Collider, 잦은 Raycast와 충돌 계산
Animation많은 Animator와 Skinned Mesh 계산
Garbage Collection반복적인 메모리 할당으로 발생하는 GC
Draw CallCPU가 GPU에 너무 많은 렌더링 명령을 전달
오브젝트 관리과도한 생성·삭제, 많은 GameObject와 Component

Unity의 CPU Profiler에서는 Scripts, Physics, Animation, Rendering, GarbageCollector 등의 항목을 통해 CPU가 시간을 소비하는 위치를 확인할 수 있습니다. Draw Call이 지나치게 많으면 CPU가 GPU에 렌더링 명령을 전달하는 과정에서 병목이 발생할 수 있습니다.

CPU 병목 해결 방법

문제대표적인 해결 방법
스크립트 계산 과다불필요한 Update() 제거, 계산 주기 감소
물리 계산 과다레이어 충돌 제한, Collider 단순화
GC 발생오브젝트 풀링, 반복적인 new와 문자열 생성 감소
Draw Call 과다Material 공유, SRP Batcher·GPU Instancing 활용
오브젝트 과다활성 오브젝트 수 제한, 거리 기반 비활성화

GPU 병목

GPU 병목은 그래픽 계산이 늦어 CPU가 GPU의 렌더링 완료를 기다리는 상태입니다.

주요 원인내용
높은 해상도처리해야 하는 픽셀 수 증가
복잡한 Shader픽셀마다 실행되는 그래픽 계산 증가
그림자Shadow Map의 해상도·거리·광원 수 증가
투명 오브젝트같은 픽셀을 여러 번 그리는 Overdraw 발생
Post ProcessingBloom, SSAO, Depth of Field 등의 화면 후처리
높은 폴리곤 수GPU가 처리해야 하는 정점과 삼각형 증가
많은 실시간 조명오브젝트와 픽셀당 조명 계산 증가

GPU Usage Profiler에서는 불투명·투명 오브젝트, 그림자, 후처리 등에 소비된 GPU 시간을 확인할 수 있습니다. GPU ms가 목표 프레임 시간을 초과하면 해당 그래픽 작업을 우선적으로 줄여야 합니다.

GPU 병목 해결 방법

문제대표적인 해결 방법
해상도 과다Render Scale 또는 출력 해상도 감소
Shader 복잡도연산과 텍스처 샘플 수 감소, 단순 Shader 사용
그림자 비용해상도·거리·Cascade·실시간 광원 수 감소
Overdraw투명 오브젝트와 파티클 겹침 감소
폴리곤 과다LOD, Occlusion Culling, 메시 단순화
후처리 과다불필요한 효과 제거, 품질 단계 낮추기

병목 판별

상태판단
CPU Time > GPU TimeCPU 병목 가능성이 높음
GPU Time > CPU TimeGPU 병목 가능성이 높음
해상도를 낮추자 FPS가 크게 상승GPU 병목 가능성이 높음
Draw Call이나 스크립트를 줄이자 FPS가 상승CPU 병목 가능성이 높음
VSync 대기 시간이 큼병목이 아니라 프레임 제한을 기다리는 상태일 수 있음

VSync 또는 Application.targetFrameRate가 설정되어 있으면 CPU Profiler에 대기 시간이 나타날 수 있으므로, 이를 실제 연산 병목으로 오해하지 않아야 합니다.

Unity에서 확인하는 순서

markdown
Window → Analysis → Profiler
        ↓
CPU Usage와 GPU Usage의 프레임 시간 비교
        ↓
CPU 병목 → Scripts, Physics, GC, Rendering 확인
GPU 병목 → Shader, Shadow, Overdraw, Post Processing 확인
        ↓
가장 오래 걸리는 항목부터 하나씩 최적화

성능은 에디터가 아니라 실제 출시 대상 기기에서 측정하는 것이 정확합니다. Development Build와 Autoconnect Profiler를 활성화하여 타겟 기기에서 프로파일링하는 것이 기본적인 측정 방법입니다.

CPU 병목은 “무엇을 그릴지 준비하는 과정”이 느린 상태이고, GPU 병목은 “준비된 화면을 실제로 그리는 과정”이 느린 상태입니다.