CPU 병목과 GPU 병목
댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.
병목(Bottleneck)은 한 프레임을 처리하는 과정에서 가장 오래 걸려 전체 프레임 속도를 제한하는 부분입니다. CPU와 GPU는 서로 다른 프레임의 작업을 병렬로 처리하지만, 둘 중 더 느린 쪽을 기다려야 하므로 프레임 시간은 일반적으로 CPU 시간과 GPU 시간 중 더 긴 쪽의 영향을 받습니다. 병목이 아닌 부분만 최적화하면 FPS가 거의 오르지 않을 수 있습니다.
CPU 병목은 게임 로직이나 렌더링 명령 준비가 늦어 GPU가 CPU의 작업을 기다리는 상태입니다.
| 주요 원인 | 내용 |
|---|---|
| Script | 복잡한 Update(), 반복문, 탐색 및 AI 계산 |
| Physics | 많은 Rigidbody·Collider, 잦은 Raycast와 충돌 계산 |
| Animation | 많은 Animator와 Skinned Mesh 계산 |
| Garbage Collection | 반복적인 메모리 할당으로 발생하는 GC |
| Draw Call | CPU가 GPU에 너무 많은 렌더링 명령을 전달 |
| 오브젝트 관리 | 과도한 생성·삭제, 많은 GameObject와 Component |
Unity의 CPU Profiler에서는 Scripts, Physics, Animation, Rendering, GarbageCollector 등의 항목을 통해 CPU가 시간을 소비하는 위치를 확인할 수 있습니다. Draw Call이 지나치게 많으면 CPU가 GPU에 렌더링 명령을 전달하는 과정에서 병목이 발생할 수 있습니다.
| 문제 | 대표적인 해결 방법 |
|---|---|
| 스크립트 계산 과다 | 불필요한 Update() 제거, 계산 주기 감소 |
| 물리 계산 과다 | 레이어 충돌 제한, Collider 단순화 |
| GC 발생 | 오브젝트 풀링, 반복적인 new와 문자열 생성 감소 |
| Draw Call 과다 | Material 공유, SRP Batcher·GPU Instancing 활용 |
| 오브젝트 과다 | 활성 오브젝트 수 제한, 거리 기반 비활성화 |
GPU 병목은 그래픽 계산이 늦어 CPU가 GPU의 렌더링 완료를 기다리는 상태입니다.
| 주요 원인 | 내용 |
|---|---|
| 높은 해상도 | 처리해야 하는 픽셀 수 증가 |
| 복잡한 Shader | 픽셀마다 실행되는 그래픽 계산 증가 |
| 그림자 | Shadow Map의 해상도·거리·광원 수 증가 |
| 투명 오브젝트 | 같은 픽셀을 여러 번 그리는 Overdraw 발생 |
| Post Processing | Bloom, SSAO, Depth of Field 등의 화면 후처리 |
| 높은 폴리곤 수 | GPU가 처리해야 하는 정점과 삼각형 증가 |
| 많은 실시간 조명 | 오브젝트와 픽셀당 조명 계산 증가 |
GPU Usage Profiler에서는 불투명·투명 오브젝트, 그림자, 후처리 등에 소비된 GPU 시간을 확인할 수 있습니다. GPU ms가 목표 프레임 시간을 초과하면 해당 그래픽 작업을 우선적으로 줄여야 합니다.
| 문제 | 대표적인 해결 방법 |
|---|---|
| 해상도 과다 | Render Scale 또는 출력 해상도 감소 |
| Shader 복잡도 | 연산과 텍스처 샘플 수 감소, 단순 Shader 사용 |
| 그림자 비용 | 해상도·거리·Cascade·실시간 광원 수 감소 |
| Overdraw | 투명 오브젝트와 파티클 겹침 감소 |
| 폴리곤 과다 | LOD, Occlusion Culling, 메시 단순화 |
| 후처리 과다 | 불필요한 효과 제거, 품질 단계 낮추기 |
| 상태 | 판단 |
|---|---|
CPU Time > GPU Time | CPU 병목 가능성이 높음 |
GPU Time > CPU Time | GPU 병목 가능성이 높음 |
| 해상도를 낮추자 FPS가 크게 상승 | GPU 병목 가능성이 높음 |
| Draw Call이나 스크립트를 줄이자 FPS가 상승 | CPU 병목 가능성이 높음 |
VSync 대기 시간이 큼 | 병목이 아니라 프레임 제한을 기다리는 상태일 수 있음 |
VSync 또는 Application.targetFrameRate가 설정되어 있으면 CPU Profiler에 대기 시간이 나타날 수 있으므로, 이를 실제 연산 병목으로 오해하지 않아야 합니다.
Window → Analysis → Profiler
↓
CPU Usage와 GPU Usage의 프레임 시간 비교
↓
CPU 병목 → Scripts, Physics, GC, Rendering 확인
GPU 병목 → Shader, Shadow, Overdraw, Post Processing 확인
↓
가장 오래 걸리는 항목부터 하나씩 최적화
성능은 에디터가 아니라 실제 출시 대상 기기에서 측정하는 것이 정확합니다. Development Build와 Autoconnect Profiler를 활성화하여 타겟 기기에서 프로파일링하는 것이 기본적인 측정 방법입니다.
CPU 병목은 “무엇을 그릴지 준비하는 과정”이 느린 상태이고, GPU 병목은 “준비된 화면을 실제로 그리는 과정”이 느린 상태입니다.

우리들의 게임 발매 이야기

안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.
XR을 활용한 게임 개발 3기(유니티) 수강생입니다. 곧 수료 하지만 앞으로 이곳에 가끔 저의 개발 경험이 나 지식 기록할까 합니다. 더 나아가 이 사이트가 제 개인위키의 역할을 할 수 있으면 좋겠습니다. 한국 게임 시장을 흔들겠습니다


안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.
XR을 활용한 게임 개발 3기(유니티) 수강생입니다. 곧 수료 하지만 앞으로 이곳에 가끔 저의 개발 경험이 나 지식 기록할까 합니다. 더 나아가 이 사이트가 제 개인위키의 역할을 할 수 있으면 좋겠습니다. 한국 게임 시장을 흔들겠습니다
