이번 게시글에서는 Unity의 Memory 관리에 대해서 조금 알아보려고 합니다.
주제를 정하게 된 배경
이 주제를 정하게 된 배경에 대해 적어보자면, 최근까지는 메모리를 별로 신경 쓰지 않고 개발을 많이 하고는 했습니다. 하지만 여러 프로젝트를 경험하며, 사용한 Texture, Audio, Mesh, Video 등 다양한 Resource에 대한 최적화를 해두지 않으면 적은 메모리를 가지고 있는 디바이스에서 앱이 구동되지 않을 수 있다는 사실을 알게 되었습니다.
텍스쳐 하나하나, 오디오 하나하나가 많은 영향을 준다는 것을 알고 이 주제에 대해 한번 알아보고자 시작하게 되었습니다.
Unity에서 메모리란?
게임 실행에 필요한 데이터를 저장하거나, 처리하기 위해 사용하는 컴퓨터 메모리, 이 메모리 안에는 위에서 말했던 내용과 같이, Texture, Mesh, Audio, Video 등이 있을 수 있고, 이를 포함한 Scene 또한 메모리에 차지할 수 있습니다.
오늘은 이 중에서 Texture의 최적화에 대해서 다뤄 보려고 합니다. 점차적으로 다른 Resource에 대해서도 다루어 보도록 하겠습니다.
Runtime Texture Memory 할당량을 확인하기 위해서는 아래와 같은 기능을 활용하는 것이 좋다. 여기서는 Memory Profiler를 활용해 보겠습니다.
- Profiler
- Memory Profiler
Memory Profiler
Runtime에 각 Resource 별로 Memory를 얼마나 할당하고 사용하고 있는지, 코드상에서 또는 로직상에서 할당을 해제하였을 때 정말로 해제되었는지를 확인할 수 있는 Profiler라고 생각하면 될 것 같습니다.

처음 Memory Profiler는 설치되어 있지 않고, Profiler창에서 Install을 해주는 방식으로 시작할 수 있습니다.
여기서 확인해보려고 하는 것은 Texture2D의 Runtime용량인데요. 무료 텍스쳐 다운로드 사이트에서 Texture 2종을 다운로드하여 보겠습니다.

각각 용량이 약 22MB, 12MB 인 Texture 2종을 다운로드하였습니다.
그리고 이를 Material의 BaseMap으로 적용하여 Cube에 적용한 뒤 변경된 Memory를 확인해 보겠습니다.

이미지와 같이 두 개의 원본 리소스의 파일의 크기는 상이하고, Unity에 올라간 Memory의 크기는 동일합니다 왜 그럴까요?
이것은 Texture2 D ImportSetting에서 알아볼 수 있습니다.
Texture2 D Import Settings


Texture2 D Import Setting을 확인해 보면 다양한 옵션들이 있는 것을 볼 수 있습니다. 이 중에서 확인해야 될 설정 옵션에 대해 알아보겠습니다.
ImportSettings Options
- Generate Mipmap
- Mipmap Limit
- Platform Settings(Default, Window, Android, iOS)
- Max Size
- Resize Algorithm
- Format
- Compression
- Use Crunch Compression
위와 같은 옵션들을 통해 메모리를 최적화할 수 있습니다. 그 외 옵션은 공유해 주시면 감사하겠습니다.
먼저 Mipmap에 대해서 알아보겠습니다.
Mipmap
Unity에서 Mipmap 이란, 기본 텍스쳐와 이를 연속적으로 미리 축소시킨 텍스쳐로 이루어진 비트맵 이미지의 집합.
이를 통해 멀리 있는 3D 오브젝트의 텍스쳐는 상대적으로 해상도가 적은 텍스쳐를 활용하여, Rendering 하여 GPU의 부하를 줄이고, 가까이 있는 3D 오브젝트의 텍스쳐는 상대적으로 고해상도의 텍스쳐를 활용하여 Rendering 하는 방식입니다.
2D UI 이미지 | 3D Object Texture |
2D UI 이미지는 UI이미지로 거리에 따른 텍스쳐 변경이 불필요. |
Camera의 위치에서 3D Object의 위치는 상대적 그리하여 멀리 있는 3D Object를고해상도의 Texture로 렌더링 할필요가 없음 미리 저해상도의 Texture를 생성하여 비트맵 이미지로 메모리에 할당하여 GPU 최적화용도로 사용. |
다음으로 원본 파일의 파일 크기는 상이하고, 실제 할당된 메모리의 크기가 같은 이유는 Unity에 이미지 파일을 import 할 때 유니티에서 사용하는 Texture format으로 변경하기 때문에 파일크기가 비슷한 것을 볼 수 있습니다.
여기서 중점적으로 확인해 볼 수 있는 옵션은 Max Size, 와 Compression입니다.
먼저 Compression입니다
Compression
각 Platform 별로 지원하는 압축 방식이 정해져 있습니다. 이는 다음과 같습니다. (unity 공식문서)

이미지와 같이 각 Platform별 지원하는 압축 포맷이 있고, 이를 통해 실제 메모리에 할당되는 크기가 정해집니다.
현재 설정되어 있는 texture format 형태로 2.7MB를 할당하는 것을 볼 수 있습니다.
이 설정값을 변경하여 할당되는 메모리 크기의 차이를 알아보겠습니다.

MaxSize를 변경하고, 압축 방식을 None 압축으로 변경하였을 때 할당되는 메모리는 아래와 같습니다.

각각 64MB, 64MB로 상승한 것을 볼 수 있습니다. 기본적인 텍스쳐의 최적화는 압축 방식 설정 및 Import setting을 통해 처리할 수 있는 것을 알 수 있습니다.
설정된 Max Size는 8192이지만, Import 된 texture의 크기는 4096입니다 이를 통해 알 수 있는 것은 설정된 Max size보다 원본 크기가 작게 되면 원본 크기에 맞춰서 텍스쳐가 Import 되고, Import 된 크기에 맞춰서 어떤 format으로 압축할지를 Setting에서 설정할 수 있습니다.
하지만, 이렇게 Texture를 최적화하여도 추가적인 최적화가 필요할 때가 있는데 이럴 때는 여러 이미지 텍스쳐를 하나의 이미지로 만들어서 조금씩 이미지를 잘라내어 사용하는 방식입니다. Sprite Atlas에 대해서 다음 글에서 알아 보도록 하겠습니다.
'Unity' 카테고리의 다른 글
Unity Addressable Asset (5) (0) | 2025.02.13 |
---|---|
C# 델리게이트(Delegate) in Unity (0) | 2025.01.29 |
Unity Localization (2) (1) | 2025.01.04 |
Unity Addressable Asset (4) (1) | 2025.01.02 |
Unity Addressable Asset (3) (4) | 2024.12.29 |