[Unity] 유니티 최적화 방법

Flaming Bun·2025년 7월 18일

Unity

목록 보기
32/39

참고 사이트 : https://github.com/IndieGameMaker/UnityOptimize

🔥 유니티 최적화

유니티에서 최적화는 게임의 실행 속도, 메모리 사용량, CPU/GPU 사용률을 줄여서 보다 원활하게 동작하게 만드는 과정이다.

이를 위해서 코드, 알고리즘, 데이터 구조, 리소스 관리, 렌더링 방법 등을 개선해야 합니다.



C# 코드와 GC 최적화


오브젝트 풀링

오브젝트 풀링을 사용해서, 빈번한 객체 생성/삭제에 따른 GC 부담을 줄인다.

총알, 이펙트, 몬스터 등 반복적으로 등장하는 오브젝트는 풀링이 필수다.


LINQ

LINQ나 string.Format, string 연결 등은 힙 메모리 할당이 많아 GC를 유발하기 때문에, 반복문이나 StringBuilder 등으로 대체하는 것이 좋다.

무조건적으로 StringBuilder를 사용하는 것이 아니다.
String - 문자열 수정하는 수가 적을 경우
StringBuilder - 많은 횟수의 변경이 예상될 때 사용


컴포넌트 캐싱

자주 사용하는 컴포넌트는 GetComponent로 매번 찾지 말고 미리 캐싱해서 사용하면 성능에 도움이 된다.


Tag 비교

Tag 비교는 gameObject.tag == "TagName" 대신 CompareTag("TagName")로 처리하는 것이 빠릅니다.



렌더링 최적화


Draw Call 최적화

Draw Call을 줄이기 위해 Static Batching, Dynamic Batching, 동일 머티리얼/메시로 병합을 한다.

Static Batching : 움직이지 않는 오브젝트를 하나로 묶기
Dynamic Batching : 자주 움직이는 소형 메시들 묶기 (Draw Call 감소)


SRP(URP/HDRP) 등 최신 렌더링 파이프라인

SRP(URP/HDRP) 등 최신 렌더링 파이프라인을 쓰면 드로우콜 관리와 커스텀 쉐이더 최적화가 수월하다.


LOD 시스템

LOD 시스템을 이용해서 멀리 있는 오브젝트는 저폴리곤/저해상도 모델로 교체해 성능을 확보할 수 있다.


오브젝트/렌더링 비활성화 (컬링)

Occlusion Culling(가림처리), Distance Culling(거리 기반 비활성화)으로 카메라에 보이지 않는 오브젝트의 렌더링을 막아 성능을 높일 수 있다.

커스텀 컬링 스크립트로도 불필요한 오브젝트를 비활성화할 수 있다.



텍스처 및 리소스 최적화


텍스처 압축

텍스처 압축 포맷을 각 플랫폼에 맞게 사용하는 것이 중요하다.

안드로이드는 ETC1/ETC2
iOS는 PVRTC
ASTC(고품질/고압축)


아틀라스

아틀라스를 사용해서 여러 스프라이트를 하나의 텍스처로 합치면 드로우콜이 크게 줄어든다.


불필요한 Mipmap 끄기

불필요한 Mipmap은 꺼서 메모리 사용량을 줄이고, 필요한 곳에만 켜야한다.

Mipmap을 사용하면 대략 33% 메모리가 더 사용된다.

Mipmap이 불필요한 경우 : UI, 원근감이 필요 없는 경우, 2D 게임



물리 및 충돌 관련 최적화


Raycast 사용

Physics.Raycast를 남발하지 않고, Physics.RaycastNonAlloc을 사용해서 메모리 할당을 줄일 수 있다.


Layer Mask 사용

Layer Mask를 적극적으로 사용해서 충돌 대상군을 최소화하면, 연산을 줄일 수 있다.



애니메이션/사운드/UI 최적화


Hash 사용

애니메이션 상태를 문자열이 아닌 Hash 값으로 사용하면 성능이 개선된다.


Canvas 갱신 횟수 최소화

UI의 경우 Canvas 갱신 횟수를 최소화하고, 불필요한 오브젝트는 SetActive로 꺼둔다.

하나의 UI가 변경되면 Canvas 안에 모든 UI를 다시 그린다.

따라서, 자주 변경되는 Canvas는 분리해서 사용해야 한다.



메모리/리소스 관리

사용하지 않는 리소스는 Resources.UnloadUnusedAssets() 등으로 메모리에서 내리고, Addressable/AssetBundle 등을 활용해서 필요한 순간에만 리소스를 로딩하면 전체 메모리 사용량을 줄일 수 있다.



비동기 처리 및 빌드 세팅

비동기 씬/리소스 로딩으로 로딩 지연을 분산시키고, 불필요한 코드/리소스가 빌드에 포함되지 않도록 관리해야 한다.



프로파일링/병목 분석

가장 중요한 것은 Profiler와 Frame Debugger 등의 툴로 병목을 먼저 확인한다.

사용자에게 체감이 크게 가는 문제(프레임 드랍, 로딩 지연 등)부터 우선적으로 개선하는 것이 효율적이다.

무작정 최적화하지 말고, 우선순위를 두고 최적화해야 한다.

0개의 댓글