본문 바로가기

유니티/최적화

[유니티 최적화] 프로파일러

728x90
반응형

1. 프로파일러 개요

Unity 프로파일러는 애플리케이션의 성능 정보를 알려주는 툴입니다. 

네트워크에 있는 기기, 또는 컴퓨터에 연결된 기기에 연결하여 목표 릴리스 플랫폼에서 애플리케이션이 어떻게 동작하는지 테스트할 수 있습니다. 

또한 애플리케이션을 개발하는 중에 에디터에서 실행하여 리소스 할당 개요를 확인할 수도 있습니다.

프로파일러는 애플리케이션의 성능 데이터(예: CPU, 메모리, 렌더러, 오디오)를 수집하고 표시합니다. 

이 툴을 사용하면 애플리케이션의 성능 개선이 필요한 영역을 식별하고 해당 작업을 반복할 수 있습니다. 

또한 코드, 에셋, 씬 설정, 카메라 렌더링, 빌드 설정 등의 요소가 애플리케이션 성능에 영향을 주는 방식을 정확히 파악할 수 있습니다. 

결과는 일련의 차트로 표시되므로, 애플리케이션 성능에서 스파이크가 발생하는 지점을 시각적으로 확인할 수 있습니다.

프로파일러 창에 액세스하려면 Window > Analysis > Profiler 로 이동하십시오. 

이 창에 대한 자세한 내용은 프로파일러 창 문서를 참조하십시오.

 

2. 프로파일러 창 시작하기

Unity 프로파일러에 액세스하려면 Window > Analysis > Profiler 로 이동하거나 키보드 단축키 Ctrl+7 (macOS의 Command+7)을 사용하십시오.

프로파일러는 애플리케이션 성능의 여러 영역을 기록한 후 해당 정보를 표시합니다. 

이 정보를 사용하면 애플리케이션에서 최적화해야 할 사항에 대해 정보에 근거한 결정을 내리고 최적화를 통해 예상한 결과를 달성하는지 확인할 수 있습니다.

기본적으로 프로파일러는 게임의 마지막 300프레임을 기록하고 유지하며, 모든 프레임에 대한 자세한 정보를 표시합니다. 

환경 설정 창(메뉴: File > Preferences)에서 기록되는 프레임 수를 최대 2,000프레임까지 늘릴 수 있습니다.

스크립트 코드를 검사하고, 애플리케이션이 속도 저하를 유발하는 특정 에셋과 리소스를 사용하는 방식을 확인할 수 있습니다. 

또한 여러 기기에서 애플리케이션의 성능을 비교할 수도 있습니다. 

프로파일러에 있는 다양한 프로파일러 모듈을 프로파일링 세션에 추가하여 렌더링, 메모리, 오디오 등의 영역에 대한 자세한 정보를 얻을 수 있습니다.

2.1 프로파일러 창 레이아웃

프로파일러 창은 다음으로 구성됩니다.

  • A: 프로파일러 모듈. 애플리케이션에서 프로파일링할 수 있는 모든 모듈의 리스트입니다. 이 영역의 상단에 있는 드롭다운 메뉴를 사용하여 창에 모듈을 추가하거나 제거하십시오.
  • B: 프로파일러 컨트롤. 이 컨트롤을 사용하여 프로파일링할 기기와 Unity가 수행할 프로파일링 종류를 설정하고, 프레임 사이를 탐색하고, 데이터 기록을 시작하십시오.
  • C: 프레임 차트. 이 영역에는 프로파일러가 프로파일링하는 각 모듈의 차트가 있습니다. 프로파일러를 처음 열면 이 영역이 비어 있으며, 애플리케이션을 프로파일링할 때 정보로 채워집니다.
  • D: 모듈 세부 정보 창. 창의 이 영역에 있는 정보는 선택한 모듈에 따라 달라집니다. 예를 들어 CPU 사용 프로파일러 모듈을 선택하면 상세한 타임라인, 그리고 계층 구조 뷰로 전환할 수 있는 옵션이 포함됩니다. 렌더링 프로파일러 모듈을 선택하면 이 영역에 디버깅 정보 리스트가 표시됩니다. 프로파일러를 처음 열면 이 영역이 비어 있으며, 애플리케이션을 프로파일링할 때 정보로 채워집니다.

2.2 프로파일러 컨트롤

 

프로파일러 컨트롤은 프로파일러 창 상단의 툴바에 있습니다. 

이 컨트롤을 사용하여 프로파일러 데이터 기록을 시작하거나 중지하고 프로파일링된 프레임을 탐색하십시오.

 

컨트롤

기능

Attach to Player

애플리케이션을 프로파일링할 대상을 선택할 수 있습니다. 기본적으로 이 모드는 Playmode 로 설정되어 있습니다. Editor 를 선택하여 Unity 에디터를 프로파일링하고 에디터가 현재 사용 중인 리소스를 표시할 수도 있습니다.
Unity
는 네트워크에서 실행 중이거나 USB를 통해 연결된 모든 기기를 자동으로 감지하여 드롭다운에 표시합니다. 드롭다운에서 Enter IP 를 클릭하여 애플리케이션을 프로파일링할 기기의 IP 주소를 수동으로 입력하십시오. 자세한 내용은 애플리케이션 프로파일링을 참조하십시오.

Record

이 설정을 활성화하면 애플리케이션을 실행할 때 활성 모듈에 대한 프로파일링 정보를 기록할 수 있습니다. 이 버튼을 활성화하지 않으면 애플리케이션을 실행할 때 프로파일러가 데이터를 수집하지 않습니다.

Back arrow

한 프레임이 뒤로 이동합니다.

Forward arrow

한 프레임이 앞으로 이동합니다.

Current

마지막으로 기록한 프레임으로 이동하여 실시간으로 수집한 프로파일러 데이터를 표시합니다.

Frame number

프로파일러에서 현재 보고 있는 프레임 번호입니다.

Clear

프로파일러 창의 모든 데이터를 지웁니다.

Clear on Play

이 설정을 활성화하면 다음 번에 플레이어 창에서 Play를 클릭하거나, 새 타겟 디바이스에 연결할 때 프로파일러 창의 모든 데이터가 지워집니다.

Deep Profile

이 설정을 활성화하면 모든 C# 메서드를 프로파일링합니다. 이 설정을 활성화하면 Unity는 모든 모노 호출에 계측을 추가하므로 스크립트를 더욱 자세히 조사할 수 있습니다세부 프로파일링을 참조하십시오.

Call Stacks

스크립팅 메모리 할당에 대한 호출 스택을 기록하려면 이 토글을 클릭하십시오. 이 옵션을 활성화할 때 프로파일러가 기록하는 프레임에는 Deep Profile 이 활성화되지 않은 경우에도 관리되는 스크립팅 할당을 유발하는 전체 호출 스택의 GC.Alloc 샘플 정보가 들어 있습니다. 자세한 내용은 CPU 사용 프로파일러 모듈 페이지의 할당 호출 스택 섹션을 참조하십시오.

Load

저장된 프로파일러 데이터를 프로파일러 창에 로드합니다. Profiler.logFile API를 통해 플레이어가 파일에 작성한 바이너리 프로파일러 데이터도 로드할 수 있습니다.
Shift
버튼을 길게 누른 채 Load 버튼을 클릭하면 파일 콘텐츠를 현재 프로파일 프레임에 추가합니다.

Save

프로파일러 데이터를 프로젝트 폴더의 .data 파일에 저장합니다.

Context menu

 * Color Blind Mode

이 설정을 활성화하면 프로파일러가 그래프에서 더 높은 콘트라스트 컬러를 사용합니다. 이렇게 하면 적록 색맹(: 2색맹, 1색맹, 3색맹) 사용자들의 가시성을 향상할 수 있습니다.

* Preferences

Preferences 메뉴를 열면 프로파일러별 프로퍼티를 조정할 수 있습니다.


낮은 오버헤드를 유지하기 위해 Unity는 에디터 UI의 프레임을 다섯 번째에만 다시 그립니다. 

이로 인해 업데이트가 살짝 불안정해집니다.

2.2.1 세부 프로파일링

일반적으로 프로파일러는 ProfilerMarkers에 명시적으로 래핑된 코드 타이밍만 프로파일링합니다. 

여기에는 엔진의 네이티브 코드에서 스크립팅 코드로의 호출에 대한 첫 번째 호출 스택 뎁스가 포함됩니다(예: MonoBehaviour’s Start, Update 또는 유사 메서드).

자체 코드에 더욱 명시적인 ProfilerMarker 계측을 추가하지 않고, 스크립팅 코드의 자식 샘플로 볼 수 있는 유일한 다른 샘플은 해당 API가 계측되었을 때 Unity의 API로 다시 호출되는 샘플입니다.

성능 오버헤드를 유발하는 대부분의 API 호출이 계측됩니다.

예를 들어 Camera.main  API를 통한 메인 카메라 액세스는 “FindMainCamera” 샘플로 등록됩니다.

Deep Profile 설정을 활성화하면 프로파일러는 스크립트 코드의 모든 부분을 프로파일링하고 모든 함수 호출(Unity API로의 첫 번째 호출 뎁스 포함)을 기록합니다. 

이러한 정보는 코드가 애플리케이션 성능에 영향을 미치는 위치를 파악하는 데 도움이 되지만 리소스 소모가 커집니다.

애플리케이션에 대해 세부 프로파일링을 수행하면 Unity는 프로파일러 계측을 모든 스크립트 메서드에 주입하여 모든 함수 호출을 기록합니다. 

이는 애플리케이션 코드가 가장 많은 시간을 소비하는 위치를 이해하는 데 도움이 됩니다.

세부 프로파일링은 리소스와 메모리를 많이 사용합니다. 따라서 애플리케이션이 프로파일링되는 동안 매우 느리게 실행됩니다. 세부 프로파일링은 간단한 스크립팅을 사용하는 소규모 게임에 적합합니다. 

복잡한 스크립트 코드를 사용하는 경우 애플리케이션에서 세부 프로파일링을 전혀 사용하지 못할 수 있으며, 대형 애플리케이션이 많은 경우에는 세부 프로파일링으로 인해 Unity의 메모리가 부족해질 수 있습니다.

프로파일러로 스트리밍하기 위해 사용하는 링 버퍼에 저장할 샘플이 너무 많아지는 문제가 발생하면 Unity는 오류 메시지를 표시합니다. 

링 버퍼의 크기를 늘리려면 프로파일링하는 플레이어의 Profiler.maxUsedMemory 프로퍼티를 조정하십시오.

세부 프로파일링으로 인해 애플리케이션의 프레임 속도가 너무 낮아져 실행이 불가능해지면 스크립트 코드의 블록을 수동으로 프로파일링할 수 있습니다(세부 프로파일링보다 성능 부하가 적음). 

ProfilerMarkers를 사용하여 스크립트 블록을 마크업하는 데 필요한 계측을 수동으로 추가하십시오. 

CPU 사용 프로파일러 모듈에서 볼 수 있습니다.

세부 프로파일링을 사용하지 않고 GC.Alloc 샘플을 유발하는 호출 스택을 찾고 싶은 경우 Allocation call stacks 컬렉션을 활성화할 수 있습니다. 

 

프로파일러 컨트롤에서 Call Stacks 설정을 활성화한 후 타임라인 뷰에서 GC.Alloc 샘플을 선택하거나, 계층 구조 뷰에서 Show Related Objects panel 패널을 사용하여 이러한 샘플에 대한 호출 스택을 찾을 수 있습니다. 

자세한 내용은 CPU 프로파일러 모듈 페이지에서 할당 호출 스택에 대한 설명을 참조하십시오.

 

2.3 프로파일러 모듈

프로파일러 창 상단은 게임의 특정 영역을 프로파일링하는 프로파일러 모듈로 구성됩니다. 

애플리케이션을 프로파일링할 때 Unity는 해당 차트에 각 모듈과 관련된 데이터를 표시합니다.

CPU Usage 모듈은 애플리케이션이 각 프레임에 소비하는 시간에 대한 최고의 요약 정보를 제공합니다. 

다른 모듈들은 더욱 구체적인 데이터를 수집하며, 특정 영역을 자세히 살펴보거나 애플리케이션의 중요 요소(예: 메모리 사용량, 렌더링, 오디오 통계)를 모니터링하도록 도와줍니다.

