Unity의 코드는 애플리케이션에서 시간을 소비하는 항목에 대한 인사이트를 제공하는 프로파일러 마커로 계측됩니다. 다음 표에는 몇 가지 빌트인 마커 목록이 나와 있습니다.
메인 스레드 기본 마커는 애플리케이션에 소비된 시간과 Unity 에디터 및 프로파일러 활동에 소비된 시간을 명확하게 구분합니다. 또한 이러한 마커를 ProfilerRecorder API와 함께 사용하여 메인 스레드의 프레임 타이밍을 가져오거나, 런타임 시 고수준 프레임 스탯을 위한 FrameTimingManager API를 사용할 수도 있습니다.
또한 렌더링 프로파일러 카운터인 CPU 메인 스레드 프레임 시간, CPU 렌더 스레드 프레임 시간, CPU 총 프레임 시간을 사용하여 애플리케이션의 CPU 사용량에 대한 높은 수준의 타이밍을 얻을 수 있습니다. 자세한 내용은 렌더링 프로파일러 카운터 레퍼런스를 참조하십시오.
| 마커 | 설명 |
|---|---|
| PlayerLoop | 애플리케이션의 기본 루프에서 생성된 모든 샘플이 포함되어 있습니다. 플레이어가 활성 상태의 플레이 모드로 에디터 내에서 실행되는 동안 플레이 모드 대신 에디터를 대상으로 하는 경우 PlayerLoop 샘플은 EditorLoop 아래에 중첩됩니다. |
|
EditorLoop (에디터 전용 마커) |
에디터의 기본 루프에서 생성된 모든 샘플이 포함되어 있습니다. 이는 에디터에서 플레이어를 프로파일링하는 동안만 존재합니다. 프로파일러를 사용하여 플레이 모드를 타게팅하는 경우 EditorLoop 샘플은 플레이어가 포함된 에디터를 렌더링하고 실행하는 데 소요된 시간을 나타냅니다. 자세한 내용은 플레이 모드 및 편집 모드 샘플을 참조하십시오. |
|
Profiler.CollectEditorStats (에디터 전용 마커) |
다양한 활성 Profiler 모듈의 통계 수집과 관련된 모든 샘플이 포함되어 있습니다.Profiler.CollectGlobalStats 마커 아래에 중첩된 샘플은 특정 모듈의 통계를 수집할 때 플레이어의 오버헤드 양을 나타냅니다. 다른 모든 자식 샘플은 에디터에서만 해당 효과를 반영합니다.특정 모듈의 오버헤드를 제거하려면 모듈의 차트를 닫거나 Profiler.SetAreaEnabled를 호출합니다.참고: 빌트인 카운터를 사용하는 커스텀 Profiler 모듈은 자신이 속한 모듈이 비활성화된 경우에도 빌트인 카운터의 영역을 활성화합니다. 프로파일러가 이러한 통계를 수집하고 컬렉션 오버헤드를 생성하지 않도록 하려면 빌트인 Profiler 모듈과 커스텀 Profiler 모듈을 모두 비활성화해야 합니다. |
잡 시스템을 사용하지 않는 한 대부분의 스크립팅 코드는 다음 마커의 아래에 중첩됩니다. 잡 시스템 샘플에 대한 자세한 내용은 이 페이지의 멀티 스레드 마커 섹션을 참조하십시오.
Unity의 업데이트 루프에 대한 자세한 내용은 이벤트 함수 실행 순서 기술 자료를 참조하십시오. PlayerLoop.SetPlayerLoop를 사용하여 자체 콜백을 플레이어 루프에 삽입할 수 있습니다. 메인 루프에 콜백을 직접 삽입하면 스크립트 업데이트 샘플이 자체적으로 나타납니다. 콜백을 보조 시스템으로 삽입하면 샘플이 각각의 메인 PlayerLoopSystem 마커 아래에 나타납니다.
| 마커 | 설명 |
|---|---|
| BehaviourUpdate | 모든 MonoBehaviour.Update 메서드의 샘플이 포함되어 있습니다. |
| CoroutinesDelayedCalls | 첫 번째 산출 이후의 모든 코루틴 샘플이 들어 있습니다. |
| FixedBehaviourUpdate | 모든 Monobehaviour.FixedUpdate 메서드의 샘플이 포함되어 있습니다. |
| PreLateUpdate.ScriptRunBehaviourLateUpdate | 모든 Monobehaviour.LateUpdate 메서드의 샘플이 포함되어 있습니다. |
| Update.ScriptRunBehaviourUpdate | 모든 MonoBehaviour.Update 및 코루틴 샘플이 포함되어 있습니다. |
이러한 마커에는 CPU가 GPU에 대한 데이터 처리에 시간을 소비하는 샘플, 또는 GPU가 완료되기를 기다리는 샘플이 포함되어 있습니다. GPU Profiler 모듈을 이용할 수 없거나 오버헤드가 과도해지는 경우에는 Profiler 모듈 세부 정보 창의 툴바에 이러한 정보가 표시되지 않습니다. 이러한 마커 아래의 샘플은 애플리케이션이 CPU 바운드 또는 GPU 바운드인지 분명히 알려 줍니다.
| 마커 | 설명 |
|---|---|
| WaitForTargetFPS | 애플리케이션이 Application.targetFrameRate가 지정하는 타게팅된 FPS를 기다리는 데 소요된 시간을 나타냅니다.이 샘플이 Gfx.WaitForPresentOnGfxThread의 하위 샘플인 경우 애플리케이션이 GPU를 기다리는 데 소요하는 시간을 나타냅니다. 예를 들어, QualitySettings.vSyncCount에서 설정된 경우, 또는 타겟 플랫폼에서 vSync가 적용된 경우 GPU가 다음 VSync를 기다리는 데 소요하는 시간일 수 있습니다. 그러나 GPU가 프레임 계산을 완료하지 않은 경우에도 이 마커가 있는 샘플이 방출됩니다. 이 마커가 있는 샘플이 많은 시간을 소모하는 원인을 확인하려면 CPU Profiler 모듈의 Timeline 뷰로 전환하십시오. 이 뷰에서는 렌더 스레드에서 발생한 상황 및 현재 프레임에서 끝나는 이 샘플과 주변 프레임에서 끝나는 동일한 샘플 사이에 경과한 시간을 확인할 수 있습니다. 기간이(타겟 프레임 속도 또는 vSync에 따라) 애플리케이션의 프레임 시간보다 길면 프레임이 렌더링하거나 계산하는 데 너무 오래 걸립니다. 이러한 경우 렌더 스레드를 조사하고 Gfx.PresentFrame에서 GPU에 커맨드를 준비 및 발행하는 데 다른 작업보다 소요한 시간을 확인합니다. 렌더 스레드가 Gfx.PresentFrame에서 많은 시간을 소비한 경우 렌더링 작업은 GPU 바운드입니다. 렌더 스레드의 시간이 커맨드 준비에 소요된 경우, 애플리케이션은 CPU 바운드입니다. 애플리케이션이 GPU 바운드인 경우 초점을 맞춰야 할 부분을 찾으려면 Unity 프로파일러 또는 플랫폼 프로파일러를 사용하여 GPU 작업을 프로파일링합니다. 자세한 내용은 그래픽스 성능 최적화 방법에 대한 사용자 매뉴얼 기술 자료를 참조하십시오. 참고: 에디터는 GPU에서 VSync를 수행하지 않고 대신에 WaitForTargetFPS를 사용하여 VSync 지연을 시뮬레이션합니다. Android, iOS와 같은 일부 플랫폼은 VSync를 강제로 적용하거나, 30 또는 60의 기본 프레임 속도 상한을 지정합니다. |
| Gfx.PresentFrame | 애플리케이션이 GPU가 프레임을 렌더링하고 표시할 때까지 대기하는 데 소요된 시간을 나타내며, 여기에는 VSync 대기가 포함됩니다. 메인 스레드에 WaitForTargetFPS 마커가 있는 샘플은 VSync를 기다리는 데 소요된 시간을 보여 줍니다. |
| Gfx.ProcessCommands | 렌더 스레드의 모든 렌더링 커맨드 처리가 포함되어 있습니다. 애플리케이션이 메인 스레드에서__ VSync__수직 동기화(VSync)는 모니터의 새로고침 속도와 일치하도록 게임의 프레임 속도에 상한을 두는 디스플레이 설정입니다. 이를 통해 이미지 테어링(tearing) 문제를 방지할 수 있습니다. See in Glossary 또는 새 커맨드를 기다리는 데 시간을 소비했을 수 있으며, 이는 해당 자식 샘플 Gfx.WaitForPresentOnGfxThread에서 확인할 수 있습니다. |
| Gfx.WaitForCommands | 렌더 스레드가 새 커맨드에 대한 준비가 되었음을 나타냅니다. 이 마커가 나타나면 메인 스레드의 병목 현상을 나타낼 수 있습니다. |
<GraphicsAPIName>.WaitForLastPresent 예시:GfxDeviceD3D11.WaitForLastPresent GfxDeviceD3D12.WaitForLastPresent GfxDeviceMetal.WaitForLastPresent |
이 마커가 있는 샘플은 메인 스레드가 GPU가 프레임 숫자를 화면으로 플립하기 위해 기다린 경우 나타납니다(Time.frameCount - QualitySettings.maxQueuedFrames + 1). 즉 QualitySettings.maxQueuedFrames가 1보다 크면 애플리케이션이 이전 메인 스레드 프레임에서 렌더링하도록 요청한 프레임을 GPU가 플립할 때까지 기다리는 데 이 시간이 소요됩니다.이 샘플에 대한 자세한 내용과 Unity의 프레임 파이프라인 개요는 델타 시간 해결에 대한 Unity 블로그 포스트를 참조하십시오. |
| Gfx.WaitForPresentOnGfxThread | 메인 스레드는 다음 프레임 렌더링을 시작할 준비가 되었지만, 렌더 스레드가 GPU가 프레임을 표시할 때까지 대기하는 것을 완료하지 않았음을 나타냅니다. 이는 애플리케이션이 GPU 바운드임을 나타낼 수 있습니다. 렌더 스레드가 동시에 시간을 소비하는 대상을 확인하려면 CPU Profiler 모듈의 Timeline 뷰를 확인하십시오. 렌더 스레드가 Camera.Render에서 시간을 소비하는 경우, 애플리케이션이 CPU 바운드이므로 드로우 콜이나 텍스처를 GPU로 전송하는 데 너무 많은 시간이 소요될 수 있습니다. 렌더 스레드가 Gfx.PresentFrame에서 시간을 소비하는 경우 애플리케이션이 GPU 바운드이거나 GPU에서 VSync를 기다리고 있을 수 있습니다. Gfx.WaitForPresentOnGfxThread의 WaitForTargetFPS 하위 샘플은 Present 단계에서 애플리케이션이 VSync를 기다리는 데 소비한 시간을 나타냅니다. Present 단계는 Unity가 그래픽스 API에 버퍼 교환을 명령하는 시점과 이 작업이 완료된 시점 사이의 시간입니다. |
| Gfx.WaitForRenderThread | 렌더 스레드가 현재 커맨드 스트림에 있는 모든 커맨드를 처리할 때까지 메인 스레드가 기다리고 있었음을 의미합니다. 이 마커가 있는 샘플은 멀티스레드 렌더링에서만 나타납니다. |
이 샘플은 Mono 또는__ IL2CPP__Unity에서 개발한 스크립팅 백엔드로, 여러 플랫폼용 프로젝트를 빌드할 때 Mono 대신 사용할 수 있습니다. 자세한 정보
See in Glossary 스크립팅 백엔드 활동을 강조 표시하며, 가비지 컬렉션 및 할당 문제를 해결하는 데 유용합니다.
| 마커 | 설명 |
|---|---|
| GC.Alloc | 자동 가비지 컬렉션이 적용되는 관리되는 할당을 포함하는 관리되는 힙의 할당을 나타냅니다. 애플리케이션이 자동 가비지 컬렉션에 소비하는 시간을 줄이려면 이 유형의 샘플을 최소화해야 합니다. |
| GC.Collect | 가비지 컬렉션에 관련된 샘플을 나타냅니다. Unity가 가비지 컬렉션을 수행해야 할 때마다 프로그램 코드 실행을 중지하고 가비지 컬렉터가 모든 작업을 완료한 후에만 정상 실행을 재개합니다. 참고: 점진적 가비지 컬렉션을 활성화한 경우 가비지 컬렉터가 단일 프레임에서 작업을 완료하지 못할 수 있습니다. 이러한 중단으로 인해 애플리케이션 실행 지연이 1밀리초 이하에서 수백밀리초까지 지속될 수 있습니다. 이는 가비지 컬렉터가 처리해야 하는 메모리 양과 애플리케이션이 실행 중인 플랫폼에 따라 다릅니다. 자세한 내용은 자동 메모리 관리 이해 기술 자료를 참조하십시오. |
|
Mono.JIT Mono 전용 |
스크립팅 메서드의 JIT(Just-In-Time) 컴파일과 관련된 샘플이 포함되어 있습니다. 함수가 처음 실행될 때 Mono가 이를 컴파일하고 Mono.JIT는 이 컴파일 오버헤드를 나타냅니다. |
| UnsafeUtility.Malloc | 관리되지 않는 메모리를 할당하기 위해 UnsafeUtility.Malloc을 호출하는 샘플이 포함되어 있습니다. 가비지 컬렉터는 이 메모리를 추적하지 않지만, 메모리를 할당하면 이 샘플에서 보이는 것과 같이 성능에 큰 영향을 미칠 수 있습니다. 이 호출의 소스를 조사하려면 프로파일러 창에서 이 마커에 대해 Call Stack 기록을 활성화하십시오. |
이 마커에는 소비된 CPU 주기를 측정하지 않고, 대신 스레드 동기화와 잡 시스템과 관련된 정보를 강조 표시하는 샘플이 포함되어 있습니다. 이러한 샘플이 표시되면 CPU Profiler 모듈의 Timeline 뷰를 통해 다른 스레드에서 동시에 무슨 일이 일어나고 있는지 확인하십시오.
| 마커 | 설명 |
|---|---|
| Idle | 워커 스레드가 비활성 상태인 시간을 나타내는 샘플이 포함되어 있습니다. 워커 스레드는 잡 시스템이 워커 스레드를 사용하지 않을 때마다 비활성화되고 대기 모드로 전환되어 세마포어에서 대기합니다. Idle 샘플 간의 작은 간극은 보통 잡 시스템이 샘플들을 깨울 때 발생합니다(예: 새로운 잡 예약). 간극이 길면 네이티브 잡이 실행 중인 스레드에서 계측되지 않았음을 의미합니다. |
| JobHandle.Complete | 잡의 동기화 시점이 발생한 시기를 나타내는 샘플이 포함되어 있습니다. 동기화 시점은 애플리케이션 성능에 영향을 미칠 수 있으며 멀티스레드 잡 코드의 실행을 방해할 수 있습니다. 동기화 시점이 발생한 위치를 쉽게 찾으려면 이 샘플에 대해 Call Stack 기록을 활성화하십시오. CPU Profiler 모듈의 Timeline 뷰에서 Flow Events를 활성화하여 이 시점에서 완료된 잡을 확인할 수 있습니다. |
| Semaphore.WaitForSignal | 스레드의 동기화 시점을 나타내는 샘플이 포함되어 있습니다. 대기 중인 스레드를 찾으려면 Timeline 뷰에서 이 뷰 직전에 종료된 샘플을 확인하십시오. |
| WaitForJobGroupID | JobHandle의 Sync Fence가 트리거되었습니다. 이로 인해 워커가 해당 작업을 마치고 다른 워커가 잡을 끝마치기를 기다릴 때 작업 훔치기가 발생할 수 있습니다. 이는 이 마커에서 실행된 잡 샘플로 표시됩니다. 훔친 잡은 대개 기다리고 있던 잡이 아닙니다. |
다음 표에는 몇 가지 고수준 물리 프로파일러 마커가 나와 있습니다. FixedUpdate는 이러한 모든 측정을 호출합니다.
| 마커 | 설명 | |
|---|---|---|
| Physics.FetchResults | 컨택트 스트림, 트리거 오버랩, 조인트 파손 이벤트 등과 같은 물리 엔진의 물리 시뮬레이션 결과를 수집하는 샘플이 포함되어 있습니다. | |
| Physics.Interpolation |
Physics.Interpolation 메서드의 실행 시간을 측정하는 샘플이 포함되어 있습니다. 이 메서드는 애플리케이션 내 모든 물리 오브젝트의 위치 및 회전 보간을 관리합니다. |
|
| Physics.Processing | 모든 스레드에서 물리 시뮬레이션이 완료될 때까지 메인 스레드에서 대기하는 데 시간을 소비한 샘플이 포함되어 있습니다. 애플리케이션이 Physics.Processing에서 많은 시간을 소비하지만, 씬에 몇 개의 물리 관련 게임 오브젝트만 있다면 워커 스레드가 작업 훔치기로 인해 다른 시스템 작업을 선택하고 물리를 보고했음을 나타낼 수 있습니다. 이는 대기하는 동안 메인 스레드가 우선 순위가 높은 대기열에서 잡을 선택하기 때문입니다. |
|
| Physics.ProcessingCloth |
Physics.ProcessingCloth 메서드의 실행 시간을 측정하는 샘플이 포함되어 있습니다. 이 메서드는 모든 천 물리 작업을 처리합니다. 이 샘플을 확장하면 물리 엔진 내부에서 수행되는 작업의 로우 레벨 세부 정보가 표시됩니다. |
|
| Physics.ProcessReports | 물리 데이터를 OnTriggerEnter와 같은 콜백을 통해 스크립트로 전달하는 데 소요된 시간에 해당하는 샘플이 포함되어 있습니다. 참고: 이러한 샘플은 이미 FetchResults 중에 준비되었기 때문에 필요한 데이터를 계산하지 않습니다.여기에는 네 단계가 있습니다. |
|
| Physics.Contacts |
Physics.Contacts의 실행 시간을 측정하는 샘플이 들어 있습니다. 이는 OnCollisionEnter, OnCollisionExit 및 OnCollisionStay 이벤트를 처리합니다. |
|
| Physics.JointBreaks |
Physics.JointBreaks의 실행 시간을 측정하는 샘플이 들어 있습니다. 끊어진 조인트와 관련된 업데이트와 메시지를 처리합니다. |
|
| Physics.TriggerEnterExits |
Physics.TriggerEnterExits의 실행 시간을 측정하는 샘플이 들어 있습니다. 이는 OnTriggerEnter 및 OnTriggerExit 이벤트를 처리합니다. |
|
| Physics.TriggerStays |
Physics.TriggerStays의 실행 시간을 측정하는 샘플이 들어 있습니다. 이는 OnTriggerStay 이벤트를 처리합니다. |
|
| Physics.Simulate |
Physics.Simulate 메서드의 사전 요구 사항 작업에 소요된 시간을 측정하는 샘플이 포함되어 있습니다. 이 메서드는 물리 엔진이 시뮬레이션을 실행하도록 명령하여 현재 물리의 상태를 업데이트합니다. |
|
| Physics.UpdateBodies | 모든 물리 바디의 위치와 회전을 업데이트하는 샘플이 포함되어 있습니다. Rigidbody 컴포넌트가 있는 각 게임 오브젝트의 경우 이 마커가 있는 샘플은 물리 시스템에서 포즈를 읽고 Transform에 기록합니다. | |
| Physics.UpdateCloth |
Physics.UpdateCloth 메서드의 실행 시간을 측정하는 샘플이 포함되어 있습니다. 이 메서드는 천과 해당 스킨드 메시와 관련된 업데이트를 처리합니다. |
|
스크립트 라이프사이클과 스크립트 라이프사이클 내 일반 샘플에 대한 자세한 내용은 이벤트 함수의 실행 순서를 참조하십시오.
다음 표에는 애니메이션 시스템의 마커가 포함되어 있습니다. 애니메이션 시스템 성능에 대한 일반적인 내용은 메카님 성능 및 최적화 페이지를 참조하십시오.
이 단계에서는 활성화된 모든 애니메이터가 처리됩니다. 활성 애니메이터는 컬링 모드와 가시성에 관계없이 처리됩니다.
Director.로 시작하는 마커는 플레이어블과 타임라인을 포함할 수도 있습니다.
| 마커 | 설명 |
|---|---|
| Director.PrepareFrame |
Director.PrepareFrameJob 잡을 설정하고 예약하고 대기합니다. 이 잡은 활성화된 모든 Animator 컴포넌트의 상태 머신을 평가합니다. |
| Director.PrepareFrameJob (job) | 단일 활성 애니메이터의 상태 머신을 평가합니다. 애니메이터를 처리하는 데 걸리는 시간은 상태 머신 복잡도(예: 상태, 전환, 프로퍼티, 레이어 수)에 따라 증가합니다.OnStateMachineEnter 또는 OnStateMachineExit 리스너를 구현하는 StateMachineBehaviours가 있는 상태 머신의 평가는 메인 스레드로 제한됩니다. |
| Animators.PrepareFirstPass | 다음 처리 단계를 준비합니다. |
| Animators.ProcessGraphJob |
Animator.ProcessGraph 잡의 결과를 빌드하고 예약하고 기다립니다. |
| Animators.ProcessGraph (job) | 연결된 모든 애니메이션 클립의 모든 프로퍼티를 평가합니다. 모든 클립의 루트 모션 프로퍼티를 함께 블렌딩하여 루트 모션 변위를 계산합니다. 현재 deltaTime에 대한 새로운 애니메이션 이벤트를 수집합니다.애니메이션 클립의 프로퍼티를 평가할 때 커브 세그먼트는 애니메이션 클립의 메모리에서 필요 이상으로 읽지 않도록 프레임 간에 로컬로 캐싱됩니다. |
| Animators.FireAnimationEventsAndBehaviours |
Director.PrepareFrameJob에서 이미 실행된 OnStateMachineEnter 또는 OnStateMachineExit 리스너를 제외하고, StateMachineBehaviours 및 MonoBehaviour의 모든 애니메이션 이벤트 메시지를 실행합니다. |
| Animators.ApplyOnAnimatorMove | 루트 모션을 적용하고 MonoBehaviour에서 OnAnimatorMove 메시지를 트리거합니다. |
이 단계에서는 컬링 모드 Always Update가 있는 애니메이터와 컬링 모드 UpdateTransform 또는 Cull Completely가 있는 가시적인 애니메이터만 처리됩니다. 루트 모션에 의해 프레임 밖으로 이동된 Cull Completely가 있는 애니메이터는 이 단계에 참여하지 않습니다. StateMachineBehaviours 및 AnimationEvents에서 트리거한 사용자 코드로 비활성화된 애니메이터도 마찬가지입니다.
| 마커 | 기능 |
|---|---|
| Animators.PrepareSecondPass | 다음 처리 단계를 설정합니다. 여기에는 컬링 모드 및 가시성 상태를 기반으로 애니메이터를 필터링하는 작업이 포함됩니다. |
| Animators.SortWriteJob | 트랜스폼 시스템에서는 한 번에 하나의 스레드만 트랜스폼 계층 구조를 수정할 수 있습니다. 이 제약을 수용하기 위해 Animators.SortWriteJob은 Animators.WriteTransforms 잡을 Transform.root로 그룹화합니다.최상의 성능을 위해 동일한 트랜스폼 계층 구조에 여러 애니메이터를 두지 않아 잡을 예약하고 병렬화할 수 있는 세분화 레벨을 높입니다. |
| Animators.ProcessAnimationsJob |
Animators.ProcessAnimations 잡의 결과를 빌드하고 예약하고 기다립니다. |
| Animator.ProcessAnimations (job) | 루트 모션을 제외하고 현재 활성화된 애니메이션 클립의 모든 프로퍼티를 단일 애니메이터에 블렌딩합니다. 그리고 이를 내부 아바타 표현에 적용합니다. 이 마커의 길이는 애니메이션과 블렌딩의 복잡도에 따라 달라집니다. |
| OnAnimatorIK | 애니메이션 IK를 설정합니다. 이는 IK 패스가 활성화된 각 Animator 컨트롤러 레이어에 대해 한 번 호출됩니다. |
| Animators.WriteJob |
Animator.WriteTransform 잡의 결과를 빌드하고 예약하고 기다립니다. 이러한 잡은 애니메이션 아바타에서 관련 게임 오브젝트 트랜스폼 계층 구조로 트랜스폼 포즈를 작성합니다. |
| Animators.WriteTransforms (job) | 애니메이션화된 모든 트랜스폼을 워커 스레드에서 씬에 작성합니다. |
| Animator.WriteProperties | 트랜스폼 포즈가 아닌 애니메이션화된 프로퍼티를 타겟 오브젝트에 작성합니다. |
CPU 프로파일러는 몇 가지 일반적인 성능 문제를 감지하고 경고를 표시합니다. 이는 모듈 세부 정보 창에 있는 CPU Profiler 모듈의 계층 구조 뷰의 Warning 열에 표시됩니다.
프로파일러는 성능이 중요한 상황에서 피해야 하는 특정 호출을 감지합니다. 다음과 같이 작업이 성능에 영향을 미치는 이유와 함께 경고를 표시합니다.
| Warning | 설명 |
|---|---|
|
Animation.DestroyAnimationClip Animation.AddClip Animation.RemoveClip Animation.Clone Animation.Deactivate |
RebuildInternalState가 트리거되었음을 나타냅니다. RebuildInternalState는 Animation 컴포넌트의 각 클립에 대한 커브 목록을 살펴본 후 각 커브를 게임 오브젝트의 컴포넌트 값에 다시 바인딩하는 작업입니다. 리소스를 많이 소모하는 작업이므로, 런타임 시점에는 이러한 메서드를 최대한 호출하지 않아야 합니다. |
| AssetBundle.asset/allAssets | AssetBundle 로드가 완료되지 않은 상태에서 Unity가 AssetBundleRequest.assets/allAssets API를 호출했음을 나타냅니다(AssetBundleRequest.isDone은 false임). 이로 인해 메인 스레드가 중단되고 로드 작업이 완료될 때까지 대기합니다. |
|
AsyncUploadManager.AsyncBufferResized AsyncUploadManager.AsyncBufferDelete |
GPU에 데이터를 업로드하기 위한 내부 버퍼가 충분히 크지 않아서 크기가 조정되었음을 나타냅니다. 이러한 크기 조정은 속도를 저하시키고 CPU 활동의 급증을 유발합니다. 더 큰 크기를 미리 할당하기 위해 메모리를 확보해 두면 이러한 경고를 방지할 수 있습니다. Quality Settings에서 Async Upload Buffer Size 설정을 사용하여 기본 크기를 설정할 수 있습니다. AsyncUploadManager.AsyncBufferResized 마커는 기본 버퍼 크기에 대한 가이드로 사용할 수 있는 신규 할당 크기를 나타냅니다. |
| Rigidbody.SetKinematic | 리지드바디에 대해 볼록하지 않은 메시 콜라이더를 다시 생성합니다. |