Unity에서 애플리케이션의 메모리 사용량을 분석하는 방법에는 다음의 두 가지가 있습니다.
이 페이지는 빌트인 메모리 프로파일러 모듈에 대한 정보를 다룹니다. 메모리 프로파일러 패키지에 대한 자세한 내용은 메모리 프로파일러 문서를 참조하십시오.
메모리 프로파일러 모듈은 애플리케이션에 할당된 전체 메모리를 나타내는 카운터를 시각화합니다. 메모리 모듈을 사용하여 로드된 오브젝트의 수와 카테고리별로 해당 오브젝트가 차지하는 메모리 양 같은 정보를 볼 수 있습니다. 또한 프로파일러 프레임당 GC 할당 수도 확인할 수 있습니다.
에디터에서 애플리케이션을 프로파일링하면 메모리 프로파일러 모듈이 타겟 디바이스에서 빌드된 애플리케이션의 유사한 프로파일보다 더 높은 데이터 사용량을 보고합니다.이는 Unity 에디터가 메모리를 차지하는 특정 오브젝트를 사용하고, 에디터 창에서 추가 메모리를 사용하기 때문입니다.
추가 메모리 사용의 일부는 Unity가 에디터에서 텍스처와 같은 오브젝트를 읽기/쓰기가 활성화된 것으로 처리하고 각 텍스처의 추가 복사본을 CPU에 보관하기 때문입니다.텍스처의 메모리 사용량을 보다 정확하게 파악하려면 타겟 플랫폼에서 실행 중인 애플리케이션의 빌드 버전을 프로파일링하십시오.
또한 Unity는 프로파일러 자체가 차지하는 메모리를 플레이 모드의 메모리에서 완전히 분리할 수 없기 때문에 프로파일러가 사용하는 메모리도 프로파일러 창에 표시됩니다. 이를 알려주기 위해 프로파일러 타겟을 플레이 모드 또는 에디터로 설정할 때마다 메모리 프로파일러 모듈 세부 정보 창 상단에 경고가 표시됩니다. 애플리케이션에 대한 보다 정확한 숫자와 메모리 사용량을 위해서는 애플리케이션을 실행하려는 타겟 디바이스와 운영체제에서 애플리케이션을 프로파일링해야 합니다. 자세한 내용은 애플리케이션 프로파일링 문서를 참조하십시오.
메모리 프로파일러 모듈에는 메모리를 사용하는 애플리케이션 위치에 대한 세부 정보를 표시하는 카테고리로 나뉩니다. 카테고리의 색상 범례를 클릭하여 표시를 토글할 수도 있습니다.
카테고리 | 설명 |
---|---|
Total Allocated | 애플리케이션이 사용한 총 메모리 양입니다. |
Texture Memory | 애플리케이션의 텍스처가 사용한 총 메모리 양입니다. |
Mesh Memory | 애플리케이션의 메시가 사용한 총 메모리 양입니다. |
Material Count | 애플리케이션의 머티리얼 인스턴스 수입니다. |
Object Count | 애플리케이션의 네이티브 오브젝트 인스턴스 수입니다. |
GC Used Memory | GC 힙이 사용한 메모리 양입니다. |
GC Allocated in Frame | GC 힙에서 프레임당 할당된 메모리 양입니다. |
프로파일러 창 하단에 있는 모듈 세부 정보 창에는 다음과 같은 두 가지 뷰가 있습니다.
뷰를 변경하려면 모듈 세부 정보 창의 왼쪽 상단에 있는 드롭다운에서 선택합니다.
간단한 뷰는 Unity가 프레임별로 어떻게 메모리를 사용하는지에 대한 개요를 실시간으로 표시합니다. 애플리케이션이 사용하는 총 메모리를 몇 가지 주요 카테고리로 나눕니다. System Used Memory 프로파일러 카운터를 기반으로 Total 값은 운영체제가 애플리케이션에서 사용 중인 것으로 보고하는 메모리의 양을 나타냅니다.
Unity는 운영체제에 너무 자주 메모리를 요청하지 않도록 일부 메모리 풀을 할당용으로 따로 설정합니다. 프로파일러 모듈은 Unity가 예약한 메모리 양과 프로파일러 캡처 시 Unity가 사용한 메모리 양을 표시합니다.
간단한 뷰는 System Used Memory 프로파일러 카운터 내에 수집된 데이터를 표시합니다. 이는 운영체제가 앱에서 사용 중인 것으로 보고하는 메모리 양을 나타내며 Total Committed Memory 바와 Total Memory Breakdown 바의 전체 값에 해당합니다.
운영체제로부터 애플리케이션의 전체 메모리 크기를 가져올 수 있는 플랫폼에서 System Memory Usage는 0을 초과하고 작업 관리자와 같은 크기입니다.
다음 참조 표에서는 간단한 뷰에서 사용할 수 있는 통계와 해당 프로파일러 카운터, 릴리스 빌드의 가용성에 대해 설명합니다. 이 정보는 ProfilerRecorder API와 프로파일러 모듈 에디터에서도 제공하므로 커스텀 프로파일러 모듈에 추가할 수 있습니다.
프로퍼티 | 설명 | 해당 프로파일러 카운터 | 릴리스 플레이어 지원 여부 |
---|---|---|---|
Normalized | Total Committed Memory와 Total Memory Breakdown의 차트 크기를 선택한 프레임의 메모리 사용량으로 조정하려면 이 설정을 활성화합니다. 이 설정을 비활성화하면 차트는 프레임 범위 내에서 사용된 총 메모리로 조정됩니다. 이 설정은 프레임마다 메모리의 전체 또는 상대적 양이 어떻게 변하는지 확인하는 데 도움이 될 수 있습니다. | 해당 없음 | 해당 없음 |
Total Committed Memory | Total Committed Memory 바의 길이는 Unity의 메모리 관리자 시스템이 추적한 전체 메모리 양, 사용된 메모리 양, 이 시스템을 통해 추적되지 않은 메모리 양을 나타냅니다. | System Used Memory | 지원 |
Tracked Memory (in use / Reserved) | Unity가 사용하고 추적하는 전체 메모리 양(in use)과 Unity가 트래킹 목적과 풀 할당을 위해 예약하는 메모리 양(Reserved)을 나타냅니다. | Total Used Memory Total Reserved Memory |
지원 |
Untracked Memory | Unity가 사용했지만 추적하지 못한 전체 메모리 양을 나타냅니다. 추적하지 못한 메모리의 몇 가지 예는 다음과 같습니다. - 네이티브 플러그인 또는 일부 드라이버를 통해 할당된 메모리 - Mono 또는 IL2CPP 타입 메타데이터 - 실행 가능한 코드 및 DLL이 사용하는 메모리 메모리 프로파일러 패키지 및 네이티브 플랫폼 제공업체에서 이러한 추적되지 않은 메모리 양에 대한 자세한 정보를 얻을 수 있습니다. |
해당 없음 | 해당 없음 |
Total Memory Breakdown |
Total Committed Memory 바와 동일한 총량을 표시하지만 Unity가 메모리를 할당한 보조 시스템에 따라 고수준 카테고리로 나눕니다. 모든 메모리 시스템이 풀을 사용하거나 사용된 메모리와 예약된 메모리를 구분하는 것은 아닙니다. 구분되어 있는 항목은 사용된 메모리와 예약된 메모리 양 두 가지 숫자를 표시합니다. 사용된 메모리가 예약된 메모리와 동일한 단위(예: B, MB, GB)를 공유하지 않는 경우 단위를 표시하고, 그렇지 않으면 생략합니다. |
System Used Memory | 지원 |
Managed Heap (in use / Reserved) | 전체 힙 크기와 관리되는 코드에서 사용하는 사용된 힙 크기입니다. 이 메모리는 가비지 컬렉터에 의해 수집됩니다. | GC Used Memory GC Reserved Memory |
지원 |
Graphics & Graphics Driver | 드라이버가 텍스처, 렌더 타겟, 셰이더 및 메시 데이터에 사용하는 추정 메모리 사용량입니다. | Gfx Used Memory Gfx Reserved Memory |
지원 안 함 |
오디오(Audio) | 오디오 시스템의 추정 메모리 사용량입니다. | Audio Used Memory Audio Reserved Memory |
지원 |
Video | 비디오 시스템의 추정 메모리 사용량입니다. | Video Used Memory Video Reserved Memory |
지원 |
Other | Unity가 추적하지만 특정 카운터에서 보고되지 않는 네이티브 메모리를 표시합니다. 이 카테고리 또는 다른 카테고리의 구성에 대한 자세한 정보를 얻으려면 상제 정보 뷰 또는 메모리 프로파일러 패키지에서 스냅샷을 가져옵니다. 중요: Other 카테고리는 Detailed 뷰의 Other 그룹에 직접 매핑되지 않습니다. 이 뷰에서 Other에는 그래픽 메모리, 프로파일러, 오디오, 비디오 메모리의 GPU 측에서 사용되지 않은 나머지 네이티브 메모리가 포함됩니다. |
해당 없음 | 해당 없음 |
Profiler | 프로파일러 기능이 시스템에서 사용하고 예약하는 메모리입니다. | Profiler Used Memory Profiler Reserved Memory |
지원 |
Objects stats | 일반적으로 메모리에서 높은 비율을 차지하는 에셋 타입의 오브젝트(텍스처, 메시, 머티리얼, 애니메이션 클립) 메모리에 축적된 크기와 인스턴스 양(에셋, 게임 오브젝트, 씬 오브젝트)을 함께 표시합니다. 참고: 텍스처와 메시 메모리는 Total Memory Breakdown 뷰의 Graphics & Graphics Driver 통계에 직접 매핑되지 않습니다. 이는 해당 메모리 중 일부가 Total Memory Breakdown 바의 Other 카테고리에 속할 수도 있기 때문입니다. |
Object Count | 지원 안 함 |
Textures | 로드된 총 텍스처 수와 해당 텍스처가 사용하는 메모리 양입니다. | Texture Count Texture Memory |
지원 안 함 |
Meshes | 로드된 총 메시 수와 해당 메시가 사용하는 메모리 양입니다. | Mesh Count Mesh Memory |
지원 안 함 |
Materials | 로드된 총 머티리얼 수와 해당 머티리얼이 사용하는 메모리 양입니다. | Material Count Material Memory |
지원 안 함 |
Animation Clips | 로드된 총 애니메이션 클립 수와 해당 애니메이션 클립이 사용하는 메모리 양입니다. | AnimationClip Count AnimationClip Memory |
지원 안 함 |
Assets | 로드된 총 에셋 수입니다. | Asset Count | 지원 안 함 |
Game Objects | 씬에서 전체 게임 오브젝트 인스턴스 수입니다. | GameObject Count | 지원 안 함 |
씬 오브젝트(Scene Objects) | 전체 동적 ’UnityEngine.Objects’의 수입니다. 이 숫자에는 게임 오브젝트 수와 전체 컴포넌트 수, 씬에서 에셋이 아닌 모든 것이 포함됩니다. | Scene Object Count | 지원 안 함 |
GC allocated in frame | 선택된 프레임에서 관리되는 할당의 양과 전체 크기를 바이트 단위로 표시합니다. | GC Allocation In Frame Count GC Allocated In Frame |
지원 안 함 |
ProfilerRecorder API를 사용하여 플레이어에서 Memory Profiler 모듈의 카운터에 액세스할 수 있습니다. 다음 예시에는 Total Reserved Memory, GC Reserved Memory and System Used Memory 지표를 수집하고 GUI.TextArea로 표시하는 간단한 스크립트가 포함되어 있습니다. Memory Profiler 모듈 정보는 ProfilerCategory.Memory 프로파일러 카테고리에 속합니다.
using System.Text;
using Unity.Profiling;
using UnityEngine;
public class MemoryStatsScript : MonoBehaviour
{
string statsText;
ProfilerRecorder totalReservedMemoryRecorder;
ProfilerRecorder gcReservedMemoryRecorder;
ProfilerRecorder systemUsedMemoryRecorder;
void OnEnable()
{
totalReservedMemoryRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "Total Reserved Memory");
gcReservedMemoryRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "GC Reserved Memory");
systemUsedMemoryRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "System Used Memory");
}
void OnDisable()
{
totalReservedMemoryRecorder.Dispose();
gcReservedMemoryRecorder.Dispose();
systemUsedMemoryRecorder.Dispose();
}
void Update()
{
var sb = new StringBuilder(500);
if (totalReservedMemoryRecorder.Valid)
sb.AppendLine($"Total Reserved Memory: {totalReservedMemoryRecorder.LastValue}");
if (gcReservedMemoryRecorder.Valid)
sb.AppendLine($"GC Reserved Memory: {gcReservedMemoryRecorder.LastValue}");
if (systemUsedMemoryRecorder.Valid)
sb.AppendLine($"System Used Memory: {systemUsedMemoryRecorder.LastValue}");
statsText = sb.ToString();
}
void OnGUI()
{
GUI.TextArea(new Rect(10, 30, 250, 50), statsText);
}
}
다음 스크린샷은 Tanks! 튜토리얼 프로젝트에 스크립트를 추가한 결과를 보여줍니다.
이 정보는 위의 표에 있는 다른 고수준 카운터와 마찬가지로 릴리스 플레이어에서 사용할 수 있습니다. 프로파일러 창의 커스텀 모듈에서 선택한 메모리 카운터를 보려면 모듈 에디터를 사용하여 차트를 구성하십시오.
세부 정보 뷰는 애플리케이션의 현재 상태에 대한 스냅샷을 제공합니다. Take Sample 버튼을 선택하여 현재 타겟에 대한 자세한 메모리 사용량을 캡처할 수 있습니다. 이 데이터를 가져오는 데 프로파일러 시간이 걸리므로 세부 정보 뷰는 실시간 세부 정보를 제공하지 않습니다. 프로파일러가 샘플을 수집한 후 프로파일러 창에 애플리케이션의 메모리 사용량을 더 자세히 살펴볼 수 있는 리스트 뷰가 표시됩니다.
모듈 세부 정보 창 상단에서 Gather Object References 설정을 활성화하여 스냅샷 시점에 오브젝트를 참조하는 항목에 대한 정보를 수집합니다. 프로파일러 창의 오른쪽에 이 정보를 표시합니다.
리스트 뷰는 메모리를 사용하는 오브젝트를 다음 카테고리로 구분합니다.
에셋 또는 씬 메모리 리스트에서 게임 오브젝트를 클릭하면 Unity는 프로젝트 뷰 또는 씬 뷰에서 강조 표시합니다.
참고: Other 카테고리에서 System.ExecutableAndDlls
에 보고된 메모리는 읽기 전용 메모리입니다. 운영체제는 필요에 따라 해당 페이지를 폐기하고 나중에 파일 시스템에서 다시 로드할 수 있습니다. 그러면 메모리 사용량이 줄어들고 애플리케이션이 너무 많은 메모리를 사용하는 경우 운영체제에서 해당 애플리케이션을 종료하기로 결정하는 직접적인 원인이 되지 않습니다. 일부 페이지는 동일한 프레임워크를 사용하는 다른 애플리케이션과 공유될 수도 있습니다.