각 모듈에는 고유한 차트가 있습니다. 

모듈을 선택하면 창의 하단 섹션에 모듈 세부 정보 창이 나타납니다. 

이 창에서 모듈이 수집하는 세부 데이터를 확인할 수 있습니다.

 

Profiler module

기능

CPU Usage

애플리케이션이 가장 많은 시간을 소비하는 위치(: 물리, 스크립트, 애니메이션, 가비지 컬렉션)에 대한 요약 정보를 제공합니다. 이 모듈에는 애플리케이션에 대한 광범위한 프로파일링 정보가 들어 있으며, 이러한 정보를 사용하면 애플리케이션의 특정 문제를 조사하기 위해 추가로 사용할 모듈을 쉽게 결정할 수 있습니다. 이 모듈은 닫아도 계속 활성 상태를 유지합니다. CPU 사용 프로파일러 모듈을 참조하십시오.

GPU Usage

그래픽스 처리와 관련된 정보를 표시합니다. 이 모듈은 성능 부하가 높아서 기본적으로 활성화되지 않습니다. GPU 사용 프로파일러 모듈을 참조하십시오.

Rendering

Unity가 애플리케이션에서 그래픽스를 렌더링하는 방식에 대한 정보를 표시합니다. 여기에는 정적 및 동적 배칭, SetPass 및 드로우 콜, 삼각형, 버텍스 등에 대한 내용이 포함됩니다렌더링 프로파일러 모듈을 참조하십시오.

Memory

Unity가 애플리케이션에서 메모리를 할당하는 방식에 대한 정보를 표시합니다. 이 정보는 스크립팅 할당(GC.Alloc)이 가비지 컬렉션을 유발하는 방식이나, 애플리케이션의 에셋 메모리 사용량 추세를 확인할 때 특히 도움이 됩니다메모리 프로파일러 모듈을 참조하십시오.

Audio

애플리케이션의 오디오 관련 정보(: 오디오 소스의 재생 위치 및 횟수, 오디오 시스템의 CPU 사용량 요구 사항, Unity가 할당하는 메모리 양)를 표시합니다오디오 프로파일러 모듈을 참조하십시오.

Video

애플리케이션의 비디오 관련 정보를 표시합니다.

Physics

물리 엔진이 처리한 애플리케이션의 물리에 대한 정보를 표시합니다물리 프로파일러 모듈을 참조하십시오.

Physics (2D)

물리 프로파일러 모듈과 유사한 이 모듈은 물리 엔진이 애플리케이션의 2D 물리를 처리한 위치에 대한 정보를 표시합니다.

Network Messages (지원 중단 예정)

멀티플레이어 고수준 API가 송수신하는 저수준 패킷 및 메시지에 관한 정보를 표시합니다.
참고멀티플레이어 고수준 API는 지원이 중단되었습니다.

Network Operations (지원 중단 예정)

멀티플레이어 고수준 API가 송수신하는 메시지에 어떤 타입이나 작업이 있는지에 대한 세분화된 정보(: SyncVars 또는 Commands가 전송된 횟수)를 표시합니다.
참고멀티플레이어 고수준 API는 지원이 중단되었습니다.

UI

Unity가 애플리케이션의 UI 배칭을 처리한 방식에 대한 정보(: Unity가 아이템을 배칭하는 이유와 방식)를 표시합니다. UI 프로파일러 모듈을 참조하십시오.

UI Details

UI 모듈과 유사한 이 모듈의 차트는 배치 및 버텍스 수에 대한 데이터, 그리고 UI 변경을 트리거하는 사용자 입력 이벤트에 대한 정보가 포함된 마커를 추가합니다.

Global Illumination

Unity가 애플리케이션의 전역 조명 하위 시스템에 소비하는 CPU 리소스 양에 대한 정보를 표시합니다전역 조명 프로파일러 창을 참조하십시오.

 

2.3.1 프로파일러 모듈 오버헤드

GPU, UI 및 오디오 프로파일러 모듈을 비롯한 일부 프로파일러 모듈은 데이터 수집 부하가 큽니다. 

이러한 모듈이 애플리케이션의 성능에 영향을 미치지 않도록 하려면 Profiler Module 드롭다운에서 해당 모듈을 선택 해제하여 비활성화하십시오. 

그러면 창에서 모듈이 제거되고, 프로파일러가 해당 모듈의 데이터 수집을 중지하며, 프로파일러의 성능 부하가 감소합니다.

이는 CPU 사용 모듈에는 적용되지 않습니다. 

이 모듈은 다른 모듈들이 사용하기 때문에 비활성화되어도 데이터 수집을 멈추지 않습니다.

모듈을 추가하려면 Profiler Module 드롭다운을 선택하고 활성화할 프로파일러를 선택하십시오. 

드롭다운에서 프로파일러 모듈을 선택하면 데이터 수집을 시작하지만, 활성 상태가 아닌 기간에 대한 데이터는 보여주지 않습니다.

GPU 프로파일러 모듈은 성능 부하를 피하기 위해 기본적으로 활성화되지 않습니다. 

그래픽 드라이버에 연결하려면 애플리케이션 시작 시 GPU 프로파일러 모듈이 활성화되어 있어야 합니다. 이 모듈을 나중에 추가하면 대부분의 플랫폼에서 아무 효과가 없으며, 프로파일러는 “GPU 프로파일링이 그래픽 카드 드라이버에서 지원되지 않습니다(또는 드라이버 버그로 비활성화되었습니다).”라는 메시지를 표시합니다.

프로파일러가 프로파일러 창이 아니라 Profiler.logFile API를 통해 데이터를 수집하고 디스크로 전송하도록 명령하려는 경우 Profiler.SetAreaEnabled()를 통해 프로파일러 모듈을 비활성화할 수 있습니다.

외부 IDE를 통해 스크립트를 디버깅하는 일부 설정도 성능 부하를 유발할 수 있습니다. 이러한 성능 부하를 피하고 더욱 정확한 측정치를 얻으려면 Editor Attaching 설정(메뉴: Preferences > External Tools)을 비활성화하십시오. 마찬가지로, 빌드 플레이어를 프로파일링할 때에는 Build Settings 를 열고 Script Debugging 을 비활성화하면 성능 부하를 피할 수 있습니다.

 

2.3.2 프로파일러 프레임 차트

프로파일러 창의 상단에는 시간 경과에 따른 성능 데이터가 프레임별로 표시됩니다. 

애플리케이션을 실행하면 프로파일러는 각 프레임에 대한 데이터를 기록합니다. 

기본적으로 프로파일러 창에는 프로파일링되는 마지막 300프레임의 이력이 표시됩니다. 

Preferences 창에서 프로파일러가 프로파일링하는 프레임의 수를 최대 2,000개까지 늘릴 수 있습니다.

프로파일러 창의 프로파일러 프레임 차트 영역을 클릭하면 흰색 줄이 나타나 애플리케이션의 한 개 프레임을 강조 표시합니다. 

프레임 간에 이동하려면 프로파일러 창의 툴바에 있는 이동 컨트롤을 사용하십시오.

Unity는 차트의 수직 스케일을 자동으로 관리하고, 차트는 창의 수직 공간을 채우려고 시도합니다. 

차트에서 더욱 자세한 내용을 보기 위해 다른 프로파일러 모듈을 제거하거나, 차트와 상세 통계 영역 사이의 분할선을 드래그하여 차트의 화면 영역을 늘릴 수 있습니다.

차트에서 지표 숨김 및 표시를 토글하려면 모듈의 레이블 옆에 있는 컬러 사각형을 클릭하십시오. 

그러면 스파이크의 원인을 쉽게 식별할 수 있습니다. 

CPU 사용 프로파일러의 차트와 같은 누적형 차트에서 지표 레이블의 순서를 변경하여 누적 순서에 영향을 줄 수 있습니다. 

이렇게 하면 복잡한 지표의 가독성을 높여 차트를 더욱 쉽게 살펴볼 수 있습니다.

각 프로파일러 모듈은 다른 성능 데이터 지표를 수집하여 별도 차트로 표시합니다. 

프레임을 클릭하면 Unity는 프로파일러 창 하단의 모듈 세부 정보 창에 해당 프레임에 대한 상세 정보를 표시합니다. 

이러한 창에 표시되는 세부 정보 타입은 선택한 프로파일러 모듈에 따라 다릅니다. 

각 모듈이 이 영역에 표시하는 세부 정보에 대한 자세한 내용은 프로파일러 모듈의 개별 문서를 참조하십시오.

 

2.4 커맨드 라인 인자

커맨드 라인(예: Windows의 명령 프롬프트, macOS의 터미널, Linux 셸, Android용 adb)을 통해 빌드된 플레이어 또는 Unity 에디터를 시작하는 경우 커맨드 라인 인자를 전달하여 일부 프로파일러 설정을 지정할 수 있습니다. 

 

커맨드 라인 인자

설명

-deepprofiling

빌드된 플레이어에서 세부 프로파일링을 활성화합니다.

-profiler-enable

플레이어 또는 에디터의 시작을 프로파일링합니다. 이 인자를 플레이어에서 사용하면 빌드 설정의 Autoconnect Profiler 옵션을 활성화한 상태로 플레이어를 빌드하는 것과 동일한 효과를 얻을 수 있습니다.
이 인자를 에디터에서 사용하면 에디터 시작 시 프로파일러 정보를 수집하여 프로파일러 창에 표시합니다.

-profiler-log-file <Path/To/Log/File.raw>

이 인자는 프로파일러가 시작 시 프로파일 데이터를 .raw 파일로 스트리밍하도록 설정합니다. 플레이어와 에디터 모두에서 사용할 수 있습니다.

-profiler-capture-frame-count <NumberOfFrames>

이 인자는 시작 시 .raw 파일로 스트리밍할 때 프로파일에서 캡처할 프레임 수를 설정합니다. 플레이어에서만 작동합니다.

-profiler-maxusedmemory

기본적으로 maxUsedMemory는 플레이어의 경우 16MB, 에디터의 경우 256MB입니다. 이 인자를 사용하여 시작 시 maxUsedMemory 파라미터를 커스텀 크기로 설정할 수 있습니다(: -profiler-maxusedmemory 16777216). 크기는 바이트로 설정됩니다.

 

3. 애플리케이션 프로파일링

타겟 릴리스 플랫폼에서 애플리케이션을 프로파일링하려면 타겟 기기를 네트워크에 연결하거나 케이블로 컴퓨터에 직접 연결하십시오. 

또한 애플리케이션을 개발하는 동안 프로파일링 결과를 대략적으로 확인하기 위해 Unity 에디터에서 직접 애플리케이션을 프로파일링할 수도 있습니다.

3.1 빌드 설정(Build Settings)

애플리케이션은 개발 빌드로만 프로파일링할 수 있습니다. 이렇게 하려면 Build Settings (File > Build Settings)에서 애플리케이션의 타겟 플랫폼을 선택한 후 Development Build 설정을 활성화하십시오. 

이 설정을 활성화하면 프로파일러와 관련된 두 개의 설정, Autoconnect to Profiler 와 Deep Profiling Support 를 이용할 수 있습니다.

그림. 프로파일링 옵션이 활성화된 빌드 설정 창

 

Autoconnect Profiler 설정을 활성화하면 Unity 에디터는 빌드 프로세스 동안 해당 IP 주소를 빌드된 플레이어로 베이크합니다.

플레이어를 시작하면 에디터가 베이크된 IP 주소에 있는 프로파일러에 연결하려고 시도합니다.

또한 Deep Profiling Support 설정을 활성화하면 Unity는 빌드된 플레이어가 시작할 때 세부 프로파일링을 수행합니다. 

이는 애플리케이션의 시작 시간을 세부 프로파일링할 때 유용하며, 빌드의 리소스 소모가 약간 더 증가합니다.

3.2 프로파일러 창에서 플레이어에 연결

애플리케이션을 빌드하여 실행하면 프로파일러 창의 Attach to Player 드롭다운에 플레이어가 나타납니다.

Attach to Player 드롭다운은 로컬 네트워크에서 실행 중인 모든 Unity 플레이어를 보여줍니다.

