가장 비싼 렌더 패스 식별

AGI 프레임 프로파일러를 사용하면 앱의 단일 프레임을 구성하는 데 사용되는 개별 렌더링 패스를 검사할 수 있습니다. 이를 위해 각 그래픽 API 호출을 실행하는 데 필요한 모든 상태를 가로채고 기록합니다. Vulkan에서는 기본적으로 Vulkan의 계층 시스템을 사용하여 이 작업이 이루어집니다. OpenGL에서는 ANGLE을 사용하여 명령을 가로챕니다. ANGLE은 OpenGL 명령을 Vulkan 호출로 변환하여 하드웨어에서 실행될 수 있도록 합니다.

Adreno 기기

비용이 많이 드는 렌더링 패스를 식별하려면 먼저 창 상단에 있는 AGI의 타임라인 뷰를 확인합니다. 여기에는 특정 프레임의 합성을 구성하는 모든 렌더 패스가 시간순으로 표시됩니다. GPU 큐 정보가 있을 경우 시스템 프로파일러에 표시되는 것과 동일한 뷰입니다. 또한 렌더링되는 프레임 버퍼의 해상도와 같은 렌더 패스에 관한 기본 정보를 표시하여 렌더 패스 자체에서 발생하는 상황에 관한 유용한 정보를 제공할 수 있습니다.

프레임 타임라인 뷰
그림 1. 프레임 타임라인 뷰

렌더링 패스를 조사하는 데 사용할 수 있는 첫 번째 기준은 소요 시간입니다. 가장 긴 렌더 패스는 개선 가능성이 가장 큰 렌더 패스일 가능성이 높으므로 먼저 해당 패스를 살펴보세요.

프레임 타임라인 뷰에서 가장 긴 렌더링 패스 식별
그림 2. 프레임 타임라인 뷰에서 가장 긴 렌더링 패스 식별

관련 렌더 패스와 관련된 GPU 슬라이스는 렌더링 패스 내에서 발생하는 상황에 관한 일부 정보를 이미 제공합니다.

  1. 비닝: 꼭짓점이 화면에 들어가는 위치를 기준으로 구간에 배치되는 위치
  2. 렌더링: 픽셀이나 프래그먼트가 음영 처리되는 위치
  3. GMEM 로드/저장: 프레임 버퍼의 콘텐츠가 내부 GPU 메모리에서 기본 메모리로 로드 또는 저장되는 경우

렌더링 패스 내에서 각 요소가 얼마나 많은 시간을 소요하는지 살펴보면 잠재적인 병목 현상이 어디에 있는지 파악할 수 있습니다. 예:

  • 비닝에 많은 시간이 소요되는 경우 꼭짓점 데이터가 너무 많거나 꼭짓점이 많거나 꼭짓점과 관련된 기타 문제가 있는 꼭짓점 데이터에 병목 현상이 있음을 시사합니다.
  • 렌더링에 대부분의 시간을 차지하는 경우 음영이 병목 현상인 것입니다. 복잡한 셰이더, 너무 많은 텍스처 가져오기, 필요하지 않은 경우 고해상도 프레임 버퍼 렌더링 또는 기타 관련 문제 등이 원인일 수 있습니다.

GMEM 로드와 매장도 명심해야 할 사항입니다. 그래픽 메모리에서 메인 메모리로 이동하는 데는 많은 비용이 듭니다. 따라서 로드 또는 저장 작업의 양을 최소화하면 성능에도 도움이 됩니다. 이에 관한 일반적인 예는 깊이/스텐실 버퍼를 기본 메모리에 쓰는 GMEM 저장 깊이/스텐실을 사용하는 것입니다. 향후 렌더 패스에서 이 버퍼를 사용하지 않으면 이 저장 작업을 제거하여 프레임 시간과 메모리 대역폭을 절약할 수 있습니다.

GMEM 로드 및 스토어 식별
그림 3. GMEM 로드 및 저장소 식별

대규모 렌더링 패스 조사

렌더링 패스 중에 실행된 모든 개별 그리기 명령어를 확인하는 방법은 다음과 같습니다.

  1. 타임라인에서 렌더링 패스를 클릭합니다. 그러면 프레임 프로파일러명령어 창에 있는 계층 구조에서 렌더링 패스가 열립니다.

  2. 렌더 패스의 메뉴를 클릭하면 렌더 패스 중에 실행된 모든 개별 그리기 명령어가 표시됩니다. OpenGL 애플리케이션이라면 더 자세히 살펴보고 ANGLE에서 실행한 Vulkan 명령어를 확인할 수 있습니다.

