Unity FrameTimingManager 사용 가이드
이 문서는 Unity의 FrameTimingManager에 대한 설명과 활용 방법을 안내합니다. FrameTimingManager는 애플리케이션의 프레임 성능을 분석하고 최적화하는 데 유용한 도구입니다.
1. FrameTimingManager란?
FrameTimingManager는 애플리케이션의 각 프레임에 대한 성능 데이터를 캡처하는 API입니다. 이 정보를 사용하여 애플리케이션이 성능 목표에 도달하지 못하는 이유를 파악할 수 있습니다. 주로 다음과 같은 상황에서 유용합니다:
- 프레임별로 디버깅이 필요한 경우
- 동적 해상도 기능을 사용하려는 경우
- Adaptive Performance 패키지를 사용하려는 경우
중요: FrameTimingManager는 프로파일러 데이터를 대체하지 않으며, 고수준 프로파일링 후에 사용해야 합니다.
2. FrameTimingManager 활성화 방법
FrameTimingManager를 활성화하려면 다음 단계를 따르세요:
- Edit > Project Settings > Player로 이동합니다.
- Other Settings에서 Rendering 섹션을 찾습니다.
- Frame Timing Stats 프로퍼티를 활성화합니다.
OpenGL 플랫폼을 사용하는 경우, GPU 사용량 측정을 위해 추가로 OpenGL:Profiler GPU Recorders 프로퍼티를 활성화해야 합니다.
3. FrameTimingManager 사용 방법
FrameTimingManager가 기록하는 데이터에 접근하려면 다음 방법 중 하나를 사용할 수 있습니다:
- Custom Profiler 모듈에서 프레임 타임 데이터 확인
- FrameTimingManager C# API의 타임스탬프 데이터 검색
- 특정 프로파일러 카운터를 통해 데이터 기록
3.1 Custom Profiler 모듈 생성
- Custom Profiler 모듈을 생성합니다.
- Profiler Module Editor 창에서 커스텀 모듈을 선택합니다.
- Available Counters 패널에서 Unity를 선택하고, Render를 선택하여 관련 카운터를 클릭하여 추가합니다.
사용 가능한 카운터 설명
측정 | 설명 |
---|---|
총 CPU 프레임 시간(ms) | 총 CPU가 소비한 프레임 시간. |
CPU 메인 스레드 프레임 시간(ms) | 메인 스레드가 해당 프레임 중 수행한 작업의 시간. |
CPU 렌더 스레드 프레임 시간(ms) | 렌더 스레드가 시작된 시점부터 Present() 호출까지의 시간. |
GPU 프레임 시간(ms) | GPU가 하나의 프레임을 렌더링하는 데 소요된 시간. |
3.2 FrameTimingManager C# API 사용
타임스탬프 정보는 FrameTimingManager API를 통해 접근할 수 있으며, 다음과 같은 속성을 통해 정보를 얻습니다:
프로퍼티 | 설명 |
---|---|
frameStartTimestamp | 프레임이 시작되는 CPU 클럭 시간. |
firstSubmitTimestamp | GPU에 첫 번째 작업을 제출하는 CPU 클럭 시간. |
cpuTimePresentCalled | Present() 호출 시점의 CPU 클럭 시간. |
cpuTimeFrameComplete | GPU가 프레임 렌더링을 완료하고 CPU를 중단하는 시점의 클럭 시간. |
3.3 ProfilerRecorder API 활용
ProfilerRecorder API를 사용하면 필요한 카운터에 레코더를 연결하여 데이터를 간단하게 기록할 수 있습니다. 예를 들어, 메인 스레드의 프레임 타임을 추적하는 방법은 다음과 같습니다:
using Unity.Profiling;
using UnityEngine;
public class ExampleScript : MonoBehaviour
{
string statsText;
ProfilerRecorder mainThreadTimeRecorder;
void OnEnable()
{
mainThreadTimeRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Internal, "CPU Main Thread Frame Time");
}
void OnDisable()
{
mainThreadTimeRecorder.Dispose();
}
void Update()
{
var frameTime = mainThreadTimeRecorder.LastValue;
// Your code logic here
}
}
4. FrameTimingManager 동작 원리
FrameTimingManager는 4 프레임의 지연을 통해 성능 데이터를 제공합니다. GPU의 리소스 상태에 따라 정확한 타이밍 결과를 보장할 수 없는 경우가 있습니다. 다양한 GPU 및 메탈 아키텍처에 따라 발생할 수 있는 조건에 대해서도 이해해야 합니다.
플랫폼 | 지원 여부 | 비고 |
---|---|---|
Windows | DirectX 11, 12, OpenGL, Vulkan 지원 | |
macOS | Metal 지원 | 타일 기반 디퍼드 렌더링의 GPU 시간 부정확성 가능성 |
Linux | OpenGL 지원 | 부분적 GPU 시간 측정 지원 |
Android | OpenGL ES, Vulkan 지원 | |
iOS | Metal 지원 | 타일 기반 디퍼드 렌더링의 GPU 시간 부정확성 가능성 |
tvOS | Metal 지원 | 타일 기반 디퍼드 렌더링의 GPU 시간 부정확성 가능성 |
WebGL | 부분적 GPU 시간 측정 지원 |
5. 추가 리소스
이 가이드를 통해 FrameTimingManager를 효과적으로 활용하여 애플리케이션의 성능을 최적화할 수 있기를 바랍니다.