iOS 관련 최적화
빌드한 iOS 플레이어 크기 최적화

빌트인 프로파일러로 성능 측정

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 활동

프로퍼티: 기능:
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 엔진에 의해 자동으로 배칭된 드로우 호출, 삼각형, 버텍스의 수입니다. 이 수를 드로우 호출 및 삼각형 합계와 비교하면 씬이 배칭에 얼마나 잘 준비되어 있는지 대강 알 수 있습니다. 배칭을 개선하려면 오브젝트 간에 최대한 많은 머티리얼을 공유해야 합니다.

상세 Unity 플레이어 통계

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 프레임 동안 발생한 모든 가비지 컬렉션 패스의 총 시간(밀리초 단위)입니다.

설정(Configuration)

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에서 활성화하려면 Player 창(Edit > Project Settings 로 이동한 다음 Player 카테고리 선택)에서 Enable Internal Profiler (지원 중단 예정) 체크박스를 클릭합니다. 빌드할 때 Build Settings 에서 Development Build 가 선택되어 있는지 확인합니다. 그러면 기기에서 실행될 때 통계가 로그캣에 표시됩니다. 로그캣을 보려면 adb 또는 Android Debug Bridge가 필요합니다. ADB가 있으면 adb logcat 셸 커맨드를 실행하면 됩니다.

  • 2018–06–14 Page amended
iOS 관련 최적화
빌드한 iOS 플레이어 크기 최적화