게임이 아무리 재미있어도 화면이 끊기고 기기가 뜨거워지면 플레이어는 금방 떠납니다. 최적화는 같은 화면을 더 적은 비용으로 그리고 계산하는 작업입니다. 이 글에서는 게임 최적화의 출발점인 측정 방법과, 가장 자주 문제가 되는 드로우콜과 메모리를 중심으로 기본기를 정리합니다.
최적화의 첫 단계는 측정
최적화에서 가장 흔한 실수는 느릴 것 같은 곳을 감으로 고치는 것입니다. 실제 원인은 다른 곳에 있는 경우가 많습니다. 먼저 엔진의 프로파일러로 한 프레임 안에서 어떤 작업이 시간을 얼마나 쓰는지 측정해야 합니다.
병목은 크게 CPU 쪽과 GPU 쪽으로 나뉩니다. CPU는 게임 로직, 물리, 애니메이션, 그리고 GPU에 그리라고 명령을 보내는 일을 하고, GPU는 실제로 픽셀을 그립니다. 어느 쪽이 프레임 시간을 잡아먹는지 알아야 올바른 처방을 고를 수 있습니다. 또 개발용 PC가 아니라 목표로 하는 실제 기기에서 측정해야 의미가 있습니다.
드로우콜이란 무엇인가
드로우콜은 CPU가 GPU에게 '이 물체를 이 재질로 그려라'라고 보내는 명령 한 번을 말합니다. 명령 하나를 준비하고 보내는 데에도 비용이 들기 때문에, 작은 물체 수천 개를 따로따로 그리면 GPU가 여유 있어도 CPU가 명령 보내느라 바빠집니다. 특히 모바일 기기에서 자주 문제가 됩니다.
재질(머티리얼)이 바뀔 때마다 GPU 설정을 바꾸는 상태 변경 비용도 생깁니다. 그래서 같은 재질을 쓰는 물체를 묶어 한 번에 그리는 것이 드로우콜 최적화의 기본 방향입니다.
드로우콜을 줄이는 방법
| 방법 | 원리 | 주의점 |
|---|---|---|
| 정적 배칭 | 움직이지 않는 물체를 미리 하나로 합침 | 메모리 사용이 늘 수 있음 |
| 동적 배칭 | 작은 움직이는 물체를 실행 중에 묶음 | 조건이 까다롭고 CPU 비용 발생 |
| GPU 인스턴싱 | 같은 모델을 위치만 바꿔 여러 번 그림 | 풀, 나무, 총알처럼 같은 물체가 많을 때 효과적 |
| 텍스처 아틀라스 | 여러 텍스처를 한 장으로 모아 재질 하나로 공유 | UI와 2D 스프라이트에서 특히 유용 |
| 컬링 | 카메라에 보이지 않는 물체는 그리지 않음 | 가려진 물체를 거르는 오클루전 컬링은 준비 작업 필요 |
UI도 드로우콜을 만듭니다. 캔버스 안의 요소 하나가 바뀌면 캔버스 전체를 다시 계산하는 경우가 있어, 자주 바뀌는 UI와 고정된 UI를 다른 캔버스로 나누는 것이 흔한 방법입니다.
메모리 관리의 기본
메모리가 부족하면 모바일에서는 게임이 강제 종료되기도 합니다. 메모리를 가장 많이 차지하는 것은 대체로 텍스처, 메시, 사운드 같은 리소스입니다. 텍스처 해상도를 화면에 보이는 크기에 맞추고, 기기에 맞는 압축 형식을 쓰고, 밉맵을 적절히 설정하는 것만으로도 크게 줄일 수 있습니다.
- 필요할 때 불러오고 다 쓰면 내리기: 스테이지별로 리소스 묶음을 나눠 관리
- 같은 리소스 중복 로드 막기: 여러 곳에서 같은 파일을 따로 불러오지 않게 확인
- 사운드: 긴 배경음은 스트리밍, 짧은 효과음은 메모리에 미리 올리기
가비지와 오브젝트 풀
C# 기반 엔진에서는 쓰지 않는 메모리를 가비지 컬렉터가 자동으로 회수합니다. 편리하지만 회수 작업이 한꺼번에 일어나면 프레임이 순간적으로 멈춥니다. 매 프레임 문자열을 이어 붙이거나, 리스트를 새로 만들거나, 총알을 생성하고 파괴하는 코드가 대표적인 원인입니다.
오브젝트 풀은 자주 쓰는 객체를 미리 만들어 두고, 필요할 때 꺼내 쓰고 다 쓰면 돌려놓는 방식입니다. 생성과 파괴가 사라지니 가비지도 줄고 생성 비용도 아낄 수 있습니다. C++ 엔진에서도 메모리 조각화를 줄이기 위해 비슷한 방식을 씁니다.
그 밖의 기법과 최적화 습관
- LOD: 멀리 있는 물체는 폴리곤이 적은 모델로 바꿔 그림
- 그림자와 실시간 조명 수 줄이기, 필요한 곳은 라이트맵으로 미리 굽기
- 투명 물체 겹침(오버드로) 줄이기: 파티클과 반투명 UI가 여러 겹 쌓이면 GPU 부담 증가
- 무거운 계산은 몇 프레임마다 한 번씩만 수행
- 해상도와 프레임 제한 옵션을 플레이어에게 제공
최적화는 출시 직전에 몰아서 하면 고칠 범위가 너무 커집니다. 개발 초기에 목표 기기와 목표 프레임을 정하고, 기능을 추가할 때마다 프로파일러로 확인하는 습관이 가장 효과적입니다. 아티스트와 리소스 규칙(폴리곤 수, 텍스처 크기)을 미리 합의해 두는 것도 중요합니다.
SBS아카데미게임학원 게임프로그래밍 과정은 Unity, Unreal Engine 기반 프로젝트 수업을 통해 실제 개발 환경에서 성능 문제를 다뤄 볼 수 있도록 구성되어 있습니다.
자주 묻는 질문
드로우콜은 몇 개 이하로 맞춰야 하나요?
정해진 기준은 없고 기기 성능, 엔진, 렌더링 방식에 따라 다릅니다. 목표 기기에서 직접 측정해 프레임 목표를 지키는지로 판단하는 것이 맞습니다.
최적화는 프로그래머만 하는 일인가요?
리소스 크기와 이펙트 구성에 따라 성능이 크게 달라지므로 아티스트, 기획자와 함께 기준을 정해야 효과가 큽니다.
