Unity iOS 및 Android에는 프로파일러가 내장되어 있습니다. 빌트인 프로파일러는 기기에서 실행 중인 게임에서 콘솔 메시지를 내보냅니다. 이 메시지는 30초마다 작성되고 게임 실행 상태에 대한 심층 정보를 제공합니다. 이 메시지의 의미가 쉽게 이해되지 않는 경우도 있지만, 적어도 게임이 CPU 또는 GPU 중 무엇을 더 많이 사용하고 CPU를 더 많이 사용하는 경우 속도 저하 요인이 스크립트 코드인지 Mono 가비지 컬렉션인지 간단하게 판단할 수는 있습니다. 빌트인 프로파일러 설정 방법에 대해서는 이 페이지의 후반부를 참조하십시오.
다음은 빌트인 프로파일러에서 출력되는 정보의 예제입니다.
iPhone/iPad Unity internal profiler stats:
cpu-player> min: 9.8 max: 24.0 avg: 16.3
cpu-ogles-drv> min: 1.8 max: 8.2 avg: 4.3
cpu-waits-gpu> min: 0.8 max: 1.2 avg: 0.9
cpu-present> min: 1.2 max: 3.9 avg: 1.6
frametime> min: 31.9 max: 37.8 avg: 34.1
draw-call #> min: 4 max: 9 avg: 6 | batched: 10
tris #> min: 3590 max: 4561 avg: 3871 | batched: 3572
verts #> min: 1940 max: 2487 avg: 2104 | batched: 1900
player-detail> physx: 1.2 animation: 1.2 culling: 0.5 skinning: 0.0 batching: 0.2 render: 12.0 fixed-update-count: 1 .. 2
mono-scripts> update: 0.5 fixedUpdate: 0.0 coroutines: 0.0
mono-memory> used heap: 233472 allocated heap: 548864 max number of collections: 1 collection total duration: 5.7
모든 시간은 프레임당 밀리초 단위로 측정됩니다. 최근 30 프레임에 걸친 최소, 최대, 평균 시간을 볼 수 있습니다.
cpu-player | 게임이 Unity 엔진 안에서 코드를 실행하고 CPU에서 스크립트를 실행하는 데 소비하는 시간을 표시합니다. |
cpu-ogles-drv | CPU에서 OpenGL ES 드라이버 코드를 실행하는 데 소요되는 시간을 표시합니다. 드로우 콜 수, 내부 렌더링 상태 변경 수, 렌더링 파이프라인 설정 및 처리된 버텍스 수를 비롯한 여러 요인이 드라이버 통계에 영향을 미칠 수 있습니다. |
cpu-waits-gpu | GPU가 렌더링을 마치기를 기다리는 동안 CPU가 유휴 상태인 시간을 표시합니다. 23ms를 초과하면 애플리케이션이 필레이트/GPU 프로세싱 위주입니다. 값이 너무 작으면 프로필에서 이 값을 표시하지 않고 건너뜁니다. |
msaa-resolve | 안티앨리어싱을 적용하는 데 소요된 시간입니다. |
cpu-present | OpenGL ES의 presentRenderbuffer 커맨드를 실행하는 데 소요된 시간입니다. |
frametime | 게임 프레임의 전체 시간을 나타냅니다. iOS 하드웨어는 주사율이 항상 60Hz로 고정되므로, 항상 16.7ms(1,000ms/60Hz = 16.7ms)의 배수가 표시됩니다. |
tris # | 렌더링하기 위해 전송된 총 삼각형 수입니다. |
verts # | 렌더링하기 위해 전송된 총 버텍스 수입니다. 정적 지오메트리만 사용하는 경우 숫자를 10,000 이하로 유지해야 하지만, 스킨된 지오메트리가 많은 경우 훨씬 더 낮게 유지해야 합니다. |
batched | 엔진에 의해 자동으로 배칭된 드로우 호출, 삼각형, 버텍스의 수입니다. 이 수를 드로우 호출 및 삼각형 합계와 비교하면 씬이 배칭에 얼마나 잘 준비되어 있는지 대강 알 수 있습니다. 배칭을 개선하려면 오브젝트 간에 최대한 많은 머티리얼을 공유해야 합니다. |
player-detail 섹션에서 엔진 내부 동작에 대한 상세 내역을 확인할 수 있습니다.
physx | 물리 연산에 소요된 시간입니다. |
animation | 뼈대 애니메이션에 소요된 시간입니다. |
culling | 카메라 절두체 밖에 있는 오브젝트를 컬링하는 데 소요된 시간입니다. |
skinning | 스킨드 메시에 애니메이션을 적용하는 데 소요된 시간입니다. |
batching | 지오메트리 배칭에 소요된 시간입니다. 동적 지오메트리 배칭은 정적 지오메트리 배칭보다 리소스가 훨씬 더 많이 듭니다. |
render | 가시적인 오브젝트를 렌더링하는 데 소요된 시간입니다. |
fixed-update-count | 프레임 중에 실행된 최소 및 최대 FixedUpdate 수입니다. FixedUpdate가 너무 많으면 성능이 크게 저하됩니다. |
mono-scripts 섹션에서는 Mono 런타임에서 코드를 실행하는 데 소요된 시간에 대한 상세 내역을 확인할 수 있습니다.
update | 스크립트의 모든 Update() 함수를 실행하는 데 소요된 전체 시간입니다. |
fixedUpdate | 스크립트의 모든 FixedUpdate() 함수를 실행하는 데 소요된 전체 시간입니다. |
coroutines | 스크립트 코루틴 안에서 소비한 시간입니다. |
mono-memory 섹션에서는 Mono 가비지 컬렉터가 메모리를 관리하는 방법에 대한 정보를 확인할 수 있습니다.
allocated heap | 할당할 수 있는 총 메모리 용량입니다. 힙에 남아 있는 메모리가 할당할 용량에 비해 부족할 경우 가비지 컬렉션이 시작됩니다. 컬렉션 후에도 사용 가능한 메모리가 부족하면 할당된 힙의 크기가 커집니다. |
used heap | allocated heap 에서 오브젝트가 현재 사용 중인 비율입니다. 이 수는 다음 가비지 컬렉션까지 새 클래스 인스턴스(구조체 아님)를 만들 때마다 커집니다. |
max number of collections | 지난 30 프레임 동안의 가비지 컬렉션 패스 횟수입니다. |
collection total duration | 지난 30 프레임 동안 발생한 모든 가비지 컬렉션 패스의 총 시간(밀리초 단위)입니다. |
iOS에서는 기본적으로 비활성화되어 있습니다. 활성화하려면 Unity에서 생성된 XCode 프로젝트를 열어 InternalProfiler.h
파일을 선택하고 다음 줄을
#define ENABLE_INTERNAL_PROFILER 0
다음과 같이 변경합니다.
#define ENABLE_INTERNAL_PROFILER 1
XCode 메뉴에서 View > Debug Area > Activate Console 을 선택하여 출력 콘솔(GDB)를 표시한 다음 프로젝트를 실행합니다. Unity는 통계를 콘솔 창에 30프레임마다 출력합니다.
Android에서 활성화하려면 PlayerSettings에서 Enable Internal Profiler 체크박스를 선택합니다(Edit > Project Settings > Player). 빌드할 때 Player Settings 에서 Development Build 가 선택되어 있는지 확인합니다. 그러면 디바이스에서 실행될 때 통계가 logcat에 표시됩니다. logcat을 보려면 adb, 즉 Android Debug Bridge가 필요합니다. adb가 있으면 간단히 adb logcat 셸 명령을 실행합니다.