Version: 2019.1
프로파일러 창
렌더링 프로파일러

CPU 사용 프로파일러

CPU 사용 프로파일러는 게임의 어느 부분에 시간이 소요되었는지 표시합니다. 프로파일러를 선택하면 선택된 프레임의 계층적 시간 데이터가 하단 창에 표시됩니다. 프로파일러 타임라인에 대한 자세한 내용은 프로파일러 창 문서를 참조하십시오.

  • Hierarchy 모드: 계층적 시간 데이터를 표시합니다.
  • Group Hierarchy mode: 시간 데이터를 논리적인 그룹(렌더링, 물리, 스크립트 등)으로 그룹화합니다. 그룹의 자식이 다른 그룹에도 있을 수 있으므로(예를 들어 일부 스크립트는 렌더링 함수도 호출할 수 있음) 그룹 시간 백분율을 모두 더하면 100%를 넘는 경우가 많습니다.

차트 레이블을 위 아래로 드래그하여 CPU 차트 스택 순서를 변경할 수 있습니다.

개별 항목 선택

하단 창에서 항목을 선택하면 CPU 차트에 항목의 기여도가 강조 표시되고 나머지 항목이 어둡게 표시됩니다. 항목을 다시 클릭하면 선택 해제됩니다.

Render.OpaqueGeometry가 선택되고 기여도가 차트에 강조 표시된 그림
Render.OpaqueGeometry가 선택되고 기여도가 차트에 강조 표시된 그림

계층적 시간 데이터에서 Self 열에는 특정 함수에 소요된 시간이 표시되고 하위 함수 호출에 소요된 시간은 포함되지 않습니다. 위 스크린샷에서 Camera.Render 함수에 소요된 시간은 1.9%입니다. 이 함수는 이 프레임에서 작업을 수행하지 않고 다양한 드로우 및 컬링 함수를 호출합니다. 이런 함수를 모두 제외하면 Camera.Render 함수 자체에 소요된 시간은 0.4%에 불과합니다.

Time msSelf ms 열에는 위와 동일한 정보가 밀리초 단위로 표시됩니다. Camera.Render에는 0.06ms가 소요되지만 호출된 함수를 모두 포함하면 0.31ms가 소요됩니다. GC Alloc 열에는 나중에 가비지 컬렉터에 의해 수집되는 현재 프레임에 할당된 메모리 용량이 표시됩니다. 가비지 컬렉터로 인해 프레임 속도 문제가 발생하지 않도록 하려면 이 값을 영(0)으로 유지해야 합니다.

CPU 프로파일러의 Others 섹션에는 렌더링, 스크립트, 물리, 가비지 컬렉션 또는 Vsync에 해당하지 않는 모든 영역의 합계가 기록됩니다. 여기에는 애니메이션, AI, 오디오, 파티클, 네트워킹, 로딩 및 PlayerLoop가 포함됩니다.

물리 마커

아래에서는 다양한 하이 레벨 물리 프로파일러 마커의 의미를 간략하게 설명합니다.

  • Physics.Simulate: FixedUpdate에서 호출됩니다. 물리 엔진(PhysX)에 시뮬레이션 실행을 지시하여 현재 물리 상태를 업데이트합니다.
  • Physics.Processing: FixedUpdate에서 호출됩니다. 여기서 천이 아닌 물리 작업이 모두 처리됩니다. 이 마커를 확장하면 물리 엔진 내부에서 수행 중인 작업의 로우 레벨 세부 정보가 표시됩니다.
  • Physics.ProcessingCloth: FixedUpdate에서 호출됩니다. 여기서 천 물리 작업이 모두 처리됩니다. 이 마커를 확장하면 물리 엔진 내부에서 수행 중인 작업의 로우 레벨 세부 정보가 표시됩니다.
  • Physics.FetchResults: FixedUpdate에서 호출됩니다. 여기서 물리 시뮬레이션 결과가 물리 엔진으로부터 수집됩니다.
  • Physics.UpdateBodies: FixedUpdate에서 호출됩니다. 여기서 모든 물리 바디의 포지션 및 회전이 업데이트되고 해당 업데이트를 알리는 메시지가 전송됩니다.
  • Physics.ProcessReports: FixedUpdate에서 호출됩니다. 이 스테이지는 FixedUpdate 업데이트가 완료된 후에 실행되고, 시뮬레이션 결과에 대응하는 다양한 스테이지가 모두 처리되는 위치입니다. 여기서 접점, 조인트 브레이크 및 트리거가 업데이트되고 관련 메시지가 전송됩니다. 다음과 같은 개별 하위 스테이지가 4개 있습니다.
    • Physics.TriggerEnterExits: FixedUpdate에서 호출됩니다. 여기서 OnTriggerEnterOnTriggerExit 이벤트가 처리됩니다.
    • Physics.TriggerStays: FixedUpdate에서 호출됩니다. 여기서 OnTriggerStay 이벤트가 처리됩니다.
    • Physics.Contacts: FixedUpdate에서 호출됩니다. 여기서 OnCollisionEnter, OnCollisionExitOnCollisionStay 이벤트가 처리됩니다.
    • Physics.JointBreaks: FixedUpdate에서 호출됩니다. 여기서 조인트 브레이크와 관련된 업데이트 및 메시지가 처리됩니다.
  • Physics.UpdateCloth: Update에서 호출됩니다. 여기서 천과 천의 스킨드 메시와 관련된 업데이트가 수행됩니다.
  • Physics.Interpolation: Update에서 호출됩니다. 이 스테이지에서 모든 물리 오브젝트 포지션 및 회전 보간을 처리합니다.