이러한 플레이어는 플레이어 타입, 또는 플레이어를 실행하는 호스트 이름을 기준으로 식별할 수 있습니다(예: iPhonePlayer (Toms iPhone)).

 

그림. 네트워크에 있는 플레이어를 보여주는 Attach to Player 드롭다운 

선택한 후 Record 를 클릭하면 애플리케이션에 대한 프로파일링 정보를 수집하기 시작합니다. 

빌드 설정에서 Autoconnect to Profiler 를 활성화하면 Unity는 애플리케이션이 시작할 때 데이터를 자동으로 수집합니다.

애플리케이션이 실행 중인 동안 데이터를 연속으로 수집하려면 Player Settings (메뉴: Edit > Project Settings > Player > Resolution and Presentation)에서 Run In Background 설정을 활성화하십시오.

이 설정을 활성화하면 애플리케이션이 백그라운드에서 실행되도록 두더라도 프로파일러는 데이터를 계속 수집합니다.

이 설정을 비활성화하면 애플리케이션이 활성 창에서 실행 중일 때에만 데이터를 수집합니다.

3.3 Unity 에디터에서의 프로파일링

프로파일러 창을 사용하여 에디터에서 애플리케이션을 실행하고 프로파일링하는 경우 타겟 플랫폼이 애플리케이션을 실행할 때의 대략적인 애플리케이션 동작을 결과로 보여줍니다. 

플레이 모드는 에디터와 동일한 프로세스로 실행되므로 애플리케이션의 CPU, GPU 및 메모리 사용량 데이터를 Unity의 사용량 데이터와 완벽하게 분리할 수 없습니다. 

이로 인해 결과 프로파일링 데이터가 더 왜곡됩니다.

더 나은 프로파일링 결과를 얻으려면 항상 타겟 디바이스에서 애플리케이션을 프로파일링해야 합니다. 

기기에서 이미 식별한 문제에 대해 빠르게 반복 작업을 수행하려면 에디터에서만 프로파일링하십시오.

3.4 WebGL

WebGL에서도 Unity 프로파일러를 사용할 수 있지만, 에디터를 통해 실행 중인 WebGL 플레이어에 연결할 수 없습니다. 

WebGL은 WebSocket을 커뮤니케이션에 사용하므로 브라우저 쪽에서 수신 연결을 허용하지 않습니다. 

실행 중인 플레이어에 연결하려면 Build Settings (메뉴: File > Build Settings)의 Autoconnect Profiler 체크박스를 선택해야 합니다. 

Unity는 WebGL에 대한 드로우 콜을 프로파일링할 수 없습니다.

3.4.1 모바일 디바이스에서의 프로파일링

iOS 및 Android 기기 모두 네트워크를 통한 원격 프로파일링을 지원합니다. 

방화벽을 사용하는 경우 방화벽의 아웃바운드 규칙에서 54998 - 55511 포트를 여십시오. 

Unity는 이 포트들을 원격 프로파일링에 사용합니다.

참고: 때때로 원격 프로파일링을 설정하면 Unity 에디터가 기기에 자동으로 연결되지 않을 수 있습니다. 

이 경우 프로파일러 연결을 수동으로 초기화할 수 있습니다. 이렇게 하려면 프로파일러 창에서 Attach to Player 드롭다운 메뉴를 선택한 후 적절한 기기를 고르십시오.

또한 네트워크 또는 연결 문제를 피하기 위해 대상 기기를 컴퓨터에 직접 연결할 수도 있습니다.

3.4.2 iOS 원격 프로파일링

iOS 기기에서는 원격 프로파일링을 활성화하려면 다음 절차를 따르십시오.

  1. iOS 기기를 WiFi 네트워크에 연결합니다. 프로파일러는 로컬 WiFi 네트워크를 사용해 프로파일링 데이터를 기기에서 Unity 에디터로 전송합니다.
  2. 케이블을 사용하여 기기를 컴퓨터에 연결합니다. Build Settings (메뉴: File > Build Settings)로 이동한 후 Development Build 및 Autoconnect Profiler 체크박스를 활성화하고 Build & Run 을 선택합니다.
  3. 애플리케이션이 기기에서 실행되면 Unity 에디터의 프로파일러 창을 엽니다(메뉴: Window > Analysis > Profiler).

3.4.3 Android 원격 프로파일링

Android 기기는 WiFi 또는 Android 디버그 브리지(adb)를 통한 두 가지 원격 프로파일링 방식을 지원합니다.

WiFi로 프로파일링하려면 다음 절차를 따르십시오.

  1. Android 기기에서 모바일 데이터를 비활성화합니다.
  2. Android 기기를 WiFi 네트워크에 연결합니다. 프로파일러는 로컬 WiFi 네트워크를 사용해 프로파일링 데이터를 기기에서 Unity 에디터로 전송합니다.
  3. 케이블을 사용하여 기기를 컴퓨터에 연결합니다. Build Settings (메뉴: File > Build Settings)로 이동한 후 Development Build 및 Autoconnect Profiler 체크박스를 활성화하고 Build & Run 을 선택합니다.
  4. 애플리케이션이 기기에서 실행되면 Unity 에디터의 프로파일러 창을 엽니다(메뉴: Window > Analysis > Profiler).

참고: 기기를 인식할 수 있으려면 Android 기기와 Unity 에디터를 실행하는 호스트 컴퓨터가 모두 동일한 서브넷에 있어야 합니다.

Android 디버그 브리지(adb) 프로파일링의 경우 다음 절차를 따르십시오.

  1. 케이블을 사용하여 기기를 컴퓨터에 연결하고 adb 기기 리스트에 표시되는지 확인합니다.
  2. Build Settings (메뉴: File > Build Settings)로 이동한 후 Development Build 체크박스를 활성화하고 Build & Run 을 선택합니다.
  3. 애플리케이션이 기기에서 실행되면 Unity 에디터의 프로파일러 창을 엽니다(메뉴: Window > Analysis > Profiler).
  4. Attach to Player 드롭다운 메뉴에서 AndroidProfiler(ADB@127.0.0.1:34999) 를 선택합니다. 드롭다운 메뉴의 항목은 선택한 타겟이 Android일 때에만 표시됩니다.

Build & Run 을 선택하면 Unity 에디터는 애플리케이션을 위한 adb 터널을 자동으로 생성합니다. 

다른 애플리케이션을 프로파일링하거나 adb 서버를 다시 시작하려면 이 터널을 수동으로 설정해야 합니다. 

이렇게 하려면 터미널 창 또는 CMD 프롬프트를 열고 다음을 입력하십시오.

