[영상 필기] 유니티 프로파일링의 모든 것
영상 링크
https://www.youtube.com/watch?v=2-AferlBBiQ
프로파일링, 디버깅, 정적 분석 도구의 차이
프로파일링 도구
- 코드 실행과 관련된 타이밍 데이터의 측정 / 수집
디버깅 도구
- 프로그램 실행을 단계별로 수행
- 값을 일시 중지 및 검사
정적 아날라이저
- 소스 코드 또는 에셋을 입력하여 적절성을 추론한다
- ex) Project Auditor
Sample-based (샘플 기반) 프로파일링
방식
- 앱에서 수행 중인 작업에 대한 통계 데이터를 수집하여 분석
- N 나노초마다 Call Stack을 조사
장점
- 정확도
단점
- 높은 오버헤드
Instrument (계측) 프로파일링
방식
- 마커를 추가하여 코드를 계측
- 유니티의 프로파일러는 계측 기반 (중요한 유니티 이벤트들에 마커가 설정되어있다)
장점
- 오버헤드가 비교적 적으며 광범위한 스트로크를 캡처하도록 계측됨
- 정보 유실이 없음
단점
- 마커를 직접 정의해줘야함
Deep Profilling
- 안드로이드 빌드시 빌드옵션에서 Deep Profilling Support를 체크.
- C# Getter 및 Setter 속성을 포함한 모든 스크립트 메서드 호출에 마커를 자동 삽입
장점
- 세부적인 프로파일링 가능
단점
- 엄청난 오버헤드
병목 찾기
메인 스레드가 렌더 스레드를 대기하고 있다면?
GPU를 대기중인 마커가 노출된다면 GPU 병목
GPU를 대기하는게 아니라면 렌더 스레드 병목이다.
메인 스레드가 잡 워커 스레드 병목이라면 프로파일링을 통해 CPU 프로파일링을 진행한다.
최저사양 단말을 목표로 최적화하도록 하자.
예시1
목표 프레임이 33.33ms고, VSync가 활성화 된 경우
- CPU 프레임 시간 40ms / GPU 가 20ms 인 경우
- CPU 최적화가 필요하다.
- 혹은 C# 코드 대신 Compute 셰이더를 사용하는 등 CPU 작업 일부를 GPU로 옮기면 된다.
WaitForGfxCommandsFromeMainThread
- 드로우콜 전송을 완료하고 다음 프레임의 요청을 기다림
성능 문제를 찾는데 가장 일반적인 스레드
메인 스레드
- 모든 게임 로직/스크립트가 기본적으로 작업을 수행
- 물리, 애니메이션, UI 및 렌더링 같은 기능 및 시스템에 대부분의 시간이 소요 됨
렌더 스레드
- 메인 스레드에서 Scene을 검사하고 카메라 컬링, 깊이 정렬 및 드로우 콜 일괄 처리를 수행
- 이는 렌더 스레드로 전달되어, GPU에 지시하는데 필요한 그래픽스 API 호출로 변환 작업 수행
- 메인 스레드에서 WaitForGfxCommandsFromeMainThread 로 대기한다면 GPU병목
잡 워커 스레드
- C# 잡 시스템을 사용하여 Worker 스레드에서 실행할 특정 종류의 작업을 예약할 수 있음
- 유니티의 일부 시스템 및 기능은 물리, 애니메이션 및 렌더링과 같은 잡 시스템도 사용
- 메인 스레드에서 WaitForJobGroupID 를 대기한다면 비동기로 구현되어 순서대로 잡을 대기하는 부분이 긴 것.
- 메인 스레드는 대기하면서 잡 스레드의 일을 자기가 부분적으로 직접 수행하기도 한다
유니티에서 프로파일링하기
- 빌드 옵션 중 AutoConnect Profiler
- 초기화 시간이 최대 10초 발생.
- 첫 번째 씬의 초기화를 프로파일링 하려는 경우에만 사용할 것.
- 이거 체크안해도 수동으로 연결이 가능하다.
Profiler Analyzer 프로파일러 아날라이저
- 시간 경과에 따른 성능 문제 파악 (유니티 프로파일러는 한 프레임 만 볼 수 있다)
- 특정 프레임이 아니라 우선순위를 파악하기 위함
메모리 프로파일러
- 우측상단의 느낌표를 눌러서 세부 텍스처 정보 표시가능