성능 경고

CPU 프로파일러가 감지하여 경고할 수 있는 일반적인 성능 문제가 몇 가지 있습니다. 이런 경고는 CPU Usage 를 볼 때 하단 창의 Warning 열에 표시됩니다.

정적 콜라이더가 이동했음을 알리는 프로파일러 경고
정적 콜라이더가 이동했음을 알리는 프로파일러 경고

프로파일러에서 감지할 수 있는 구체적인 문제는 다음과 같습니다.

  • Rigidbody.SetKinematic [Re-create non-convex MeshCollider for Rigidbody]
  • Animation.DestroyAnimationClip [Triggers RebuildInternalState]
  • Animation.AddClip [Triggers RebuildInternalState]
  • Animation.RemoveClip [Triggers RebuildInternalState]
  • Animation.Clone [Triggers RebuildInternalState]
  • Animation.Deactivate [Triggers RebuildInternalState]

위 스크린샷의 프로파일러는 Static Collider.Move 경고를 표시합니다. Warning 열에는 이 경고가 현재 프레임에서 12번 트리거된 것으로 나옵니다. “지연 대가”라는 용어는 프로파일러의 항목에 따르면 성능 대가는 적지만(이 경우 0.00ms) 이 작업으로 인해 나중에 시스템에 부담을 더 가하는 연산이 트리거될 수 있음을 의미합니다.

CPU 프로파일러 타임라인

Mem Record: 네이티브 메모리 성능 프로파일링

네이티브 메모리 성능 프로파일링을 통해 Unity의 네이티브 메모리 관리 시스템의 내부 활동을 프로파일링하고 이 작업이 런타임 성능에 미치는 영향을 진단할 수 있습니다. 이 기능은 Unity의 메모리 관리에서 바람직하지 않거나 리소스 집약적인 할당 패널을 검색할 때 유용할 수 있습니다.

Unity의 네이티브 메모리 관리를 프로파일링하려면 기록해야 합니다. (Unity에서는 Mem Record 라고 하는) 네이티브 기록 모드에 액세스하려면 Window > Analysis > Profiler 로 이동하여 Profiler 창을 열고 CPU Usage 프로파일러(보이지 않는 경우 Add Profiler > CPU 클릭)를 선택한 후 프로파일러 아래의 드롭다운 메뉴를 선택합니다. 그런 다음 Timeline 을 클릭한 후 Mem Record 를 선택합니다.

기록 모드 선택
기록 모드 선택
옵션 기능 성능에 미치는 영향
None 모드가 비활성화됩니다. 디폴트 옵션입니다. 해당 없음
Sample only 메모리 할당, 재할당, 할당 취소, 활동 타입 및 시스템을 기록합니다. 낮음
Callstack (fast) Sample only__와 기능이 같지만 네이티브 할당 사이트에서 단축된 호출 스택을 호출 스택이 네이티브 기호에서 스크립트 기호로 전환되는 위치에 기록합니다. 실제로는 가장 깊은 스크립트 기호까지만 호출 스택을 볼 수 있습니다. |중간| | Callstack (full)__ __Sample only__와 기능이 같지만 전체 스크립트 -> 네이티브 및 네이티브 -> 스크립트 전환으로 호출 스택을 기록하기도 합니다. 높음

참고: 활성 프로파일러가 스탠드얼론 플레이어에만 연결된 경우 영향이 적은 Sample only 모드만 지원됩니다.

기록된 메모리 할당 샘플은 프로파일러 창에 밝은 빨간색으로 표시됩니다.

High Detail 모드를 활성화하려면 Mem Record 옆의 High Detail 버튼을 클릭합니다. 샘플을 선택하여 할당 타입 및 시스템을 표시합니다. 선택된 할당 샘플에 대해 호출 스택이 기록된 경우 관련 호출 스택 기호도 확인 및 표시됩니다.

Mem Record 사용

Mem Record 함수가 유용한 몇 가지 경우가 있습니다. 예:

  • 시스템이 소수의 큰 할당 작업 대신 작은 할당 작업을 여러 개 수행할 때 알고 싶은 경우
  • 워커 스레드가 메모리를 실수(예: 의도하지 않은 MemLabel 사용)로 할당할 때 알고 싶은 경우
  • 잠금 경합 찾기(여러 스레드가 동시에 네이티브 메모리 시스템에 액세스하려는 경우)
  • 메모리 조각화 원인 찾기(메모리가 적은 디바이스에 특히 중요)

타임라인 하이 디테일 뷰

CPU 사용 프로파일러 타임라인의 High Detail 뷰는 Unity의 CPU 사용 프로파일러에서 샘플을 기록할 때마다 너비를 1 픽셀 이상 제공합니다.

따라서 프레임의 모든 활동 전체 개요를 볼 수 있으며, 여기에는 스레드 동기화 또는 메모리 할당처럼 기간이 짧은 활동이 포함됩니다.

High Detail 뷰를 활성화하려면 Window > Analysis > Profiler 로 이동하여 Profiler 창을 엽니다. CPU Usage 프로파일러를 선택(보이지 않는 경우 Add Profiler > CPU 클릭)한 다음 프로파일러 아래의 드롭다운 메뉴를 선택하고 TimelineHigh Detail 을 차례로 클릭합니다.

비교

이어지는 두 그림에는 CPU 사용 프로파일러 타임라인의 하이 디테일 뷰와 일반 뷰의 차이가 나와 있습니다.

하이 디테일 뷰

일반 뷰

프로파일러 창
렌더링 프로파일러