명령어 창
그림 4. 명령어 창

그리기 호출 중 하나를 선택합니다. 그러면 Framebuffer 창이 열립니다. 이 창에는 그리기 중에 바인딩된 모든 프레임 버퍼 첨부파일과 연결된 프레임 버퍼에서의 그리기 결과가 표시됩니다. 여기서 AGI를 사용하여 이전 그리기 호출과 다음 그리기 호출을 모두 열고 두 호출의 차이를 비교할 수도 있습니다. 시각적으로 거의 동일하다면 최종 이미지에 기여하지 않는 그리기 호출을 제거할 수 있다는 의미입니다.

Commands 창에서 개별 그리기 호출 선택
그림 5. 명령어 창에서 개별 그리기 호출 선택

이 그리기의 Pipeline 창을 열면 그래픽 파이프라인에서 이 그리기 호출을 실행하는 데 사용하는 상태가 표시됩니다.

파이프라인 창
그림 6. 파이프라인 창

입력 어셈블러는 꼭짓점 데이터가 이 그리기에 결합되는 방식에 대한 정보를 제공합니다. 비닝이 렌더링 패스 시간의 많은 부분을 차지하는 경우 조사하기에 좋습니다. 여기에서 꼭짓점 형식, 그려진 꼭짓점 수, 꼭짓점이 메모리에 배치되는 방식에 관한 정보를 확인할 수 있습니다. 자세한 내용은 꼭짓점 형식 분석을 참고하세요.

파이프라인 창의 입력 어셈블러 섹션
그림 7. 파이프라인 창의 입력 어셈블러 섹션

Vertex Shader 섹션은 그리기 중에 사용한 꼭짓점 셰이더에 대한 정보를 제공하며 비닝이 문제로 식별되었는지 조사하기에 좋은 장소일 수 있습니다. 사용된 셰이더의 SPIR-V 및 디컴파일된 GLSL을 확인하고 이 호출에 바인드된 균일 버퍼를 조사할 수 있습니다. 자세한 내용은 셰이더 성능 분석을 참고하세요.

파이프라인 창의 Vertex Shader 섹션
그림 8. 파이프라인 창의 Vertex Shader 섹션

래스터라이저 섹션에는 파이프라인의 고정 함수 설정에 관한 정보가 더 많이 표시되며, 표시 영역, 시저, 깊이 상태, 다각형 모드와 같은 고정 함수 상태의 디버깅 용도로 더 많이 사용할 수 있습니다.

파이프라인 창의 래스터라이저 섹션
그림 9. Pipeline 창의 래스터라이저 섹션

프래그먼트 셰이더 섹션은 Vertex 셰이더 섹션에 있는 것과 동일한 많은 정보를 제공하지만 프래그먼트 셰이더에만 한정됩니다. 이 경우 핸들을 클릭하여 실제로 바인딩 중인 텍스처를 확인하고 조사할 수 있습니다.

파이프라인 창의 프래그먼트 셰이더 섹션
그림 10. 파이프라인 창의 프래그먼트 셰이더 섹션

소규모 렌더링 패스 조사

GPU 성능을 개선하는 데 사용할 수 있는 또 다른 기준은 작은 렌더 패스 그룹을 살펴보는 것입니다. 일반적으로 렌더 패스의 양을 최대한 최소화하는 것이 좋습니다. GPU가 한 렌더 패스에서 다른 렌더 패스로 상태를 업데이트하는 데 시간이 걸리기 때문입니다. 이러한 더 작은 렌더링 패스는 일반적으로 그림자 맵 생성, 가우시안 블러 적용, 휘도 추정, 후처리 효과 실행 또는 UI 렌더링과 같은 작업을 수행하는 데 사용됩니다. 일부는 단일 렌더링 패스로 통합될 수 있으며, 비용을 정당화할 만큼 전체 이미지에 영향을 미치지 않는 경우 완전히 제거될 수도 있습니다.

네이티브 해상도 버퍼를 다운샘플링하는 데 사용되는 더 작은 렌더링 패스
그림 11. 네이티브 해상도 버퍼를 다운샘플링하는 데 사용되는 더 작은 렌더링 패스