Unity 프로파일러에서 커스텀 지표를 표시하려면 Unity Profiling Core 패키지의 ProfilerCounter API를 사용해야 합니다.
프로파일링 코어 API를 사용하여 애플리케이션의 지표를 추적할 수 있습니다. 카운터가 Unity 프로파일러에서 추적하는 정보를 표시할 수 있습니다. 커스텀 프로파일러 카운터를 사용하여 시스템 지표를 비교하고 프로파일러 창의 성능 문제를 식별합니다.
커스텀 프로파일러 카운터는 ProfilerCounter
또는 ProfilerCounterValue
의 데이터를 표시할 수 있습니다.
Unity 프로파일링 코어 API를 사용하여 프로파일러 카운터를 생성하는 데 대한 상세한 가이드는 프로파일러 카운터 API 가이드를 참조하십시오.
프로파일러 카운터를 추가하려면 다음을 수행하는 스크립트를 생성합니다.
이 섹션의 코드 예시는 프로파일러 카운터를 추가하여 Unity가 게임 오브젝트 트레일 효과의 모든 인스턴스에 대해 생성한 전체 파티클 수를 추적합니다. 이런 예시에서 게임 오브젝트의 이름은 “Tank”입니다.
새로운 카운터를 생성하려면 새로운 카운터 값의 타입을 정의하는 스크립트를 작성하고 이 타입에 이름과 단위를 할당합니다.
카운터를 생성할 때 반드시 새로운 카운터가 속하는 프로파일러 카테고리를 지정해야 합니다. 카테고리를 지정하기 위해 기존의 Unity 카테고리를 사용합니다. 예를 들어 아래의 스크립트 예시는 기존의 ProfilerCategory.Scripts
카테고리를 사용합니다. 자세한 내용은 프로파일러 카테고리 사용을 참조하십시오.
다음의 예시 스크립트는 “Tank Trail Particles”라는 이름으로 ProfilerCounterValue TankTrailParticleCount
를 정의합니다. 이 카운터에는 다음과 같이 “Count”의 단위가 있습니다.
public static class GameStats
{
public static readonly ProfilerCategory TanksCategory = ProfilerCategory.Scripts;
public const string TankTrailParticleCountName = "Tank Trail Particles";
public static readonly ProfilerCounterValue<int> TankTrailParticleCount =
new ProfilerCounterValue<int>(TanksCategory, TankTrailParticleCountName, ProfilerMarkerDataUnit.Count,
ProfilerCounterOptions.FlushOnEndOfFrame | ProfilerCounterOptions.ResetToZeroOnFlush);
}
옵션인 FlushOnEndOfFrame
과 ResetToZeroOnFlush
는 해당 카운터를 자동으로 프로파일러 데이터 스트림으로 보내고 카운터 값을 프레임 종료 시 0으로 초기화합니다.
Unity는 프로파일러 카운터를 카운터 프로파일 작업 타입(예: 렌더링, 스크립팅, 애니메이션)을 기준으로 하는 카테고리로 그룹을 짓습니다. 커스텀 프로파일러 카운터를 Unity의 어느 프로파일링 카테고리에나 할당할 수 있습니다. 사용 가능한 프로파일러 카테고리의 전체 리스트는 ProfilerCategory를 참조하십시오.
프로파일러 카운터는 반드시 프로파일러 카테고리에 속해야 합니다. 카테고리는 카운터를 정의할 때 프로파일러 카운터에 할당해야 합니다. 이렇게 할당하려면 ProfilerModule의 선택적 autoEnabledCategoryNames
생성자 인자를 사용하여 둘 이상의 카테고리를 프로파일러 카운터에 할당합니다. 다음의 예시 코드에 이 메서드에 대한 예시가 있습니다.
using Unity.Profiling;
using Unity.Profiling.Editor;
[System.Serializable]
[ProfilerModuleMetadata("Tank Effects")]
public class TankEffectsProfilerModule : ProfilerModule
{
static readonly ProfilerCounterDescriptor[] k_Counters = new ProfilerCounterDescriptor[]
{
new ProfilerCounterDescriptor(GameStatistics.TankTrailParticleCountName, GameStatistics.TanksCategory),
new ProfilerCounterDescriptor(GameStatistics.ShellExplosionParticleCountName, GameStatistics.TanksCategory),
new ProfilerCounterDescriptor(GameStatistics.TankExplosionParticleCountName, GameStatistics.TanksCategory),
};
// Ensure that both ProfilerCategory.Scripts and ProfilerCategory.Memory categories are enabled when our module is active.
static readonly string[] k_AutoEnabledCategoryNames = new string[]
{
ProfilerCategory.Scripts.Name,
ProfilerCategory.Memory.Name
};
// Pass the auto-enabled category names to the base constructor.
public TankEffectsProfilerModule() : base(k_Counters, autoEnabledCategoryNames: k_AutoEnabledCategoryNames) { }
}
카운터 값을 업데이트하려면 정의한 카운터 값을 설정하는 MonoBehaviour 스크립트를 생성합니다. 자세한 내용은 카운터 값을 프로파일러에 전달하는 방법을 참조하십시오.
이 예시 MonoBehaviour 스크립트는 업데이트 함수의 모든 프레임마다 할당된 게임 오브젝트에 속하는 트레일 파티클의 수를 계산합니다. 이 계산을 수행하려면 TankTrailParticleCount
라는 카운터를 사용합니다.
다음 예시 스크립트는 또한 인스펙터에 있는 Trail Particle System (m_TrailParticleSystem
)이라는 공용 프로퍼티를 생성합니다.
using UnityEngine;
class TankMovement : MonoBehaviour
{
public ParticleSystem m_TrailParticleSystem;
void Update()
{
GameStats.TankTrailParticleCount.Value += m_TrailParticleSystem.particleCount;
}
}
릴리스 플레이어에서 프로젝트를 실행하면 프로파일러 창에 액세스할 수 없습니다. 하지만 카운터를 릴리스 플레이어에서 UI 요소로 표시할 수 있습니다. 즉 릴리스된 애플리케이션에 프로파일링 툴을 포함시킬 수 있습니다. 이렇게 하려면 프로파일러 카운터 API 가이드에 있는 Getting counter values in players를 참조하십시오.
다음은 릴리스 플레이어에 있는 커스텀 UI를 사용하여 씬의 왼쪽 상단에 카운터를 표시한 이미지입니다.