Unity에서 애플리케이션의 메모리 사용량을 분석하는 방법에는 다음의 두 가지가 있습니다.
이 페이지는 빌트인 메모리 프로파일러 모듈에 대한 정보를 다룹니다. 메모리 프로파일러 패키지에 대한 자세한 내용은 메모리 프로파일러 문서를 참조하십시오.
메모리 프로파일러 모듈은 애플리케이션에 할당된 전체 메모리를 나타내는 카운터를 시각화합니다. 메모리 모듈을 사용하여 로드된 오브젝트의 수와 카테고리별로 해당 오브젝트가 차지하는 메모리 양 같은 정보를 볼 수 있습니다. 또한 프로파일러 프레임당 GC 할당 수도 확인할 수 있습니다.
타겟 디바이스에서 애플리케이션을 빌드하고 프로파일링하는 대신 에디터에서 애플리케이션을 프로파일링할 경우 메모리 프로파일러 모듈의 프로파일링 데이터는 릴리스 플랫폼에서 애플리케이션을 실행할 때보다 더 큽니다. Unity 에디터는 메모리를 차지하는 특정 오브젝트를 사용하고 에디터 창 자체도 추가 메모리를 사용하기 때문입니다.
또한 Unity는 프로파일러 자체가 차지하는 메모리를 플레이 모드의 메모리에서 완전히 분리할 수 없기 때문에 프로파일러가 사용하는 메모리도 프로파일러 창에 표시됩니다. 이를 알려주기 위해 프로파일러 타겟을 플레이 모드 또는 에디터로 설정할 때마다 메모리 프로파일러 모듈 세부 정보 창 상단에 경고가 표시됩니다. 애플리케이션에 대한 보다 정확한 숫자와 메모리 사용량을 위해서는 애플리케이션을 실행하려는 타겟 디바이스와 운영체제에서 애플리케이션을 프로파일링해야 합니다. 자세한 내용은 애플리케이션 프로파일링 문서를 참조하십시오.
메모리 프로파일러 모듈에는 메모리를 사용하는 애플리케이션 위치에 대한 세부 정보를 표시하는 숫자 차트가 있습니다. 차트 범례에서 카테고리를 드래그하여 순서를 변경할 수 있습니다. 카테고리의 색상 범례를 클릭하여 표시를 토글할 수도 있습니다.
카테고리 | 설명 |
---|---|
Total Allocated | 애플리케이션이 사용한 총 메모리 양입니다. |
Texture Memory | 애플리케이션의 텍스처가 사용한 총 메모리 양입니다. |
Mesh Memory | 애플리케이션의 메시가 사용한 총 메모리 양입니다. |
Material Count | 애플리케이션의 머티리얼 인스턴스 수입니다. |
Object Count | 애플리케이션의 네이티브 오브젝트 인스턴스 수입니다. |
GC Used Memory | GC 힙이 사용한 메모리 양입니다. |
GC Allocated in Frame | GC 힙에서 프레임당 할당된 메모리 양입니다. |
프로파일러 창 하단에 있는 모듈 세부 정보 창에는 다음과 같은 두 가지 뷰가 있습니다.
뷰를 변경하려면 모듈 세부 정보 창의 왼쪽 상단에 있는 드롭다운에서 선택합니다.
간단한 뷰는 Unity가 프레임별로 어떻게 메모리를 사용하는지에 대한 개요를 실시간으로 표시합니다. System Used Memory 프로파일러 카운터로 표시된 코드가 수집하는 데이터를 표시하며, 이는 운영체제가 애플리케이션에서 사용 중인 것으로 보고하는 메모리의 양을 나타냅니다.
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 그룹에 직접 매핑되지 않습니다. |
해당 없음 | 해당 없음 |
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를 사용하여 플레이어에서 메모리 프로파일러 모듈의 카운터에 액세스할 수 있습니다. 다음 예제에는 Total Reserved Memory, GC Reserved Memory, System Used Memory 지표를 수집하고 GUI.TextArea로 표시하는 간단한 스크립트가 포함되어 있습니다. 메모리 프로파일러 모듈 정보는 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
에 보고된 메모리는 읽기 전용 메모리입니다. 운영체제는 필요에 따라 해당 페이지를 폐기하고 나중에 파일 시스템에서 다시 로드할 수 있습니다. 그러면 메모리 사용량이 줄어들고 애플리케이션이 너무 많은 메모리를 사용하는 경우 운영체제에서 해당 애플리케이션을 종료하기로 결정하는 직접적인 원인이 되지 않습니다. 일부 페이지는 동일한 프레임워크를 사용하는 다른 애플리케이션과 공유될 수도 있습니다.