코드에 프로파일러 마커를 추가하여 ProfilerMarker.Begin, ProfilerMarker.End 또는 ProfilerMarker.Auto가 생성하는 샘플을 프로파일러 창에 있는 CPU Usage 모듈의 Timeline View 및 계층 구조 뷰에서 확인할 수 있습니다.
*
일부 예시에서는 Profiling Core 패키지를 사용하므로 시작하기 전에 설치해야 합니다. Unity Profiling Core 패키지는 코어 패키지이므로 패키지 관리자 UI에서 검색할 수 없습니다. 패키지를 설치하려면 다음 중 하나를 수행합니다.
com.unity.profiling.core).
ProfilerMarker API를 사용하려면 ProfilerMarker.Begin 및 ProfilerMarker.End 호출 사이에 프로파일링할 코드를 넣으십시오. 예시:
using UnityEngine;
using Unity.Profiling;
public class ProfilerMarkerExample
{
static readonly ProfilerMarker k_MyCodeMarker = new ProfilerMarker("My Code");
void Update() {
k_MyCodeMarker.Begin();
Debug.Log("This code is being profiled");
k_MyCodeMarker.End();
}
}
참고: 프로파일러 마커의 이름에 / 문자를 넣지 마십시오. 프로파일러 창이 CPU Profiler 모듈의 차트 뷰에서 마커를 하이라이트할 수 없게 됩니다.
End가 호출되기 전에 Begin 및 End 호출 사이의 코드가 범위를 벗어나지 않게 하십시오. End가 호출되기 전에 코드가 범위를 벗어나면 콘솔에 오류 메시지가 기록됩니다. 모든 반환 이전에 End를 호출하지 않도록, Auto를 사용해 샘플이 범위를 벗어나면 자동으로 종료되도록 하십시오. 자세한 내용은 이 기술 자료의 프로파일러 마커 코드 블록 자동으로 닫기 섹션을 참조하십시오.
Unity는 프로파일링된 코드 블록의 실행 시간을 프로파일러에 기록하고 보고하며 CPU Profiler 모듈에 표시하므로 세부 프로파일링을 사용하지 않아도 됩니다. 해당 정보는 CPU Profiler 모듈의 계층 구조 뷰에 새 항목으로 표시됩니다.
ProfilerMarker.Auto를 사용하여 코드 블록 끝에서 ProfilerMarker.End가 자동으로 호출되도록 합니다. 다음 호출은 동일한 동작을 수행합니다.
using Unity.Profiling;
public class MySystemClass
{
static readonly ProfilerMarker k_UpdatePerfMarker = new ProfilerMarker("MySystem.Update");
public void Update()
{
k_UpdatePerfMarker.Begin();
// ...
k_UpdatePerfMarker.End();
using (k_UpdatePerfMarker.Auto())
{
// ...
}
}
}
Begin() 및 End() 호출과는 달리 Unity는 비개발(릴리스) 빌드에서 ProfilerMarker.Auto 호출을 컴파일할 수 없습니다. 그러나 null을 반환하며 이는 최소한의 오버헤드만 발생시킵니다.
ProfilerMarker.Auto를 using var과 함께 사용할 수도 있으며 현재 범위가 종료되면 End 호출이 자동으로 수행됩니다. 이 방식은 코드에 ProfilerMarker 인스턴스를 추가할 때 변경해야 하는 코드의 양을 최소화합니다.
using Unity.Profiling;
public class MySystemClass
{
static readonly ProfilerMarker k_UpdatePerfMarker = new ProfilerMarker("MySystem.Update");
public void Update()
{
using var _ = k_UpdatePerfMarker.Auto();
// ...
}
}
참고: ProfilerMarker로 표시된 영역 내의 모든 비동기 await와 모든 yield 호출은 지원되지 않으며 Auto를 사용하더라도 콘솔에 오류 메시지가 기록됩니다.
코드가 장시간 실행되는 특정 조건을 밝히기 위해 코드 샘플에 관련 정보를 추가해야 할 수 있을 것입니다.
예를 들어 시스템이 여러 오브젝트의 시뮬레이션을 수행할 경우 프로파일러 샘플로 오브젝트 수를 전달할 수 있습니다. 프로파일러가 긴 샘플 길이와 함께 비정상적인 숫자를 반환한다면, 시뮬레이션을 위해 다른 스레드를 사용하거나, CPU 작업을 여러 프레임으로 분할(타임슬라이싱)하거나, 애플리케이션 설계를 조정하여 프레임 저하를 방지해야 할 수 있습니다.
ProfilerMarker는 최대 3개의 숫자 파라미터(ProfilerMarker<TP1>, ProfilerMarker<TP1, TP2>, ProfilerMarker<TP1, TP2, TP3>)를 지원합니다.
using Unity.Profiling;
public class MySystemClass
{
static readonly ProfilerMarker<int> k_PreparePerfMarker = new ProfilerMarker<int>("MySystem.Prepare", "Objects Count");
static readonly ProfilerMarker<float> k_SimulatePerfMarker = new ProfilerMarker<float>(ProfilerCategory.Scripts, "MySystem.Simulate", "Objects Density");
public void Update(int objectsCount)
{
k_PreparePerfMarker.Begin(objectsCount);
// ...
k_PreparePerfMarker.End();
using (k_SimulatePerfMarker.Auto(objectsCount * 1.0f))
{
// ...
}
}
}
ProfilerMarker API에서는 프로파일러 마커에 문자열 파라미터를 추가할 수 있습니다. 문자열 파라미터는 애플리케이션이 레벨 또는 데이터 파일을 로드할 때 해당 레벨 또는 파일의 이름을 표시하려는 경우에 유용합니다. ProfilerMarkerExtension 메서드를 사용하여 문자열 파라미터를 프로파일러 샘플과 함께 전달합니다.
using Unity.Profiling;
public class MySystemClass
{
static readonly ProfilerMarker k_PreparePerfMarker = new ProfilerMarker("MySystem.Prepare");
public void Prepare(string path)
{
k_PreparePerfMarker.Begin(path);
// ...
k_PreparePerfMarker.End();
}
}