티스토리 뷰
learn.unity.com/tutorial/diagnosing-performance-problems-2019-3#
Diagnosing Performance Problems - 2019.3 - Unity Learn
A profiling tool gives detailed information about how a game is performing. The Profiler window is a powerful profiling tool that is built into Unity. This tutorial describes what the Profiler window is used for and how to use it to diagnose performance pr
learn.unity.com
프로파일러
프로파일러 창을 사용하여 게임 성능의 다양한 측면 (예 : 게임에서 메모리를 사용하는 방법, 다양한 작업에 사용되는 CPU 시간 및 물리 계산이 수행되는 빈도)에 대해 배울 수 있습니다. 가장 중요한 것은이 데이터를 사용하여 게임성능 문제의 원인을 찾고 이를 해결하려는 시도의 효과를 측정 할 수 있다는 것입니다.
게임에 성능 문제가있는 경우 문제를 해결하기 전에 성능 문제의 원인을 아는 것이 중요합니다. 이는 문제마다 다른 솔루션이 필요하기 때문입니다. 프로젝트가 느리게 실행되는 경우 문제의 실제 원인이 지나치게 복잡한 물리학 인 경우 그래픽 렌더링을 개선하려고 할 필요가 없습니다! 마찬가지로 성능 문제를 해결하려는 시도의 효과를 측정하는 것도 중요합니다. 프로파일 링 데이터의 효과적인 사용은 최적화와 단지 변경하는 것과 최선을 바라는 것의 차이입니다.
프로파일러는 많은 세부 정보를 제공하지만 프로파일링 할 때마다 모든 정보를 사용할 필요는 없습니다. 사실, 우리는 보통 한두개의 프로파일러 만보고 게임 프로파일링을 시작합니다. 예를 들어 게임이 느리게 실행되는 경우 CPU 사용량 프로파일러를 살펴 보는 것으로 조사를 시작할 수 있습니다.
CPU 사용량 프로파일 러는 게임에서 실행하는데 가장 많은 CPU 시간을 사용하는 부분에 대한 개요를 제공합니다. 이 정보를 사용하여 우리가 살펴 봐야 할 다른 프로파일러를 결정할 수 있습니다. 예를 들어 물리 함수를 실행하는 데 오랜 시간이 걸린다고 판단되면 물리 프로파일러를 사용하여 게임의 물리 성능에 대한 자세한 정보를 수집합니다.
프로파일러 창을 사용하여 데이터를 기록 할 때 약간의 성능비용이 있음을 이해하는 것이 중요합니다. 이것은 모든 프로파일링 도구에 공통적입니다. 약간의 오버헤드없이 심층 프로파일링 데이터를 기록하고 표시 할 수 없습니다. 이것이 우리 게임이 실행되는 방식에 큰 차이를 만들지 않을 것 같지만, 프로파일러 창이 기록 될 때 성능에 아주 사소한 영향이있을 수 있습니다.
두 가지 다른 방법으로 게임을 프로파일링 할 수 있습니다. Unity 에디터 내에서 실행되는 동안 게임을 프로파일링하거나 Unity 에디터 외부에서 실행되는 동안 development 빌드로 게임을 프로파일링 할 수 있습니다. Unity 게임의 개발 빌드는 일반 빌드와 두 가지면에서 다릅니다. 게임이 실행 중일 때 개발 빌드가 프로파일러 창에 연결할 수 있고 디버깅을 활성화하는 파일이 포함되어 있습니다.
Unity 에디터에서 게임을 프로파일링하는 것보다 게임의 개발빌드를 프로파일링하는 것이 대부분 좋습니다. 여기에는 두 가지 이유가 있습니다. 첫째, 독립형 개발 빌드의 성능 및 메모리 사용량에 대한 데이터는 Unity 편집기에서 게임을 프로파일링 할 때보 다 훨씬 정확합니다. 프로파일러 창은 Unity 에디터 자체의 데이터를 기록하므로 결과가 왜곡됩니다. 둘째, 가능할 때마다 대상 하드웨어에서 게임을 테스트하는 것이 가장 좋습니다. 예를 들어 우리 게임이 Android 게임이라면 Android 기기에서 테스트해야합니다. 일부 성능 문제는 게임이 특정 하드웨어 또는 운영 체제에서 실행 중일 때만 나타날 수 있으므로 Unity 에디터에서만 테스트하면 게임의 문제를 발견하지 못할 수 있습니다.
하지만 Unity 에디터에서 게임을 프로파일 링하는 것이 유용 할 때가 있습니다. 이것은 우리가 매우 정확한 결과를 필요로하기보다는 신속하게 광범위한 성능 감각을 얻는 데 더 관심이있는시기입니다. 예를 들어, 런타임에 많은 게임 오브젝트를 활성화 및 비활성화하여 성능 문제의 원인을 파악할 수 있습니다. Unity 에디터에서 이러한 변경 사항을 테스트하는 것이 여러 빌드를 만드는 것보다 훨씬 빠릅니다. 문제의 대략적인 위치를 찾았 으면 개발 빌드를 프로파일링하여 문제를 해결하는 데 필요한 정확한 정보를 얻을 수 있습니다.
프로파일러창을 사용하여 성능문제 진단
- Unity의 내장 프로파일러 창 을 사용하여 성능이 저조한 상황에 대한 데이터 수집
- 이 데이터를 분석하고 결과를 사용하여 성능 문제의 원인을 추적합니다.
- 이러한 특정 문제 해결에 대한 기사 링크 찾기
원하는 결과를 얻기 전에 변경 사항을 적용하고 이러한 변경 사항의 효과를 측정하는 데 몇 번의 라운드가 필요할 수 있습니다. 프로파일링 도구를 사용하여 문제를 분석하는 방법을 아는 것은 무엇이 잘못되었는지 식별하고 다음에 시도해야 할 사항을 이해할 수 있다는 것을 의미합니다.
게임 퍼포먼스에 대한 간략한 소개
FrameRate는 게임 성능의 표준 척도입니다. 게임에서 프레임은 애니메이션의 프레임과 같습니다. 화면에 그려지는 게임의 스틸 이미지입니다. 화면에 프레임을 그리는 것을 프레임 렌더링이라고합니다.프레임이 렌더링되는 속도는 FPS (초당 프레임 수)로 측정됩니다.
중요한 것은 속도만이 아닙니다. 프레임 속도도 일관되어야합니다. 프레임 속도의 변화는 플레이어에게 매우 눈에 띄며 일관되지 않은 프레임 속도는 일반적으로 느리지만 안정적인 프레임 속도보다 더 나쁜 것으로 간주됩니다.
FrameRate는 게임의 성능에 대해 이야기하는 일반적인 방법이지만 게임 성능을 향상시키려는 경우 프레임을 밀리세컨드 단위로 렌더링하는 데 걸리는 시간을 생각하는 것이 더 유용합니다. 이것은 두 가지 이유 때문입니다. 첫째, 이것은 더 정확한 측정입니다. 게임의 성능을 향상 시키려고 할 때 매 밀리 초가 목표에 포함될 수 있습니다. 둘째, 프레임 속도의 상대적인 변화는 규모에 따라 매우 다른 것을 의미합니다. 60FPS에서 50FPS로 변경하면 처리 시간이 3.3ms가 추가로 표시되지만 30FPS에서 20FPS로 변경하면 처리 시간이 16.6ms가 추가로 늘어납니다. 이 두 가지 예는 모두 10FPS 하락이지만 프레임을 렌더링하는 데 걸리는 시간의 차이는 상당합니다.
일반적인 프레임 속도를 충족하기 위해 프레임을 렌더링해야하는 밀리세컨드를 이해하는 것이 유용합니다. 이 수치를 찾으려면 1000/[원하는 프레임 속도] 공식을 따라야합니다. 이 공식을 사용하면 게임에서 초당 30 프레임을 렌더링하려면 33.3 밀리 초 이내에 각 프레임을 렌더링해야한다는 것을 알 수 있습니다. 게임이 60FPS로 실행 되려면 16.6 밀리 초 이내에 각 프레임을 렌더링해야합니다.
수행하는 데 너무 오래 걸리는 작업을 아는 것은 성능 문제를 해결하는 방법을 아는 데 중요합니다. 어떤 작업이 프레임 속도를 낮추고 있는지 알게되면 게임의 해당 부분을 최적화 할 수 있습니다. 이것이 프로파일링이 매우 중요한 이유입니다. 프로파일링 도구는 주어진 프레임에서 각 작업에 걸리는 시간을 보여줍니다.
데이터의 수집
1. 대상 장치에서 게임의 개발 빌드를 만듭니다.
2. 성능 문제가있는 게임의 일부에 도달하기 직전에 프로파일링 데이터 기록을 시작합니다.
3. 성능 문제의 예가 포함 된 프로파일링 데이터를 기록했으면 프로파일러 창 상단의 아무 곳이나 클릭하여 게임을 일시 중지하고 프레임을 선택합니다.
4. 프로파일 러 창의 상단에서 성능이 떨어지는 프레임을 선택합니다. 이것은 "스파이크"이거나 프레임 속도가 원하는 값보다 낮은 일반적인 프레임 일 수 있습니다. 프로파일러 창의 왼쪽 및 오른쪽 화살표 키 또는 뒤로 및 앞으로 아이콘 버튼을 사용하여 프레임 사이를 이동하여 더 세밀하게 제어 할 수 있습니다.
CPU Usage 프로파일러
프로파일러 창 상단에있는 CPU 사용량 프로파일러를 보면 CPU가 각 프레임 동안 작업을 완료하는 데 걸리는 시간을 볼 수 있습니다.
우리는 그 시간이 어떻게 소비되는지에 대한 색으로 구분된 분류를 볼 수 있습니다. 다른색상은 렌더링 작업, 물리 계산 등에 소요되는 시간을 나타냅니다.
다음 스크린 샷에서이 프레임의 대부분의 시간이 렌더링 작업에 소비되는 것을 볼 수 있습니다. 다음 이미지 하단의 CPU 시간 표시기는이 프레임의 총 CPU 시간이 8.28ms임을 나타냅니다.
Hierarchy View
CPU 사용량 프로파일러의 계층 보기를 사용하여 이 정보를 더 자세히 살펴보고 해당 프레임 동안 가장 많은 CPU시간을 차지하는 작업을 정확히 확인하겠습니다. CPU 사용량 프로파일러를 선택하면 프로파일러 창의 하단에서 프레임에 대한 자세한 정보를 볼 수 있습니다. 프로파일러 창의 아래쪽을 보면 왼쪽 상단의 드롭 다운 메뉴를 사용하여 계층보기를 선택할 수 있습니다. 이를 통해 발생하는 CPU 작업에 대한 자세한 정보를 볼 수 있습니다.
계층보기에서 열 머리글을 클릭하면 해당 열의값을 기준으로 정보가 정렬됩니다. 예를 들어, 시간 ms를 클릭하면 가장 오래 걸리는 함수를 기준으로 함수가 정렬되고 호출을 클릭하면 현재 강조 표시된 프레임 동안 호출 된 횟수별로 함수가 정렬됩니다. 위의 스크린 샷에서 우리는 시간별로 함수를 정렬했으며, Editor Loop 이외의 CPU 시간을 가장 많이 차지하는 작업이 Camera.Render 함수임을 알 수 있습니다.
함수 이름 왼쪽에 화살표가있는 경우 해당 함수가 호출하는 다른 함수와 성능에 미치는 영향을보기 위해 확장 할 수 있습니다. Self ms 열은 함수 자체에 걸리는 시간을 나타내고, Time ms는이 함수와 이 함수에서 호출하는 다른 모든 함수에 걸리는 시간을 나타냅니다.
이 경우 Camera.Render 내에서 가장 비용이 많이 드는 함수가 Shadows.RenderJob이라는 함수와 관련되어 있음을 알 수 있습니다. 이 특정 기능에 대해 아직 많이 알지 못하더라도 이미 문제에 대한 많은 정보를 가지고 있습니다. 우리의 문제는 렌더링과 관련이 있으며이 시점에서 발생하는 가장 비용이 많이 드는 작업은 그림자와 관련이 있다는 것을 알고 있습니다.
Hierarchy 뷰에서 할 수있는 또 다른 유용한 일은 게임내의 프레임을 비교하여 시간에 따른 성능 변화를 이해할 수 있는 것입니다. CPU 사용량 프로파일러를 사용하여 프레임마다 개별 함수의 비용을 추적 할 수 있습니다. 계층보기에서 함수 이름을 클릭하면 CPU 사용량 프로파일러가 프로파일러 창 상단의 그래프에서 해당 함수의 기여도를 강조 표시합니다.
예를 들어 계층보기에서 드로잉을 클릭하면 드로잉과 직접 연결된 렌더링 데이터의 일부가 그래프에서 강조 표시됩니다.
Timeline View
타임 라인보기는 CPU 작업이 수행되는 순서와 어떤 스레드가 어떤 작업을 담당하는지 두 가지를 보여줍니다. 프로파일 러 창 (이전에 Hierarchy를 읽었던 곳)의 하단 왼쪽 모서리에있는 드롭 다운 메뉴를 사용하여 타임 라인보기를 선택할 수 있습니다.
스레드를 사용하면 개별 작업이 동시에 발생할 수 있습니다. 한 스레드가 하나의 작업을 수행하는 동안 다른 스레드는 완전히 별도의 작업을 수행 할 수 있습니다. Unity의 렌더링 프로세스에는 세 가지 유형의 스레드 (메인 스레드, 렌더링 스레드 및 작업자 스레드)가 있습니다. 어떤 스레드가 어떤 작업을 담당하는지 알면 어떤 작업이 매우 유용합니다. 어떤 스레드에서 가장 느린 작업이 발생하는지 알게되면 해당 스레드를 사용하는 작업을 최적화하는 데 노력을 집중해야합니다.
타임 라인보기를 확대하여 개별 작업을 자세히 살펴볼 수 있습니다. 다른 함수에서 호출하는 함수는 바로 아래에 표시됩니다. 이 예제에서는 Shadows.RenderJob을 확대하여이 작업을 구성하는 개별 작업을 확인했습니다. Shadows.RenderJob이 메인 스레드에서 발생하는 함수를 호출하는 것을 볼 수 있습니다. 그림자와 관련된 작업을 수행하는 작업자 스레드도 볼 수 있습니다. 주 스레드에 WaitingForJob이라는 작업이 있으면 주 스레드가 작업자 스레드가 작업을 완료하기를 기다리고 있음을 나타냅니다. 이로부터 그림자와 관련된 렌더링 작업이 주 스레드와 작업자 스레드에서 너무 오래 걸린다는 결론을 내릴 수 있습니다
VSync 제외
VSync 라고하는 수직 동기화 는 게임의 프레임 속도를 게임이 표시되는 화면의 재생률과 일치시키는 데 사용됩니다. VSync는 게임의 프레임 속도에 영향을 미칠 수 있으며 그 효과는 프로파일러 창에 표시 될 수 있습니다. 우리가 무엇을보고 있는지 확실하지 않으면 성능 문제로 보일 수 있으므로 더 진행하기 전에 조사에서 VSync를 배제해야 합니다.
1. CPU 사용량 프로파일러를 클릭하여 선택합니다.
2. CPU 사용량 프로파일러가 시간에 따라 데이터를 표시하는 프로파일 러 창의 상단에서 VSync라고 표시된 노란색 사각형을 클릭하여 그래프에서 VSync 정보를 숨깁니다.
CPU 사용량 프로파일 러의 Hierarchy 뷰에서 VSync 정보를 숨길 수있는 방법은 없지만 무시할 수 있도록 어떻게 보이는지 알 수 있습니다. Hierarchy 뷰에서 WaitForTargetFPS라는 함수를 볼 때마다 게임이 VSync를 기다리고 있음을 의미합니다. 이 기능을 조사 할 필요는 없으며 무시해도됩니다.
렌더링 프로파일링
게임이 GPU 바운드인지 확인하는 가장 빠른 방법은 Unity의 GPU 사용 프로파일러를 사용하는 것입니다. 불행히도 모든 장치와 드라이버가이 프로파일 러를 지원하는 것은 아닙니다. 게임이 GPU 바운드인지 확인하기 전에 먼저 대상 장치에서 GPU 사용량 프로파일러를 사용할 수 있는지 확인해야합니다.
1. 프로필러 창의 왼쪽 상단에서 프로파일러 추가를 선택 합니다.
2. 드롭 다운 메뉴에서 GPU 를 선택 합니다.
GPU 사용량 프로파일 러가 대상 장치에서 지원되지 않는 경우 GPU 사용량 프로파일러가 일반적으로 데이터를 표시하는 "GPU 프로파일 링이 지원되지 않습니다."라는 메시지가 표시됩니다.
이 메시지가 표시되지 않으면 대상 장치에서 GPU 사용량 프로파일러를 지원한다는 의미입니다. GPU 사용량 프로파일러를 사용할 수 있는 경우 다음 단계를 수행하여 게임이 GPU 바인딩되었는지 빠르고 쉽게 확인할 수 있습니다.
1. GPU 사용량 프로파일 러를 클릭하여 선택합니다.
2. 현재 선택한 프레임의 CPU 및 GPU 시간이 표시되는 화면 중앙 영역을 확인합니다.
GPU 시간이 CPU 시간을 초과하면이 시점에서 게임이 GPU 바운드임을 확인할 수 있습니다.
대상 하드웨어에 GPU 사용량 프로파일 러를 사용할 수없는 경우에도 게임이 GPU에 바인딩되어 있는지 확인할 수 있습니다. CPU 사용량을 관찰하여 이를 수행합니다. CPU가 GPU가 작업을 완료하기를 기다리고 있음을 알 수 있다면 이는 게임이 GPU에 묶여 있음을 의미합니다. 이것이 사실인지 확인하기 위해 다음 단계를 수행 할 수 있습니다.
- CPU 사용량 프로파일러를 클릭하여 선택합니다.
- 현재 선택된 프레임 및 프로파일러에 대한 자세한 정보를 표시하는 프로파일러 창 하단의 영역을 검사합니다.
- 이 영역의 왼쪽 상단에있는 드롭 다운 메뉴에서 계층 을 선택 합니다.
- 시간(밀리 초)으로 함수를 정렬하려면 시간 ms 열을 선택합니다.
Gfx.WaitForPresent 함수 가 CPU 사용량 프로파일 러에서 가장 오래 걸리는 경우 CPU가 GPU를 기다리고 있음을 나타냅니다. 이것은 우리 게임이이 시점에서 GPU바인딩을 의미합니다.
CPU바운드 인지 확인
CPU 사용량 프로파일러가 시간 경과에 따라 데이터를 표시하는 프로파일러 창의 상단에서 렌더링을 나타내는 그래프의 색상 부분을 검사합니다. 키에서 이름 옆에있는 색상사각형을 클릭하여 그래프에서 데이터를 숨기거나 표시 할 수 있습니다.
느린 프레임에서 프레임 시간의 많은 부분이 렌더링에 의해 사용된다면 이는 렌더링이 문제의 원인 일 수 있음을 나타냅니다. 다음 단계에 따라 프로파일링 데이터를 조사하여이를 확인할 수 있습니다.
- CPU 사용량 프로파일러를 클릭하여 선택합니다.
- 현재 선택된 프레임 및 프로파일러에 대한 자세한 정보를 표시하는 프로파일러 창 하단의 영역을 검사합니다.
- 이 영역의 왼쪽 상단에있는 드롭 다운 메뉴에서 계층을 선택합니다.
- 시간 (밀리 초)으로 함수를 정렬하려면 시간 ms 열을 선택합니다 .
- 목록 상단의 기능을 클릭하여 선택합니다.
선택한 기능이 렌더링 기능인 경우 CPU 프로파일러 그래프가 렌더링 디스플레이의 일부로 강조 표시합니다. 이 경우 렌더링 관련 작업으로 인해 게임 성능이 저하되고 이 시점에서 게임이 CPU바인딩을 의미합니다. 함수 이름과 함수를 수행하는 스레드를 확인합니다. 이 정보는 문제를 해결하려고 할 때 유용합니다.
가비지 컬렉션 프로파일링
CPU 사용량 프로파일 러가 시간 경과에 따른 데이터를 표시하는 프로파일러 창의 상단에서 가비지 수집기를 나타내는 그래프 부분을 검사합니다 . 키에서 이름 옆에있는 색상 사각형을 클릭하여 그래프에서 데이터를 숨기거나 표시 할 수 있습니다. 관심있는 특정 측면의 이름을 드래그하여 재정렬 할 수도 있습니다.
Time ms 열에서 GC.Collect () 함수가 나타나고 과도한 CPU 시간을 차지하는 경우 게임에서 가비지 수집 문제를 식별 한 것입니다.
Physics 프로파일링
위 가비지 컬렉션과 마찬가지로 Physics를 강조된 함수가 느린지 판별.
피직스가 병목이라면 아래 링크 참고
느린 스크립트
이제 느리거나 지나치게 복잡한 스크립트가 성능 문제의 원인인지 확인하겠습니다. 이 맥락에서 스크립트는 Unity 엔진의 일부가 아닌 코드를 의미합니다. 이것은 일반적으로 우리가 직접 작성한 스크립트를 의미하지만, 예를 들어 프로젝트에서 사용하는 플러그인의 일부인 코드가 포함될 수 있습니다.
위의 예외가 있습니다. 게임에 이미지 효과 스크립트 나 OnWillRenderObject 또는 OnPreCull 함수내의 코드와 같은 렌더링과 관련된 코드가 포함되어 있는 경우 CPU 사용량 프로파일 러가 작동 할 때 스크립트 데이터가 아닌 렌더링 데이터로 프로파일러에 표시됩니다.
해결관련 링크
'Unity > 최적화' 카테고리의 다른 글
Unity 개발자를 위한 ARM 설명서 v4.1 - part 1 (0) | 2021.04.06 |
---|---|
Unity Particle Draw call 절약 (0) | 2021.04.06 |
Fixing Performance Problems - 2019.3 (0) | 2021.03.22 |
Arm & Unity Presents: 3D Art Optimization for Mobile Applications - Shaders, Materials, Lighting (0) | 2021.03.19 |
Arm & Unity Presents: 3D Art Optimization for Mobile Applications - Geometry, Texture (0) | 2021.03.17 |
- Total
- Today
- Yesterday