`adb forward tcp:34999 localabstract:Unity-{여기에 번들 식별자 삽입}

Android 빌드에서 세부 프로파일링을 사용하려면 Android 플레이어 설정(메뉴: Edit > Project Settings > Player > Android > Other Settings)에서 Mono Scripting Backend 설정을 활성화한 후 다음을 입력하여 adb 커맨드를 통해 게임을 시작해야 합니다.

~$ adb shell am start -n {insert bundle identifier here}/com.unity3d.player.UnityPlayerActivity -e 'unity' '-deepprofiling'

 

4. 오디오 프로파일러

프로파일러 창에는 총 로드 및 음성 카운트 등 오디오 시스템에 대한 중요한 성능 미터를 모니터링하는 오디오 창이 있습니다. 

오디오 창을 강조 표시하면 창 하단이 그래프에 포함되지 않는 오디오의 다양한 부분에 대한 자세한 뷰로 바뀝니다.

  • Playing Sources 는 특정 프레임에 있는 씬의 총 재생 소스 수입니다. 오디오 과부하 시 이 부분을 모니터링해야 합니다.
  • Paused Sources 는 특정 프레임에 있는 씬의 일시중지된 총 소스 수입니다.
  • Audio Voice 는 실제로 사용되는 오디오(FMOD 채널) 음성 수입니다. PlayOneShot은 재생 소스에 표시되지 않은 음성을 사용합니다.
  • Audio Memory 는 오디오 엔진에서 사용한 총 RAM입니다.

CPU 사용은 하단에서 확인할 수 있습니다. 

오디오가 단독으로 CPU를 너무 많이 사용하고 있는지 확인하려면 이 부분을 모니터링해야 합니다.

Channels, Groups 또는 Channels and groups 버튼을 클릭하여 사운드 이벤트의 자세한 프레임별 로그를 확인할 수 있습니다. 

여기서 렌더러와 메모리 그래프처럼 이벤트를 가져오고 삭제할 수 있습니다.

프레임 로그의 행에는 오디오 소스별로 재생된 클립, 클립이 재생된 볼륨, 청취자와의 거리, 그리고 상대적 재생 시간 같은 정보가 표시됩니다. 

로그에서 행을 하나 클릭하면 프로젝트 브라우저와 계층 구조 창에서 관련 오디오 소스와 클립이 강조 표시됩니다.

 

그림. Channel 뷰. 행을 클릭하면 AudioClip 에셋이 먼저 강조 표시된 다음 에셋을 재생한 AudioSource가 Hierarchy 창에서 강조 표시됩니다. 

 

그림. Channels and groups 뷰. 여기에는 선택된 행에서 사운드를 재생한 AudioSource가 강조 표시되어 있습니다. 

 

5. CPU 사용 프로파일러 모듈

CPU 사용 프로파일러 모듈은 애플리케이션에서 시간을 소비한 위치를 표시하는 차트를 제공합니다.

이 모듈은 애플리케이션이 시간을 소비하는 모든 주요 영역(예: 렌더링, 스크립트, 애니메이션)에 대한 개요를 제공합니다. 

5.1 차트 카테고리

CPU 사용 프로파일러 모듈의 차트는 애플리케이션의 메인 스레드에 사용된 시간을 추적합니다. 

타이밍은 9개 카테고리로 나뉩니다. 

차트의 카테고리 순서를 변경하려면 차트 범례에 카테고리를 끌어다 놓으십시오. 카테고리의 컬러 범례를 클릭하여 표시 여부를 토글할 수도 있습니다.

 

그림. CPU 사용 프로파일러 모듈

 

카테고리

설명

Rendering

애플리케이션이 그래픽스 렌더링에 소비하는 시간입니다.

Scripts

애플리케이션이 스크립트 실행에 소비하는 시간입니다.

Physics

애플리케이션이 물리 엔진에 소비하는 시간입니다.

Animation

애플리케이션이 스킨드 메시 렌더러, 게임 오브젝트, 애플리케이션 내 기타 컴포넌트에 소비하는 시간입니다. 여기에는 Animation Animator 컴포넌트가 사용하는 시스템의 계산에 소비된 시간도 포함됩니다.

GarbageCollector

애플리케이션이 가비지 컬렉터 실행에 소비하는 시간입니다.

VSync

애플리케이션이 targetFrameRate 또는 동기화할 다음 VBlank를 기다리는 데 프레임당 소비한 시간입니다. 이는 QualitySettings.vSyncCount , 타겟 프레임 속도, 또는 애플리케이션이 실행되는 플랫폼의 기본 또는 강제 VSync 설정을 따릅니다. VSync에 대한 자세한 내용은 렌더링 및 VSync 샘플 문서의 섹션을 참조하십시오.

Global Illumination

애플리케이션이 조명에 소비하는 시간입니다.

UI

애플리케이션이 UI 표시에 소비하는 시간입니다.

Others

애플리케이션이 코드에 소비하는 시간으로, 다른 카테고리에 속하지 않습니다. 여기에는 전체 EditorLoop, 또는 에디터의 플레이 모드에서 프로파일링 시 프로파일링 오버헤드 등의 영역이 포함됩니다.

 

5.2 모듈 세부 정보 창

CPU 사용 모듈을 선택하면 그 아래에 있는 세부 정보 창에 선택된 프레임에서 애플리케이션이 시간을 소비한 위치에 대한 분석이 표시됩니다. 

타이밍 데이터는 타임라인 또는 계층 표로 표시할 수 있습니다. 

표시 방식을 변경하려면 세부 정보 창의 왼쪽 상단 드롭다운을 사용하십시오(Timeline 으로 기본 설정됨). 다음의 세 가지 뷰를 이용할 수 있습니다.

 

기능

Timeline

특정 프레임에 대한 타이밍 분석 데이터를 프레임 길이의 시간 축을 따라 표시합니다. 메인 스레드 이외의 스레드에 대한 타이밍은 이 뷰 모드를 통해서만 볼 수 있으며, 전체 스레드에 대한 타이밍 간 상관 관계를 지정합니다. 예를 들어 잡 시스템 워커 스레드는 메인 스레드의 시스템이 예약한 후에 시작됩니다.

Hierarchy

내부 계층 구조를 기준으로 타이밍 데이터를 그룹화합니다. 이 옵션은 기본적으로 사용된 시간을 기준으로 애플리케이션이 호출한 요소를 내림차순 리스트 포맷으로 표시합니다. 할당된 스크립팅 메모리 양(GC Alloc) 또는 호출 횟수를 기준으로 정보를 정렬할 수도 있습니다. 표의 순서를 지정하는 열을 변경하려면 표의 열 헤더를 클릭하십시오.

Raw Hierarchy

타이밍 데이터를 타이밍이 발생한 호출 스택과 유사한 계층 구조로 표시합니다. Unity 계층 구조 뷰에서와 같이 각 호출 스택을 병합하지 않고 이 모드에서 개별적으로 나열합니다.

 

5.3 타임라인 뷰

그림. CPU 사용 프로파일러 모듈과 타임라인 뷰 

 

Timeline 뷰는 CPU 사용 프로파일러 모듈의 기본 뷰입니다.

여기에는 애플케이션에서 시간을 소비하는 위치와 타이밍 간 상관 관계에 대한 개요가 포함되어 있습니다.

타임라인 뷰는 모든 스레드의 프로파일링 데이터를 자체 하위 섹션에 동일한 시간 축을 따라 표시합니다.

이와 달리 계층 구조 뷰는 메인 스레드의 프로파일링 데이터만 표시합니다.

타임라인 뷰를 사용하여 병렬 실행 시 다른 스레드의 동작 간의 상관 관계를 확인할 수 있습니다. 

또한 잡 시스템의 워커 스레드를 비롯한 다른 스레드를 사용하는 정도, 스레드 작업이 대기열에 들어가는 방식, 유휴 상태의 스레드 (Idle 샘플) 또는 다른 스레드나 잡이 완료되기를 기다리는 스레드(Wait for x 샘플)가 있는지 여부를 파악할 수 있습니다.

5.3.1 항목 탐색 및 선택

시간 축의 영역을 확대하려면 마우스 스크롤 휠을 사용하거나 Alt 키를 길게 누르고 마우스 오른쪽 버튼을 누른 상태로 드래그하십시오. 

수평 스크롤 바의 끝을 사용하여 확대할 수도 있습니다. 키보드의 A 키를 누르면 확대가 초기화되고 전체 프레임 시간이 표시됩니다.

스레드 하단에 흰색 화살표가 표시되면 클릭하여 스레드를 펼치고 모든 라인을 표시할 수 있습니다. 

다시 클릭하면 최상단 라인만 표시됩니다. 

스레드를 구분하는 라인을 드래그하여 표시되는 라인 개수를 다시 조정할 수도 있습니다. 

라인을 두 번 클릭하면 스레드 섹션의 높이가 호출 스택의 최대 뎁스로 설정됩니다. 

뷰를 패닝하려면 마우스 가운데 버튼을 누르거나, Alt 키(macOS의 경우 Command 키)를 길게 누른 상태로 마우스 왼쪽 버튼을 누르십시오.

스레드 그룹을 접거나 펼치려면 뷰의 왼쪽 끝에 있는 스레드 이름 옆의 폴드아웃 화살표를 클릭하십시오.

CPU 차트에 대한 항목 기여도를 확인하려면 아래쪽 창에서 해당 항목을 선택하십시오. 

프로파일러는 기여도를 강조 표시하고 차트의 나머지 부분은 흐리게 표시합니다. 

항목을 선택 해제하려면 뷰의 아무 곳이나 클릭하십시오. 

F 키를 누르면 선택한 현재 샘플에 포커스를 두고, 아무것도 선택하지 않으면 기본 줌 레벨을 표시합니다.

 

그림. 선택된 항목이 있는 타임라인 뷰의 CPU 사용 모듈

 

위 이미지에서 선택된 항목의 툴팁은 모든 스레드에서 이 샘플의 총 시간, 인스턴스 수 등과 같은 추가 세부 정보를 제공합니다.

GC.Alloc 샘플은 자홍색으로 표시되며 할당 크기를 보여줍니다.

툴팁에 관리되는 호출 스택을 표시하려면 프로파일러 창의 툴바로 이동한 후 Call Stacks 버튼을 선택하십시오. 

반드시 이 프로퍼티를 활성화한 후 프레임을 프로파일링하여 프레임의 호출 스택을 표시해야 합니다. 

자세한 내용은 할당 호출 스택 섹션을 참조하십시오.

타임라인 뷰에서 시간 범위를 수동으로 측정할 수도 있습니다. 

이렇게 하려면 아무 곳이나 클릭한 후 수평으로 드래그하여 타임라인의 한 섹션에 오버레이를 표시하십시오. 

상단의 시간 눈금자는 해당 오버레이에 포함된 시간을 표시합니다. 

오버레이가 표시된 동안 F 키를 누르면 선택한 시간 섹션을 따라 뷰를 수평으로 프레이밍합니다. 

오버레이를 제거하려면 아무 곳이나 클릭하십시오.


5.4 계층 구조 및 원시 계층 구조 뷰

계층 구조 또는 원시 계층 구조 뷰로 전환하면 해당 샘플이 메인 스레드에 있는 한 선택 항목이 계속 이어집니다. 

선택 항목을 즉시 찾을 수 없으면 F 키를 눌러 포커스를 맞추십시오.

 

그림. CPU 사용 프로파일러 모듈과 계층 구조 뷰 

 

계층 구조 뷰는 프로파일링한 모든 샘플을 나열하고, 공유된 호출 스택과 ProfilerMarkers 계층 구조로 그룹화합니다.

Raw Hierarchy 뷰는 샘플들을 서로 그룹화하지 않으므로, 세분화된 수준으로 샘플을 살펴볼 때 유용합니다.

또한 Thread 드롭다운에서 특정 스레드(예: 메인 스레드 또는 렌더 스레드)를 선택하여 이러한 뷰로 검사할 수 있습니다.

두 가지 뷰 모두 계층 구조의 각 항목에 대해 다음의 상세 정보를 제공합니다.

 

프로퍼티

기능

Total

Unity가 특정 함수에 소비한 총 시간(백분율)입니다.

Self

Unity가 특정 함수에 소비한 총 시간(백분율)이며, Unity가 하위 함수를 호출하는 데 소비한 시간은 제외입니다.

Calls

이 프레임에서 이 함수를 호출한 횟수입니다원시 계층 구조 뷰에서 이 열의 값은 항상 1이며, 이는 프로파일러가 샘플의 계층 구조를 병합하지 않기 때문입니다.

GC Alloc

Unity가 현재 프레임에 할당한 스크립팅 힙 메모리의 양입니다. 스크립팅 힙 메모리는 가비지 컬렉터에서 관리합니다.
Unity
 GC.Collect()를 호출할 때마다 또는 힙의 현재 크기에 맞지 않는 스크립팅 힙 할당이 있을 때마다 가비지 컬렉터가 트리거됩니다. 또한 레퍼런스가 더 이상 없는 모든 할당을 표시하고 수집합니다. 이 프로세스는 프로파일러에서 GC.Collect 샘플로 표시됩니다.
힙에 대한 할당이 늘어날 때마다 Unity는 가비지 컬렉터를 더 자주 실행합니다. 관리되는 힙의 크기가 커지면 Unity가 메모리를 표시하고 수집하는 데 더 오래 걸립니다. 따라서 가비지 컬렉터가 프레임 속도에 영향을 미치지 않도록 만들고 전체 힙 크기를 가능한 작게 유지하려면, 애플리케이션이 실행되는 동안 GC Alloc 값을 0으로 유지해야 합니다.
관리되는 힙에 대한 자세한 내용은 자동 메모리 관리의 이해 문서를 참조하십시오.

Time ms

Unity가 특정 함수에 소비한 총 시간(밀리초)입니다. 애플리케이션이 잡 시스템이나 멀티스레드 렌더링을 사용하는 경우 이러한 정보는 잘못되었을 수 있습니다. 이는 현재 선택한 스레드에서 Unity가 소비한 시간만 포함되기 때문입니다. 스레드를 변경하려면 계층 구조 창 상단의 Thread 드롭다운을 선택하십시오.

Self ms

Unity가 특정 함수에 소비한 총 시간(밀리초)이며, Unity가 하위 함수를 호출하는 데 소비한 시간은 제외입니다.

Warning

경고 아이콘으로 표시되며, 현재 프레임 동안 애플리케이션이 경고를 트리거한 횟수를 표시합니다. 자세한 내용은 이 문서의 성능 경고 섹션을 참조하십시오.


애플리케이션이 호출하는 위치와 프로파일링된 함수를 사용하는 위치에 대한 자세한 내용을 보려면 모듈 세부 정보 창의 오른쪽 상단에 있는 Details 드롭다운을 선택한 후 Show Related Objects 또는 Show Calls 뷰를 선택하십시오.

 

그림. Show Related Objects 창

 

Show Related Objects 뷰는 UnityEngine.Object 를 가져오는 Begin() 오버로드를 사용하여 프로파일러 샘플과 연결된 UnityEngine.Objects 리스트를 표시합니다. 

일부 샘플 Unity 보고서에는 렌더링을 수행하는 카메라 오브젝트에 연결된 Camera.Render 등과 같은 빌트인 샘플이 포함되어 있습니다. 

Unity는 이러한 인스턴스 ID를 통해 이러한 오브젝트를 보고하고 프로파일러 창의 이름으로 확인합니다.

이러한 오브젝트 중 하나를 클릭하면 Unity는 씬 계층 구조를 통해 오브젝트를 찾아 ping합니다.

이 연결은 인스턴스 ID를 사용하므로 에디터에서 애플리케이션을 프로파일링할 때 그리고 오브젝트가 여전히 존재할 때에만 ping이 동작합니다.    

GC.Alloc 샘플의 경우 이 뷰는 “N/A” 항목 리스트(이 계층 구조 레벨에서 발생한 각 할당에 대한 항목)를 표시하고 GC.Alloc 열에 할당 크기를 나열합니다. 

Call Stacks 설정이 활성화된 상태로 에디터에서 애플리케이션을 프로파일링하고, 이 뷰에서 GC.Alloc 샘플을 선택하면 선택된 할당 스크립팅 오브젝트에 대한 호출 스택이 표시됩니다. 

Deep Profiling 설정을 활성화하지 않았더라도 마찬가지입니다. 

자세한 내용은 이 문서의 Allocation call stacks 섹션을 참조하십시오.

 

그림. Show Calls 패널

 

Show Calls 뷰에는 선택한 샘플이 호출되는 위치와 호출하는 다른 함수들을 표시합니다.

또한 모듈 세부 정보 창의 기어 아이콘 아래에서 Collapse Editor Only Samples 설정을 활성화하거나 비활성화할 수 있습니다. 

이 설정은 에디터 전용 안전 검사로 인해 발생하는 플레이어 루프의 모든 샘플을 축소합니다. 

샘플이 축소되면 GC.Alloc 값은 둘러싸는 샘플의 GC.Alloc 값에 기여하지 않습니다. 

이 설정은 기본적으로 활성화됩니다. 자세한 내용은 이 문서의 에디터 전용 샘플 섹션을 참조하십시오.

 

5.4.1 일반 샘플

스크립팅 코드가 생성하는 샘플 외에도 Unity는 수많은 샘플을 통해 애플리케이션의 시간 소비에 관한 인사이트를 제공합니다. 다음 표에는 보다 더 일반적인 샘플들의 동작을 설명합니다.

메인 스레드 기본 샘플

메인 스레드 기본 샘플은 애플리케이션에 소비된 시간과 에디터 및 프로파일러 활동에 소비된 시간을 명확하게 구분합니다. 

또한 레코더는 이러한 샘플을 사용하여 메인 스레드의 프레임 타이밍을 확인할 수 있습니다.

 

샘플

기능

PlayerLoop

애플리케이션의 메인 루프에서 시작되는 샘플의 루트입니다. 플레이어가 활성 플레이 모드의 에디터에서 실행 중일 때 Profile Editor 설정을 활성화하면 이 샘플은 EditorLoop 아래에 중첩됩니다.

EditorLoop

에디터의 메인 루프에서 시작되는 샘플의 루트입니다. 에디터에서 플레이어를 프로파일링하는 동안에만 나타납니다Profile Editor 설정을 비활성화하면 이 샘플은 렌더링하거나 플레이어가 포함된 에디터를 실행하는 데 소비된 프레임 시간을 표시합니다.

Profiler.CollectEditorStats

다른 활성 프로파일러 모듈의 통계 수집과 관련된 샘플의 루트입니다. Profiler.CollectGlobalStats 자식 샘플 아래에 있는 모든 샘플은 플레이어의 과도한 리소스 소모를 유발합니다. 다른 모든 자식 샘플들은 에디터에만 영향을 줍니다. 특정 모듈을 비활성화하려면 해당 차트를 닫거나 Profiler.SetAreaEnabled()를 호출하십시오.

 

스크립트 업데이트 샘플

잡 시스템을 사용하지 않는 한 대부분의 스크립팅 코드는 다음 샘플의 아래에 중첩됩니다. 

 

샘플

기능

Update.ScriptRunBehaviourUpdate

이 샘플에는 MonoBehaviour.Update에 대한 호출과 코루틴 처리가 들어 있습니다.

BehaviourUpdate

이 샘플은 모든 Update() 메서드를 처리합니다.

CoroutinesDelayedCalls

첫 번째 yield 이후의 코루틴 샘플이 들어 있습니다.

PreLateUpdate.ScriptRunBehaviourLateUpdate

이 샘플은 모든 LateUpdate() 메서드를 처리합니다.

FixedBehaviourUpdate

이 샘플은 모든 FixedUpdate() 메서드를 처리합니다.

 

렌더링 및 VSync 샘플

이 샘플은 CPU가 GPU에 대한 데이터 처리에 시간을 소비하는 위치, 또는 GPU가 완료되기를 기다리는 위치를 보여줍니다. 

GPU 프로파일러를 이용할 수 없거나, 리소스 소모가 과도해지는 경우에는 툴바에 이러한 정보가 표시되지 않습니다. 

이 샘플은 애플리케이션이 CPU 바운드 또는 GPU 바운드인지 알려줍니다.

 

샘플

기능

WaitForTargetFPS

애플리케이션이 Application.targetFrameRate에 지정된 타겟 FPS를 기다리는 데 소비한 시간입니다.
이 샘플이 Gfx.WaitForPresent 의 하위 샘플인 경우에는 QualitySettings.vSyncCount에 설정된 VSync를 기다리는 데 애플리케이션이 소비한 시간을 나타냅니다.
참고에디터는 GPU에서 VSync를 수행하지 않고 대신에 WaitForTargetFPS 를 사용하여 VSync 지연을 시뮬레이션합니다. Android, iOS 등과 같은 일부 플랫폼은 VSync를 강제로 적용하거나, 30 또는 60의 기본 프레임 속도 상한을 지정합니다.

Gfx.ProcessCommands

렌더 스레드의 모든 렌더링 커맨드 처리를 포함합니다. 이 중 일부는 메인 스레드에서 VSync 또는 새 커맨드를 기다리는 데 소비한 시간일 수 있으며Gfx.WaitForPresent 자식 샘플에서 확인할 수 있습니다.

Gfx.WaitForCommands

렌더 스레드가 새 커맨드를 수행할 준비가 되었음을 의미하며 메인 스레드의 병목 현상을 나타낼 수 있습니다.

Gfx.PresentFrame

애플리케이션이 GPU가 프레임을 렌더링하고 표시하기까지 기다린 시간을 표시하며, VSync 대기를 포함할 수 있습니다.
메인 스레드의 WaitForTargetFPS 샘플은 VSync를 기다리는 데 소비한 시간을 표시합니다.

Gfx.WaitForPresent

메인 스레드가 다음 프레임을 렌더링할 준비가 되었지만, 렌더 스레드가 GPU가 프레임 표시를 끝낼 때까지 기다리지 않았음을 의미합니다. 이는 애플리케이션이 GPU 바운드임을 표시할 수 있습니다. 렌더 스레드가 동시에 시간을 소비하는 곳을 보려면 타임라인 뷰를 확인하십시오.
렌더 스레드가 Camera.Render 에서 시간을 보내면 애플리케이션은 CPU 바운드이며, 드로우 콜이나 텍스처를 GPU로 보내는 데 너무 많은 시간을 소비할 수 있습니다.
렌더 스레드가 Gfx.PresentFrame 에 시간을 소비하면 게임은 GPU 바운드이거나 GPU에서 VSync를 기다리는 중일 수 있습니다. GFX.WaitForPresent  WaitForTargetFPS 하위 샘플은 Present 단계에서 애플리케이션이 VSync를 기다리는 데 소비한 시간을 나타냅니다. Present 단계는 Unity가 그래픽스 API에 버퍼 교환을 명령하는 시점과 이 작업이 완료된 시점 사이의 시간입니다..

Gfx.WaitForRenderThread

메인 스레드가 렌더 스레드가 현재 커맨드 스트림에 있는 모든 커맨드를 처리할 때까지 기다리고 있음을 의미합니다. 이 샘플은 멀티스레드 렌더링에서만 발생합니다.

 

멀티 스레드 샘플

이 샘플은 CPU 사이클을 소비하지 않지만, 스레딩 및 JobSystem과 관련된 정보를 강조 표시합니다. 

이러한 샘플을 사용하는 경우 타임라인 뷰에서 다른 스레드에서 동시에 무슨 일이 일어나고 있는지 확인하십시오.

 

샘플

기능

Idle

JobSystem이 워커 스레드를 사용하지 않을 때 Idle 샘플을 방출합니다Idle 샘플 간의 작은 간극은 보통 JobSystem이 샘플들을 깨울 때 발생합니다(: 새로운 잡 예약). 간극이 길면 네이티브 잡이 계측되지 않았음을 의미합니다.

Semaphore.WaitForSignal

이 스레드는 다른 스레드에서 무슨 일이 발생하기를 기다립니다. 기다리는 스레드를 찾으려면 타임라인 뷰에서 이 샘플 바로 직전에 종료된 샘플이 있는지 확인하십시오.

WaitForJobGroupID

JobHandle Sync Fence가 트리거되었습니다. 이로 인해 작업 훔치기가 발생할 수 있습니다. 이는 워커가 해당 작업을 마치고 다른 워커가 작업을 끝마치기를 기다릴 때 발생합니다. 또한 이 샘플에서 실행된 작업 샘플로 표시됩니다. “도난당한” 작업은 대개 기다리고 있던 작업이 아닙니다.

 

물리 샘플

다음 표에는 몇 가지 하이 레벨 물리 프로파일러 샘플이 간략하게 소개되어 있습니다. 

FixedUpdate()는 이러한 샘플을 모두 호출합니다.

 

샘플

기능

Physics.Simulate

물리 엔진이 시뮬레이션을 실행하도록 명령하여 현재 물리의 상태를 업데이트합니다.

Physics.Processing

천이 아닌 모든 물리 작업을 처리합니다. 이 샘플을 확장하면 물리 엔진 내부에서 수행되는 작업의 로우 레벨 세부 정보가 표시됩니다.

Physics.ProcessingCloth

모든 천 물리 작업을 처리합니다. 이 샘플을 확장하면 물리 엔진 내부에서 수행되는 작업의 로우 레벨 세부 정보가 표시됩니다.

Physics.FetchResults

물리 엔진의 물리 시뮬레이션 결과를 수집합니다.

Physics.UpdateBodies

모든 물리 바디의 포지션과 회전을 업데이트합니다. 또한 이 샘플에는 이러한 업데이트가 전송될 때 전달되는 메시지도 포함되어 있습니다.

Physics.ProcessReports

물리 FixedUpdate가 끝나면 실행됩니다. 시뮬레이션 결과에 응답하는 다양한 단계를 처리합니다. 이 샘플에서는 접점, 조인트 브레이크, 트리거 업데이트 및 메시지입니다. 여기에는 다음의 네 가지 개별 하위 단계가 있습니다.

- Physics.TriggerEnterExits

OnTriggerEnter  OnTriggerExit 이벤트를 처리합니다.

- Physics.TriggerStays

OnTriggerStay 이벤트를 처리합니다.

- Physics.Contacts

OnCollisionEnter, OnCollisionExit  OnCollisionStay 이벤트를 처리합니다.

- Physics.JointBreaks

끊어진 조인트와 관련된 업데이트와 메시지를 처리합니다.

Physics.UpdateCloth

천과 해당 스킨드 메시와 관련된 업데이트가 들어 있습니다.

Physics.Interpolation

모든 물리 오브젝트의 포지션 및 회전 보간을 관리합니다.

 

스크립트 라이프사이클과 그 안에 있는 일반 샘플에 대한 자세한 내용은 이벤트 함수의 실행 순서를 참조하십시오.

 

5.4.2 성능 경고

CPU 프로파일러는 몇 가지 일반적인 성능 문제를 감지하고 그에 대해 경고할 수 있습니다. 이 경고는 모듈 세부 정보 창에서 계층 구조 뷰의 Warning 열에 나타납니다.

 

그림. 정적 콜라이더가 이동했음을 알리는 프로파일러 경고 

 

프로파일러는 성능이 중요한 상황에서 피해야 할 특정 호출을 감지할 수 있습니다. 또한 경고와 함께 해당 작업이 리소스를 많이 소모하는 이유를 표시합니다.

  • Rigidbody.SetKinematic: 리지드바디용 비 컨벡스 메시 콜라이더를 다시 생성
  • Animation.DestroyAnimationClip: RebuildInternalState 트리거
  • Animation.AddClip: RebuildInternalState 트리거
  • Animation.RemoveClip: RebuildInternalState 트리거
  • Animation.Clone: RebuildInternalState 트리거
  • Animation.Deactivate: RebuildInternalState 트리거

5.4.3 할당 호출 스택

기본적으로 GC.Alloc 샘플에 할당된 호출 스택은 멀티 프레임 지연으로 애플리케이션을 중단할 수 있으므로 비활성화되어 있습니다. 

하지만 때로는 Unity가 코드를 실행하는 방식을 확인하기 위해 전체 호출 스택을 살펴봐야 할 수 있습니다.

 

이렇게 하려면 프로파일러 창의 툴바로 이동하여 Call Stacks 버튼을 선택하십시오. 에디터에서 프로파일링을 하거나, 플레이어가 실행 중일 때 이 기능을 사용할 수 있습니다. 

이 옵션을 활성화한 후 프로파일링하는 프레임에서 GC.Alloc 샘플에 해당 호출 스택이 포함됩니다.

모든 스크립팅 힙 할당은 계층 구조 뷰와 타임라인 뷰 모두에서 GC.Alloc 샘플로 표시됩니다. 

타임라인 뷰에서는 밝은 자홍색으로 표시됩니다. 호출 스택을 확인하려면 CPU 프로파일러 모듈을 선택하고 타임라인 뷰에서 GC.Alloc 샘플을 선택하십시오. 그러면 호출 스택이 강조 표시되어 나타납니다.

 

그림. GC.Alloc 호출 스택이 있는 타임라인 뷰의 CPU 사용 모듈 

 

또는 계층 구조 또는 원시 계층 구조 뷰에서 호출 스택을 확인할 수 있습니다. 

Details 뷰를 Show Related Objects 로 설정하십시오. GC.Alloc 샘플에는 이름이 없기 때문에 이 패널에 N/A 오브젝트로 표시됩니다. 

N/A 오브젝트를 선택하면 프로파일러가 세부 정보 뷰 하단에 호출 스택을 표시합니다.

관리되는 할당에 관한 자세한 내용은 자동 메모리 관리 이해 문서를 참조하십시오.

 

그림. 계층 구조 뷰의 호출 스택

 

5.4.4 에디터 전용 샘플

일부 샘플은 에디터에서 프로파일링할 때에만 존재합니다. 

여기에는 null 컴포넌트 사용을 식별하는 데 유용한 GetComponentNullErrorWrapper, 오브젝트 설정을 확인하는 CheckConsistency, 파괴 검사인 CheckAllowDestructionRecursive 등 여러 보안 검사와 프리팹 관련 활동이 포함됩니다.

이러한 샘플들은 플레이어에 존재하지 않습니다.

기본적으로 에디터 전용 샘플은 계층 구조 뷰에서 축소되고 EditorOnly [SampleName]이라는 이름이 지정됩니다. 

이러한 샘플은 가비지 컬렉션 할당을 유발할 수 있으며, 축소된 경우 둘러싸는 샘플의 GC.Alloc 값에 기여하지 않습니다.

기본 동작을 변경하려면 모듈 세부 정보 창의 오른쪽 상단에 있는 컨텍스트 메뉴를 클릭 한 후 Collapse EditorOnly Samples 설정을 비활성화하십시오.

이렇게 하면 샘플을 확장하고 해당 GC.Alloc 값을 둘러싸는 샘플에 제공할 수 있습니다.

이 옵션은 타임라인 뷰에 영향을 주지 않습니다. 

이러한 샘플은 대개 무시하거나, 타겟 디바이스에서 플레이어 빌드를 프로파일링하기 위한 프롬프트로 사용하여 실제 문제를 찾을 수 있습니다.

 

6. 전역 조명 프로파일러 모듈

전역 조명 프로파일러 모듈은 모든 워커 스레드에서 실시간 전역 조명(GI) 하위 시스템이 사용하는 CPU 시간과 통계를 표시합니다. 

전역 조명에 대한 자세한 내용은 전역 조명 문서를 참조하고, 인라이튼에 대한 자세한 내용은 Unity에서 인라이튼 사용을 참조하십시오.

참고: 전역 조명 프로파일러 모듈이 사용하는 인라이튼은 지원이 중단되어 곧 제거될 예정입니다. 

자세한 내용은 Unity 블로그를 참조하십시오. 또는 프로그레시브 GPU 라이트매퍼(프리뷰) 또는 프로그레시브 CPU 라이트매퍼를 사용할 수도 있습니다.

 

그림. 전역 조명 프로파일러 모듈 

 

6.1 차트 카테고리

전역 조명 프로파일러 모듈의 차트는 GI 하위 시스템이 모든 워커 스레드에 사용한 시간을 추적합니다. 

타이밍은 10개 카테고리로 나뉩니다. 

차트의 카테고리 순서를 변경하려면 차트 범례에 카테고리를 끌어다 놓으십시오. 카테고리의 컬러 범례를 클릭하여 표시 여부를 토글할 수도 있습니다.

 

차트

설명

Total CPU

모든 스레드에서 소비한 시간입니다.

Light Probe

라이트 프로브 업데이트에 소비한 시간입니다.

플랫폼/기기

설정 단계에 소비한 시간입니다.

Environment

환경 조명 처리에 소비한 시간입니다.

Input Lighting

입력 조명 처리에 소비한 시간입니다.

Systems

시스템 업데이트에 소비한 시간입니다.

Solve Tasks

라디오시티 솔버 작업에 소비한 시간입니다.

Dynamic Objects

동적 게임 오브젝트 업데이트에 소비한 시간입니다.

Other Commands

다른 커맨드 업데이트에 소비한 시간입니다.

Block Command Write

커맨드 버퍼를 기다리며 차단 상태로 보낸 시간입니다.

 

6.2 모듈 세부 정보 창

전역 조명 모듈을 선택하면 그 아래에 있는 세부 정보 창에 선택한 프레임에서 애플리케이션이 시간을 소비한 위치에 대한 분석이 표시됩니다. 

이용할 수 있는 데이터는 다음과 같습니다. 

 

데이터

설명

Total CPU Time

모든 스레드의 총 인라이튼 CPU 시간(ms)입니다.

Probe Update Time

라이트 프로브 업데이트에 소비한 시간(ms)입니다.

Setup Time

설정 단계에 소비한 시간(ms)입니다.

Environment Time

환경 조명 처리에 소비한 시간(ms)입니다.

Input Lighting Time

입력 조명 처리에 소비한 시간(ms)입니다.

Systems Time

시스템 업데이트에 소비한 시간(ms)입니다.

Solve Tasks Time

라디오시티 솔버 작업의 실행에 소비한 시간(ms)입니다.

Dynamic Objects Time

동적 게임 오브젝트 업데이트에 소비한 시간(ms)입니다.

Time Between Updates

전역 조명 업데이트 간의 시간(ms)입니다.

Other Commands Time

다른 커맨드의 처리에 소비한 시간(ms)입니다.

Blocked Command Write Time

커맨드 버퍼를 기다리며 차단 상태로 보낸 시간(ms)입니다.

Blocked Buffer Writes

차단 중인 커맨드 버퍼에 대한 쓰기 수입니다.

Total Light Probes

씬에 있는 총 라이트 프로브 수입니다.

Solved Light Probes

마지막 업데이트 이후 계산된 라이트 프로브 수입니다.

Probe Sets

씬에 있는 라이트 프로브 세트 수입니다.

Systems

씬에 있는 인라이튼 시스템 수입니다.

Pending Material GPU Renders

GPU에서 렌더링을 위해 대기 중인 알베도/방출 렌더 수입니다.

Pending Material Updates

처리되기를 기다리는 머티리얼 업데이트 수입니다.

 

7. GPU 프로파일러

그림. GPU 사용 프로파일러 

 

GPU 사용 프로파일러에는 GPU 시간이 게임의 어느 부분에 소요되었는지 표시됩니다.

이 프로파일러를 선택하면 하단 창에 선택된 프레임에 대한 계층적 시간 데이터가 표시됩니다.

계층 구조에서 항목을 선택하면 기여도 분석 정보가 오른쪽 패널에 표시됩니다.

프로파일러에 표시되는 정보에 대해 자세히 알아보려면 프로파일러 창 문서를 참조하십시오.

Player 설정에서 Graphics Jobs 를 활성화하면 GPU 프로파일링이 비활성화됩니다. 

자세한 내용은 스탠드얼론 플레이어 설정에 관한 문서를 참조하십시오. 

macOS의 경우 OSX 10.9 Mavericks 이상 버전에서만 GPU 프로파일링을 사용할 수 있습니다.

7.1 원격 프로파일링 지원

 

플랫폼

그래픽스 API

상태

Windows

D3D9, D3D11, D3D12, OpenGL core, OpenGL ES 2.0, OpenGL ES 3.x

지원됨

Vulkan

사용 불가

Mac OS X

OpenGL core

지원됨

Metal

사용 불가. XCode GPU Frame Debugger UI를 대신 사용해야 합니다.

Linux

OpenGL core

지원됨

Vulkan

사용 불가

PlayStation 4

libgnm

지원됨(대안은 Razor)

Xbox One

D3D11

지원됨(대안은 PIX)

WebGL

WebGL 1.0 WebGL 2.0

사용 불가

Android

OpenGL ES 2.0, OpenGL ES 3.x

NVIDIA 또는 Intel GPU를 구동하는 기기에서만 지원됨

Vulkan

사용 불가

iOS, tvOS

Metal, OpenGL ES 2.0, OpenGL ES 3.0

사용 불가. XCode GPU Frame Debugger UI를 대신 사용해야 합니다.

Tizen

OpenGL ES 2.0

사용 불가

 

7.2 Unity 에디터에서의 프로파일링

에디터는 Direct3D 9 및 Direct3D 11 API가 있는 Windows에서만 프로파일링을 지원하는데, 장점과 단점이 모두 있습니다. 

플레이어를 빌드하지 않아도 되므로 빠른 프로파일링에 편리하지만, 프로파일러는 Unity 에디터를 실행하는 오버헤드의 영향을 받으므로 프로파일링 결과의 정확도가 낮을 수 있습니다.

 

8. 메모리 프로파일러 모듈

메모리 프로파일러 모듈은 애플리케이션에 할당된 총 메모리를 나타내는 카운터를 시각화합니다. 

메모리 모듈을 사용하면 로드된 오브젝트 수, 카테고리별로 차지하는 총 메모리 등과 같은 정보를 볼 수 있습니다. 

또한 프로파일러 프레임당 GC 할당 수도 확인할 수 있습니다.

에디터에서 애플리케이션을 프로파일링하면 메모리 모듈의 정보가 에디터의 메모리 사용량을 표시합니다. 

이 수치는 일반적으로 릴리스 플랫폼에서 실행할 때보다 더 큽니다. 

이는 Unity 에디터에서 실행하면 메모리를 차지하는 특정 오브젝트를 사용하고 에디터 창 자체가 추가 메모리를 사용하기 때문입니다. 

또한 프로파일러는 사용하는 메모리도 표시하는데, 이는 Unity가 플레이 모드 플레이어가 사용하는 메모리와 명확하게 분리할 수 없기 때문입니다.

애플리케이션에 대한 더욱 정확한 수치와 메모리 사용량을 확인하려면 프로파일러를 Attach to Player 메뉴를 통해 실행 중인 플레이어에 연결하십시오. 

이렇게 하면 타겟 디바이스의 실제 사용량을 볼 수 있습니다.

8.1 차트 카테고리

메모리 모듈은 애플리케이션이 메모리를 소비하는 위치에 대한 자세한 정보를 보여주는 6개의 차트로 구성됩니다. 

차트에서 카테고리 순서를 변경할 수 있습니다. 

이렇게 하려면 카테고리를 차트 범례에 끌어다 놓으십시오. 

카테고리의 컬러 범례를 클릭하여 표시 여부를 토글할 수도 있습니다.

 

카테고리

설명

Total Allocated

애플리케이션이 사용한 총 메모리입니다.

Texture Memory

애플리케이션의 텍스처가 사용한 메모리 양입니다.

Mesh Memory

애플리케이션의 메시가 사용한 메모리 양입니다.

Material Count

애플리케이션의 머티리얼 인스턴스 수입니다.

Object Count

애플리케이션의 네이티브 오브젝트 인스턴스 수입니다.

Total GC Allocated

GC 힙이 사용한 메모리 양입니다.

GC Allocated

GC 힙에서 프레임당 할당된 메모리 양입니다.

 

8.2 모듈 세부 정보 창

프로파일러 창 하단에 있는 모듈 세부 정보 창에서는 Simple 및 Detailed 뷰를 사용할 수 있습니다.

뷰를 변경하려면 모듈 세부 정보 창의 왼쪽 상단에 있는 드롭다운에서 사용할 뷰를 선택하십시오.

8.2.1 간단한 뷰

간단한 뷰는 Unity 전역에서 메모리가 사용되는 방법에 대한 개요를 프레임별로 실시간 표시합니다.

Unity는 운영체제에 메모리를 너무 자주 요청하는 것을 방지하기 위해 메모리 풀을 예약합니다. 

메모리 풀은 예약된 용량과 사용된 용량으로 표시됩니다.

 

그림. 간단한 메모리 모듈 뷰

 

여기에는 다음이 포함됩니다.

  • Total: 아래의 모든 영역에서 누적된 값입니다.
  • Unity: 네이티브 메모리 관리자 시스템에서 추적되고 타입, 소스 및 플랫폼 별 할당 패턴에 따라 메모리 풀에 할당된 네
  • 이티브 Unity 코드의 메모리 할당량입니다.
  • Mono: 총 힙 크기와 관리 코드가 사용하는 힙 크기입니다. 이 메모리는 가비지로 수집됩니다.
  • GfxDriver: 드라이버가 텍스처, 렌더 타겟, 셰이더 및 메시 데이터에 사용하는 메모리의 추정량입니다.
  • Audio: 오디오 시스템의 추정 메모리 사용량입니다.
  • Video: 동영상 시스템의 추정 메모리 사용량입니다.
  • Profiler: 프로파일러가 사용하는 총 메모리입니다.

프로파일러의 값은 운영체제의 작업 관리자에 표시되는 값과 다릅니다. 

이는 메모리 프로파일러가 시스템의 모든 메모리 사용량을 추적하지 않기 때문입니다. 

여기에는 일부 드라이버와 플러그인에서 사용하는 메모리와 실행 코드에 사용되는 메모리가 포함됩니다. 

운영체제에서 애플리케이션의 총 메모리 크기를 확인할 수 있는 플랫폼의 경우 Total System Memory Usage 는 0보다 크며 작업 관리자에서 동일한 크기입니다.

또한 프로파일러는 아주 일반적으로 사용되는 에셋 및 게임 오브젝트 타입에 대한 메모리 통계도 보여줍니다. 

이러한 통계에는 카운트(포워드슬래시 앞)와 사용된 메모리가 포함됩니다. 

이 리스트에서 Total Object Count 는 애플리케이션이 생성하는 네이티브 게임 오브젝트의 총 개수를 표시합니다. 

이 수치가 시간이 지나면서 증가하면 애플리케이션은 게임 오브젝트를 생성하기만 하고 파괴하지 않는 것입니다.

8.2.2 세부 정보 뷰

세부 정보 뷰를 사용하여 애플리케이션의 현재 상태에 대한 스냅샷을 생성할 수 있습니다. 

Take Sample 버튼을 클릭하여 현재 타겟에 대한 상세한 메모리 사용량을 캡처하십시오. 프로파일러가 이러한 데이터를 얻는 데는 많은 시간이 소요되므로, Detailed 뷰는 실시간 상세정보를 제공하지 않습니다. 

프로파일러가 샘플을 가져오면 프로파일러 창에 애플리케이션의 메모리 사용을 자세히 검토할 수 있는 트리 뷰가 표시됩니다.

 

그림. 상세한 메모리 모듈 뷰

 

모듈 세부 정보 창의 상단에서 Gather object references 설정을 활성화하면 스냅샷 시점에 오브젝트를 참조하는 요소에 대한 정보를 수집할 수 있습니다.

이러한 정보는 창의 오른쪽 면에 표시됩니다.

메모리를 사용하는 오브젝트는 트리 뷰에서 다음 카테고리로 구분됩니다.

  • Other: 에셋, 게임 오브젝트 또는 컴포넌트가 아닌 오브젝트. Unity가 다양한 시스템에 사용하는 메모리 양 등과 같은 정보가 여기에 표시됩니다.
  • Not Saved: DontSave로 표시된 오브젝트
  • Builtin Resources: 그래픽스 설정의 Always Included Shaders 리스트에 추가한 셰이더 등과 같은 Unity 에디터 리소스 또는 Unity 기본 리소스
  • Assets: 사용자 또는 네이티브 코드에서 참조한 에셋
  • Scene Memory: 오브젝트 및 연결된 컴포넌트

Assets 또는 Scene Memory 리스트의 오브젝트를 클릭하면 프로젝트 또는 씬 뷰에서 강조 표시됩니다.

참고: Other 카테고리의 System.ExecutableAndDlls에 보고되는 메모리는 읽기 전용입니다. 

운영체제에서 필요한 경우 해당 페이지를 폐기하고 나중에 파일 시스템에서 다시 로드할 수 있습니다. 

그러면 메모리 사용량이 줄어들고 운영체제에서 과도한 메모리를 사용하는 애플리케이션을 종료하기로 결정하는 직접적인 원인이 되지 않습니다. 

일부 페이지는 동일 프레임워크를 사용하는 다른 애플리케이션과 공유될 수도 있습니다.

8.3 메모리 프로파일러 패키지

메모리 모듈 외에도 메모리 프로파일러 패키지를 사용하여 애플리케이션의 메모리 사용량을 더욱 자세히 분석할 수 있습니다. 

스냅샷을 저장한 후 비교하여 메모리 누수를 더욱 쉽게 찾거나, 메모리 레이아웃을 확인하여 메모리 단편화 문제를 찾을 수 있습니다. 

메모리 프로파일러 패키지에 대한 자세한 내용은 메모리 프로파일러 문서를 참조하십시오.

 

9. 물리 프로파일러 모듈

물리 프로파일러 모듈은 씬에서 물리 엔진이 처리한 물리에 대한 정보를 표시합니다. 

이 정보는 성능 문제나 씬의 물리와 관련된 예기치 못한 불일치를 진단 및 해결하는 데 유용할 수 있습니다. 

애플리케이션의 물리 디버깅에 대한 자세한 내용은 물리 디버그 시각화 문서를 참조하십시오.

 

그림. 물리 프로파일러 모듈

 

9.1 차트 카테고리 및 모듈 세부 정보 창

물리 프로파일러 모듈의 차트는 애플리케이션이 물리에 소비하는 시간을 추적합니다. 

타이밍은 7개 카테고리로 나뉩니다. 차트의 카테고리 순서를 변경하려면 차트 범례에 카테고리를 끌어다 놓으십시오. 

카테고리의 컬러 범례를 클릭하여 표시 여부를 토글할 수도 있습니다.

차트를 클릭하면 차트 아래의 모듈 세부 정보 창에서 각 차트 카테고리의 정확한 숫자 값을 확인할 수 있습니다.

 

차트

기능

Active Dynamic

활성 상태의 비 Kinematic Rigidbody 컴포넌트 수입니다. 활성 리지드바디는 휴면 상태가 아닙니다.

Active Kinematic

활성 상태의 Kinematic Rigidbody 컴포넌트 수입니다. 키네마틱 리지드바디는 프레임에서 MovePosition 또는 MoveRotation이 호출될 때 활성 상태이며, 다음 프레임에서도 계속 활성 상태를 유지합니다.
참고: Unity는 프레임당 여러 번 연결된 조인트가 있는 Kinematic Rigidbody 컴포넌트를 처리할 수 있으며, 이는 표시된 값에 기여합니다.

Static Colliders

게임 오브젝트 또는 부모 게임 오브젝트에 Rigidbody 컴포넌트가 연결되지 않은 게임 오브젝트의 Collider 컴포넌트 수입니다.
Rigidbody
컴포넌트가 있는 게임 오브젝트나 부모 게임 오브젝트의 Collider 컴포넌트는 정적 콜라이더로 집계되지 않습니다. 이런 콜라이더는 복합 콜라이더라고 하며, 바디의 여러 콜라이더를 Rigidbody 컴포넌트와 동일한 게임 오브젝트에 포함시키지 않고 편리한 방법으로 배열하는 데 유용합니다.

Rigidbody

컴포넌트의 휴면 상태에 관계없이 물리 엔진으로 처리된 Rigidbody 컴포넌트 수입니다.

Trigger Overlaps

오버래핑 트리거 수입니다(페어 수).

Active Constraints

물리 엔진이 처리한 기본 제약의 수입니다. 제약은 조인트의 빌딩 블록과 충돌 리스폰스로 사용됩니다. 예를 들어 ConfigurableJoint의 선형 또는 회전 자유도를 제한하려면 각 제한마다 기본 제약이 필요합니다.

Contacts

씬의 모든 콜라이더 간 총 접점 페어 수입니다. 트리거 오버랩 페어의 양도 포함됩니다. 접점은 서로 닿거나 겹쳐지는 콜라이더 페어입니다. 참고: Unity는 콜라이더 페어의 간격이 사용자가 설정할 수 있는 특정 제한보다 작아진 후에 콜라이더 페어마다 접점 페어를 생성하므로 아직 닿거나 겹쳐지지 않는 Rigidbody 컴포넌트에 대해서도 접점이 생성될 수 있습니다. 자세한 내용은 Collider.contactOffset  ContactPoint.separation 문서를 참조하십시오.

 

프로파일러에 표시되는 숫자는 씬에서 물리 컴포넌트가 있는 게임 오브젝트의 정확한 수와 일치하지 않을 수 있습니다.

이는 Unity가 일부 물리 컴포넌트에 영향을 미치는 다른 컴포넌트(예: 조인트 컴포넌트)에 따라 물리 컴포넌트를 다른 속도로 처리할 수 있기 때문입니다.

특정 물리 컴포넌트가 연결된 게임 오브젝트 수를 정확하게 계산하려면 FindObjectsOfType 함수를 사용해 커스텀 스크립트를 작성해야 합니다.

물리 프로파일러 모듈에는 휴면 상태인 Rigidbody 컴포넌트 수가 표시되지 않습니다. 

이런 컴포넌트는 물리 엔진과 상호작용하지 않으므로 프로파일러에서 처리되지 않습니다. 

휴면 상태인 Rigidbody 컴포넌트에 대한 자세한 내용은 리지드바디 문서를 참조하십시오.

9.2 물리 프로파일러를 사용하여 성능 문제 파악

물리 시뮬레이션은 메인 로직의 업데이트 루프와 다른 별도의 일정한 업데이트 주기로 실행되고 호출마다 Time.fixedDeltaTime을 통해서만 시간을 앞당길 수 있습니다.

이 차이는 Update와 FixedUpdate의 차이와 비슷합니다. 이에 대한 자세한 내용은 시간 창 문서를 참조하십시오.

시간이 오래 걸리는 무거운 로직 또는 그래픽스 프레임이 발생하면 프로파일러에서 물리 시뮬레이션을 프레임마다 여러 번 호출해야 합니다. 

따라서 이미 리소스를 많이 사용하는 프레임에 더욱 많은 시간과 리소스가 필요하기 때문에 물리 시뮬레이션이 프로젝트 설정 창(메뉴: Edit > Project Settings > Time)에서 설정할 수 있는 Maximum Allowed Timestep 값에 따라 일시적으로 중단될 수 있습니다.

프로젝트에서 이러한 상황을 감지하려면 CPU 사용 프로파일러 모듈을 선택하고 계층 구조 뷰의 Overview 섹션에서 Physics.Processing 또는 Physics.Simulate 에 대한 호출 수를 확인하십시오.

 

그림. Calls 열에 표시된 값이 1인 CPU 사용 프로파일러 

 

위 그림의 예에서 Calls 열의 값 1은 마지막 논리 프레임 중에 물리 시뮬레이션이 한 번 호출되었음을 나타냅니다.

호출 카운트가 10에 가까우면 문제가 있음을 의미합니다. 

문제를 해결하려면 먼저 물리 시뮬레이션 빈도를 줄이십시오. 문제가 계속되면 (물리 엔진이 게임 타임에 보조를 맞추기 위해) 많은 시뮬레이션 호출을 사용하기 직전에 무거운 프레임을 초래할 수 있는 원인을 확인해야 합니다. 

때로는 무거운 그래픽스 프레임으로 인해 나중에 씬에서 물리 시뮬레이션이 더 많이 호출될 수 있습니다.

씬의 물리 시뮬레이션에 대한 자세한 내용을 보려면 모듈 세부 정보 창의 상단에 있는 검색 상자를 선택하고 Physics.Processing을 검색한 후 창 오른쪽 상단의 드롭다운에서 Show Calls 를 선택하십시오.

그러면 씬을 업데이트하기 위해 실행되는 물리 엔진 작업의 이름이 표시됩니다.

가장 일반적인 두 가지 이름은 다음과 같습니다.

  • Pxs: ’PhysX solver’의 약어로, 조인트에 필요한 물리 엔진 작업입니다. 겹치는 리지드바디의 접촉을 확인하는 데도 필요합니다.
  • ScScene: 씬을 업데이트하고 넓은 페이즈와 좁은 페이즈를 실행하고 리지드바디를 통합(힘과 충격으로 인해 공간에서 바디 이동)하는 작업에 사용됩니다. 2 페이즈 충돌 검사 페이즈의 정의는 계획 알고리즘에 대한 Steven M. LaValle의 연구를 참조하십시오.


10. 2D 물리 프로파일러 모듈

2D 물리 프로파일러 모듈은 씬에서 물리 엔진이 처리한 2D 물리에 대한 정보를 표시합니다. 

이 정보는 성능 문제나 씬의 2D 물리와 관련된 예기치 못한 불일치를 진단 및 해결하는 데 유용할 수 있습니다.

 

그림. 2D 물리 프로파일러 모듈 

 

10.1 차트 카테고리

2D 물리 프로파일러 모듈의 차트는 9개 카테고리로 구성됩니다. 

차트의 카테고리 순서를 변경하려면 차트 범례에 카테고리를 끌어다 놓으십시오. 

카테고리의 컬러 범례를 클릭하여 표시 여부를 토글할 수도 있습니다.

 

차트

설명

Total Bodies

씬의 Rigidbody2D 수입니다.

Active Bodies

씬에 있는 총 활성 Rigidbody2D 수입니다.

Sleeping Bodies

씬에 있는 총 휴면 Rigidbody2D 수입니다.

Dynamic Bodies

씬에 있는 총 동적 Rigidbody2D 수입니다. 동적 Rigidbody2D는 상호작용이 가장 뛰어난 Rigidbody2D 타입입니다. 중력과 힘의 영향을 받으며 리소스를 매우 많이 소모합니다.

Kinematic Bodies

씬에 있는 총 키네마틱 Rigidbody2D 수입니다. 키네마틱 Rigidbody2D는 시뮬레이션에서 동작하도록 설계되었으며, 중력과 힘은 이 Rigidbody2D 타입에 영향을 미치지 않습니다. 스크립트를 사용하여 동작 방식을 제어해야 합니다.

Static Bodies

씬에 있는 총 정적 Rigidbody2D 수입니다. 정적 바디는 시뮬레이션에서 동작하지 않으며, 리소스를 가장 적게 소모하는 Rigidbody2D 타입입니다.

Contacts

총 접점 수입니다. 접점은 서로 닿거나 겹쳐지는 콜라이더 페어입니다. 겹쳐지는 접점을 해결하기 위해 물리 엔진은 임펄스를 적용하여 서로 닿아 있지만 겹쳐지지 않게 만듭니다.

Discrete Island Count

이산적 아일랜드의 총 수입니다. 물리 엔진은 접점을 아일랜드로 그룹화한 후 해결합니다. 접점 아일랜드는 서로 연결된 점점으로 구성되지만, 컷오프 역할을 하는 정적 Rigidbody2D를 통해 연결되지는 않습니다. 이산적 아일랜드는 불연속 충돌 검사 모드를 사용하는 Rigidbody2D로 이루어져 있습니다. 멀티 스레드 물리 옵션을 사용할 경우 접점 아일랜드가 너무 많아져 성능 저하를 유발할 수 있습니다. 이는 물리 엔진이 각 아일랜드를 잡으로 해결하기 때문입니다.

Continuous Island Count

총 연속 아일랜드 수입니다. 기본적으로 Discrete Island Count와 동일하지만연속 충돌 검사 모드를 사용하는 Rigidbody2D에만 적용된다는 점이 다릅니다.

 

10.2 모듈 세부 정보 창

2D 물리 프로파일러 모듈을 선택하면 그 아래에 있는 세부 정보 창에 선택한 프레임에서 애플리케이션이 2D 물리에 시간을 소비한 위치에 대한 분석이 표시됩니다. 

또한 이전 표에 나열된 차트 카테고리에 대한 상세한 분석 데이터 외에도 다음과 같은 추가 정보를 제공합니다.

 

Data

설명

Discrete Bodies

불연속 충돌 검사 모드를 사용하는 총 Rigidbody2D 수입니다.

Continuous Bodies

연속 충돌 검사 모드를 사용하는 총 Rigidbody2D 수입니다.

Joints

씬에 있는 Joint2D 수입니다.

Static Shapes

씬에 있는 정적 셰이프 수입니다. 셰이프는 2D 물리 엔진이 생성하는 기본 셰이프입니다. Collider2D는 단일 기본 셰이프 또는 여러 개의 기본 셰이프를 생성할 수 있습니다. Collider2D의 셰이프 수는 인스펙터에서 확인하거나 스크립트에서 Collider2D.shapeCount를 사용하여 알아볼 수 있습니다.
정적 셰이프는 정적 Rigidbody2D에 연결되어 있습니다. 정적 셰이프는 일반적으로 플랫폼 같은 움직이지 않는 물리 지오메트리에 사용됩니다.

Active Shapes

씬에 있는 활성 셰이프 수입니다. 활성 셰이프는 휴면 상태가 아닌 Rigidbody2D에 연결된 셰이프입니다. 정적 Rigidbody2D는 항상 휴면 상태이므로 정적 셰이프는 언제나 비활성 상태입니다.

Sleeping Shapes

씬에 있는 휴면 셰이프 수입니다. 휴면 셰이프는 휴면 상태의 Rigidbody2D에 연결되어 있습니다. , 활성 셰이프의 반대라고 생각하면 이해하기 쉽습니다.

 

11. 렌더링 프로파일러

 

렌더링 프로파일러에는 렌더링 통계가 표시됩니다. 타임라인에는 배치, SetPass 호출, 렌더링된 삼각형 및 버텍스의 숫자가 표시됩니다. 하단 창에는 GameView Rendering Statistics 창에 표시되는 통계와 유사한 추가 렌더링 통계가 표시됩니다.

12. UI 및 UI 세부 정보 프로파일러

UI 및 UI 세부 정보 프로파일러 모듈은 Unity가 애플리케이션 내에서 사용자 인터페이스를 배치하고 렌더링하는 데 소비하는 시간과 리소스에 대한 정보를 제공합니다. 

이 모듈을 사용하여 Unity가 오브젝트를 배칭하는 이유 및 방법을 비롯하여 Unity가 애플리케이션의 UI 배칭을 처리하는 방법을 이해할 수 있습니다. 

또한 성능 저하를 일으키는 UI 부분을 찾거나, 타임라인을 스크러빙하며 UI를 미리볼 수도 있습니다.

프로파일러 창을 사용하는 자세한 방법은 프로파일러 창 시작하기 문서를 참조하십시오.

그림. UI 및 UI 세부 정보 프로파일러 모듈

 

12.1 차트 카테고리

UI 및 UI 세부 정보 프로파일러 모듈의 차트는 5개 카테고리로 구성됩니다. 

차트의 카테고리 순서를 변경하려면 차트 범례에 카테고리를 끌어다 놓으십시오. 

카테고리의 컬러 범례를 클릭하여 표시 여부를 토글할 수도 있습니다.

 

차트

설명

UI 프로파일러 모듈

Layout

Unity UI의 레이아웃 패스를 수행하는 데 걸린 시간입니다. 여기에는 HorizontalLayoutGroup, VerticalLayoutGroup, GridLayoutGroup에서 수행한 계산이 포함됩니다.

Render

UI가 렌더링의 일부를 수행하는 데 소비한 시간입니다. 이는 그래픽스 기기로 직접 렌더링하거나 메인 렌더 대기열로 렌더링하는 비용입니다.

UI 세부 정보 프로파일 모듈

Batches

함께 배칭된 총 드로우 콜 수를 표시합니다.

Vertices

UI 섹션을 렌더링하는 데 사용되는 총 버텍스 수입니다.

Markers

사용자가 UI와 상호작용(: 버튼 클릭, 슬라이더 값 변경 등)할 때 Unity가 마커를 기록한 후 차트에 세로선과 레이블로 표시합니다.

 

12.2 모듈 세부 정보 창

UI 또는 UI 세부 정보 프로파일러 모듈을 선택하면 프로파일러 창 하단에 있는 모듈 세부 정보 창에 애플리케이션의 UI에 대한 자세한 정보가 표시됩니다. 

이를 사용하여 애플리케이션의 UI 오브젝트에 대한 프로파일링 정보를 살펴볼 수 있습니다. 

이 창은 다음과 같은 열로 나뉩니다.

 

설명

Object

프로파일링 시간 동안 애플리케이션이 사용한 UI 캔버스 리스트입니다. 행을 더블 클릭하면 씬에서 일치하는 오브젝트가 강조 표시됩니다.

Self Batch Count

Unity가 캔버스에 대해 생성한 배치 수입니다.

Cumulative Batch Count

Unity가 캔버스와 모든 중첩된 캔버스에 대해 생성한 배치 수입니다.

Self Vertex Count

이 캔버스가 렌더링하는 버텍스 수입니다.

Cumulative Vertex Count

이 캔버스와 중첩된 캔버스가 렌더링하는 버텍스 수입니다.

Batch Breaking Reason

Unity가 배치를 분할한 이유입니다. 때때로 Unity는 오브젝트를 함께 배칭할 수 없습니다. 일반적인 이유는 다음과 같습니다.
Not Coplanar With Canvas:
배칭 시 오브젝트의 사각 트랜스폼이 캔버스와 동일 평면상(회전 안 됨)에 있어야 합니다.
CanvasInjectionIndex: CanvasGroup
컴포넌트가 존재하고 새 배치를 강제 실행합니다(: 나머지의 상단에 콤보 상자의 드롭다운 리스트를 표시하는 경우).
Different Material Instance, Rect clipping, Texture
또는 A8TextureUsage: Unity는 동일한 머티리얼, 마스킹, 텍스처 및 텍스처 알파 채널 사용으로만 오브젝트를 배칭할 수 있습니다.

GameObject Count

이 배치에 속한 게임 오브젝트 수입니다.

GameObjects

배치의 게임 오브젝트 리스트입니다.

 

리스트에서 UI 오브젝트를 선택하면 해당 오브젝트의 미리보기가 창의 오른쪽에 나타납니다.

미리보기 위의 툴바에는 다음과 같은 옵션이 있습니다.

  • Detach: 이 버튼을 선택하면 별도 창에 UI 캔버스가 열립니다. 창을 다시 연결하려면 UI 캔버스를 닫으십시오.
  • Preview background: 드롭다운을 사용하여 미리보기 배경의 컬러를 변경합니다. Checkerboard, Black 또는 White 중에서 선택할 수 있습니다. UI에 매우 밝거나 어두운 컬러 체계가 있는 경우에 유용합니다.
  • Preview type: 드롭다운을 사용하여 Standard, Overdraw, Composite Overdraw 중에서 선택할 수 있습니다.

 

13. 비디오 프로파일러 모듈

비디오 프로파일러 모듈은 애플리케이션의 비디오가 사용 중인 리소스(예: 메모리, 버퍼링, 비디오 클립 수)에 대한 정보를 표시합니다. 

이 정보를 사용하면 애플리케이션이 선택한 플랫폼에서 비디오를 얼마나 효율적으로 재생하고 버퍼링하는지 확인할 수 있습니다. 

또한 CPU 사용 프로파일러 모듈을 사용하여 Unity가 비디오에 시간을 소비하는 위치를 확인할 수 있습니다. 

자세한 내용은 CPU 사용 프로파일러 모듈 문서를 참조하십시오.

 

그림. 비디오 프로파일러 모듈 

13.1 차트 카테고리

비디오 프로파일러 모듈의 차트는 4개 카테고리로 구성됩니다.

차트의 카테고리 순서를 변경하려면 차트 범례에 카테고리를 끌어다 놓으십시오.

카테고리의 컬러 범례를 클릭하여 표시 여부를 토글할 수도 있습니다.

프로파일러 창을 사용하는 자세한 방법은 프로파일러 창 시작하기 문서를 참조하십시오.

 

차트

설명

Total Video Sources

씬에 있는 총 비디오 소스 수입니다.

Playing Video Sources

씬에서 재생 중인 비디오 소스 수입니다.

Pre-buffered frames

미리 버퍼링된 총 프레임 수입니다.

Total Video Memory

애플리케이션의 비디오가 사용 중인 시스템 메모리 양입니다.

 

13.2 모듈 세부 정보 창

비디오 프로파일러 모듈에서 프레임을 선택하면 프로파일러 창 하단의 모듈 세부 정보 창에 씬의 동영상 재생에 대한 추가 정보가 표시됩니다. 

다음과 같은 정보를 이용할 수 있습니다.

 

Detail

설명

Total Video Sources

씬에 있는 비디오 소스 수입니다.

Playing Video Sources

씬에서 재생 중인 비디오 소스 수입니다.

Paused Video Sources

일시정지된 비디오 소스 수입니다.

Software Video Playback

플랫폼에서 기본적으로 지원하지 않는 비디오 수입니다.

Pre-buffered frames

미리 버퍼링된 총 프레임 수입니다.

Pre-buffered frame limit

사전 버퍼링된 프레임 한도입니다. Unity는 클립당 최대 16프레임을 버퍼링합니다.

Total frames dropped

실시간 유지를 위해 Unity가 건너 뛰어야 하는 프레임 수입니다. 이 문제는 애플리케이션이 느리게 실행되어 실시간으로 재생할 수 있을 만큼 프레임을 빠르게 생성할 수 없는 경우에 발생할 수 있습니다.

Video Clip Count

씬에 있는 비디오 클립 수입니다.

Total Video Memory

애플리케이션의 비디오가 사용 중인 시스템 메모리 양입니다.

 

728x90
반응형