nyancoder

WWDC 2021 - Discover Metal debugging, profiling, and asset creation tools 본문

WWDC/WWDC 2021

WWDC 2021 - Discover Metal debugging, profiling, and asset creation tools

nyancoder 2021. 10. 7. 02:14

원본 영상: https://developer.apple.com/videos/play/wwdc2021/10157/

 

Ray tracing support

  • 우선 레이 트레이싱에서는 작년에 새로운 Metal ray tracing API가 추가되었습니다.
  • Xcode 13에서는 셰이더에 유연성을 제공하는 함수 포인터. 함수 테이블을 Metal Debugger에서 지원합니다.
  • 재사용 가능한 셰이더 라이브러리를 위한 동적 라이브러리를 지원합니다.
  • 새로운 도구인 Acceleration Structure Viewer가 추가되었습니다.

  • ModernRenderer 샘플 앱의 GPU Trace 화면을 보면 위와 같이 Ray tracing을 사용한 장면을 볼 수 있습니다.

  • 왼쪽에서 원하는 호출을 선택한 다음 가속 구조 뷰어를 선택하면 오른쪽에서는 전체 화면의 윤곽선이 나타나고 왼쪽에서는 각 항목들이 표시됩니다.

  • 해당 장면에서 인스턴스를 클릭하면 오른쪽의 화면에서 해당 인스턴스가 선택된 것을 볼 수 있습니다.
  • 또한 선택된 인스턴스의 변환 행렬을 볼 수 있습니다.

  • Option 키 를 누른 상태에서 장면 뷰어를 클릭하여 개별 객체를 선택할 수 있으며, 이 경우 왼쪽 항목 개요에서도 선택됩니다.
  • 반대로 항목 개요에서도 선택한 경우에도 오른쪽 이미지에서 표시됩니다.

  • 가속 구조 뷰어에서는 장면의 특정 속성을 시각화하는데 도움이 되는 여러 강조 모드를 지원합니다.

  • 예를 들어 Bounding Volume Traversals를 선택하면 더 짙은 파란색일수록 Bounding Volume의 계산이 많이 드는 영역이 표시됩니다.

  • 화면의 각 부분 위로 마우스를 가져가면 작은 미리 보기 화면에서 Bounding Volume Traversals의 교차 수를 표시합니다.

  • 더 많은 유연성을 지원하는 설정을 통해 원하는 옵션을 설정할 수 있습니다.

 

New profiling workflows

  • 프로파일링은 중요한 기능이며, 다양한 프로파일러가 준비되어 있습니다.

  • Metal 시스템 추적을 사용하여 각 렌더링의 단계와, GPU 카운터, 셰이더 타임라인에 대한 CPU 및 GPU 시간을 표시하는 타임라인을 볼 수 있습니다.

  • Metal Debugger에서 제공되는 GPU 카운터를 통해 인코딩이나 드로우당 GPU에서 측정할 수 있는 수치들을 보여줍니다.

  • 이 두 가지 기능을 통합하여 Apple GPU를 위해 특별히 새로 설계된 Metal Debugger의 GPU 타임라인이 추가되었습니다.
  • 성능 데이터에 대한 새로운 관점을 제공하고 앱에서 최적화 지점을 찾는 데 도움이 될 수 있습니다.

  • 우선 GPU 인코더 과정을 보면 과정을 보면 Apple GPU에서 서로 다른 렌더 패스의 Vertex, Rendering, Compute 작업이 동시에 실행될 수 있습니다.
  • 이는 Apple GPU 아키텍처와 "타일 기반 지연 렌더링" 기술을 사용하여 동작합니다.

  • GPU Timeline의 상단을 보면 위에서 처럼 Vertex, Fragment, Compute 인코더 타임라인을 볼 수 있습니다.
  • 또한 각 인코더가 사용하는 리소스를 한눈에 확인할 수 있습니다.

  • 그 아래에는 점유, 대역폭, 제한 카운터가 있습니다.

  • 각 타임라인을 더 확장하면 개별 셰이더가 표시됩니다.

  • 인코더 항목을 선택하면 오른쪽에 인코더 목록이 표시되며, 여기에서 평균 소요 시간별로 정렬할 수 있습니다.

  • 개별 인코더를 클릭하면 이 인코더에 연결된 이미지들과 같은 상세 정보를 오른쪽에서 확인할 수 있습니다.
  • 또한 선택된 인코더가 활성화된 시간이 모든 트랙에서 강조 표시됩니다.

  • 카운터 탭의 GPU 카운터 항목이나, 인코더의 콘텍스트 메뉴의 카운터를 통해 카운터 정보를 표시할 수 있습니다.

  • Metal에서 GPU 성능 상태는 운영체제에서 관리하는 매우 중요한 요소입니다.
  • 이 값은 기기의 온도, 시스템 설정, GPU 사용률 등의 매개변수에 따라 값이 낮아지거나 높아지며 프로파일 결과에 영향을 줄 수 있습니다.

  • 보다 일관된 결과로 앱을 프로파일링 할 수 있는 새로운 방법이 추가되었습니다.
  • Instruments를 통해 Metal 시스템의 라이브 성능을 추적할 수 있습니다.
  • Metal Debugger를 사용하여 GPU 추적 프로파일링을 할 수 있습니다.
  • Device conditions를 통해 GPU 성능 상태를 보고 확인할 수 있습니다.

  • Metal System Trace에 GPU 성능 상태에 대한 트랙이 추가되었습니다.

  • 새로운 기능으로 Instruments에서 기록을 시작하기 전에 Recording Option메뉴에서 Performance State를 선택하여 특정 GPU 성능 상태를 유도할 수 있습니다.

  • 선택된 성능 상태는 기기가 해당 상태를 유지할 수 있는 경우 선택한 상태를 유도합니다.
  • 기록된 Instruments 트레이스에서는 정보 항목의 "Recording Settings"에서 유도된 GPU 성능 상태를 확인할 수 있습니다.

  • Metal Debugger에서도 동일하게 성능상태를 설정할 수 있으며, Xcode 하단의 스톱워치 버튼을 눌러 설정할 수 있습니다.

  • 다시 프로파일링을 수행하여 프로파일링이 종료되면, 일관된 성능 상태가 달성되었음을 반영하기 위해 버튼이 강조 표시됩니다.

  • 요약 페이지의 "성능" 항목에는 새로운 성능 데이터와 선택한 성능 상태가 표시됩니다.

  • GPU 성능 상태를 설정하는 세 번째 방법은 Device and Simulator메뉴에서 장치 조건을 설정하는 것입니다.
  • 운영 체제가 해당 조건을 유지할 수 있고, Xcode에 연결된 상태를 유지하는 동안은 지정된 상태를 사용하도록 강제합니다.
  • GPU 성능 상태 변경 사항을 장치에 적용하려면 시작을 누르고 중지를 누르면 완료됩니다.

  • Metal Debugger에 추가된 개선사항들에는 셰이더 유효성 검사, 정밀한 캡처 컨트롤, 새로운 파이프라인 상태 워크플로, 셰이더 디버깅 및 프로파일링이 있습니다.

  • 작년 Xcode 12에서는 셰이더 유효성 검사를 도입하여, 범위를 벗어난 접근과 같은 런타임의 GPU 오류를 진단할 수 있었습니다.
  • 셰이더 유효성 검사 중 오류가 발생하면, 오류가 발생한 호출에 대한 CPU 및 GPU 추적이 표시됩니다.

  • 올해에는 간접 명령 버퍼, 동적 라이브러리, 함수 포인터 및 테이블을 사용할 때에도 쉐이더 검증을 사용할 수 있도록 지원 범위를 확장하였습니다.

  • 새로운 정밀 캡처 컨트롤을 위해 Xcode 하단의 Capture 버튼을 클릭하면 최대 5개까지의 프레임을 선택할 수 있습니다.

  • 또한 캡처를 수행할 장치나 명령 대기열, 메탈 레이어, 커스텀 범위를 설정할 수 있습니다.
  • 이를 통해 캡처하는 방법과 시기를 결정할 수 있습니다.

  • 파이프라인 상태 검사를 위하여 예를 들어 샘플 앱에서 GPU 캡처를 수행한 다음, 원하는 파이프라인 상태를 선택할 수 있습니다.

  • 이를 선택하여 열면 파이프라인 상태가 가진 여러 속성이나 성능 관련 데이터를 확인할 수 있습니다.

  • Xcode 13에서 메모리 뷰어는 앱에서 파이프라인 상태가 차지하는 메모리 양을 보여줍니다.

  • Metal Debugger의 셰이더 디버깅 및 프로파일링 기능을 사용하려면 두 가지 옵션이 있습니다.
  • 첫 번째는 앱이 실행 중일 때 소스 코드에서 라이브러리를 컴파일하는 것입니다.
  • 두 번째로 더 나은 옵션은 소스가 포함된 Metallib 파일을 오프라인으로 빌드 한 다음 런타임에 로드하는 것입니다.
  • 그러나 App Store 규칙이 디버그 Metallib를 사용하여 앱을 게시하는 것을 허용하지 않기 때문에 라이브러리를 오프라인으로 컴파일하고 셰이더를 디버그 할 수 있도록 하려면 두 번 컴파일해야 합니다.

  • 이제는 Metallib를 컴파일하는 동안 소스 및 기타 디버깅 정보가 포함된 별도의 파일을 생성할 수 있습니다.
  • 이 파일은 Metallibsym 확장자를 가집니다.
  • 따라서 라이브러리 자체에 추가 정보를 포함하지 않고도 셰이더를 디버그하고 프로파일링 할 수 있으며 앱의 릴리즈 버전에서도 셰이더를 디버그 할 수 있습니다.

  • 셰이더 소스 파일을 Metallibsym파일과 함께 Metallib로 컴파일하기 위해서는 "-record-sources=flat" 옵션을 추가하여 컴파일하면 됩니다.

  • 이제 이렇게 컴파일된 셰이더를 디버그 하려고 하면 소스를 가져올 수 있는 대화 상자가 표시됩니다.

  • 소스 가져오기를 클릭하면 모든 라이브러리와 소스 파일을 가져왔는지 표시하는 대화 상자가 열립니다.
  • 여기에서 Metallibsym 파일을 가져올 수 있으며, 만일 가져오게 되면 라이브러리와 해당 소스가 자동으로 매치됩니다.

  • 가져오기를 완료하고 대화 상자를 닫으면 쉐이더의 소스를 보면서 디버그 할 수 있습니다.

  • "선택적 쉐이더 디버깅"을 통해 큰 쉐이더에서의 디버깅 범위를 좁혀, 더 빠른 디버깅을 할 수 있게 도와줍니다.

  • 전체 코드를 디버그 하려고 하면 쉐이더 디버거를 시작하는데 시간이 걸리므로 원하는 함수에서 우클릭하여 "Debug Function"을 선택하면 디버거가 즉시 시작됩니다.

 

Advances in texture compression

  • 텍스처 압축은 텍스처 데이터를 손실 압축합니다.
  • 주로 정적 텍스처 데이터를 오프라에서 압축하기 위한 것입니다.
  • 대부분의 텍스처 압축은 텍스처를 블록으로 분할하고 각 블록을 색상으로 압축합니다.
  • Apple GPU는 A12 장치부터 지원하는 무손실 프레임 버퍼 압축을 지원하여 대역폭 최적화에 도움을 줍니다.

  • 이처럼 텍스처 압축을 사용하면 메모리에 더 많은 텍스처를 로드할 수 있습니다.
  • 또한 같은 용량으로 더 세부적인 텍스처를 사용하여 시각적으로 더 높은 품질을 얻을 수 있습니다.
  • 압축을 통해 앱의 크기와 메모리 공간을 줄일 수 있습니다.

iOS SDK의 기존 TextureTool을 사용하면 입력 이미지를 읽고 필요한 경우 밉맵을 생성 한 다음, 텍스처를 블록별로 압축하여 결과를 출력 파일에 기록합니다.

  • 추가적인 텍스처 처리를 위해 TextureConverter라는 새로운 압축 도구가 추가되었습니다.
  • TextureConverter는 널리 사용되는 압축기들을 활용하여 다양한 압축 형식을 지정할 수 있도록 지원하고, 압축 속도와 이미지 품질 간의 균형을 맞출 수 있는 옵션을 제공합니다.
  • 또한 텍스처 처리에서 감마를 인식하며, macOS와 Windows, Apple Silicon 모두 지원합니다.
  • 처리의 각 단계에서 감마 보정은 이미지의 휘도를 인코딩 및 디코딩하는 비선형 작업입니다.
  • 데칼이나 라이트 맵과 같은 대부분의 시각적 데이터는 sRGB와 같은 비선형 공간에서 인코딩할 때 가장 잘 작동합니다.
  • 노멀 맵과 같은 비시각적 데이터는 선형 공간으로 인코딩 되어야 합니다.
  • "gamma_in" 및 "gamma_out" 옵션으로 지정된 색 공간에서 압축을 수행합니다.
  • 선형 감마 공간에 소수점 값을 입력하거나 "sRGB" 문자열을 사용하여 해당 색상 공간을 지정할 수 있습니다.

  • 밉맵 생성과 같은 다른 작업은 선형 공간에서 수행해야 합니다.
  • 선형 공간 작업은 변환, 밉맵 생성, 알파 처리의 단계를 거칩니다.
  • 변환 작업은 최대 크기를 정의하여 최상위 밉맵에 필요한 만큼 이미지를 축소할 수 있으며, 크기 및 반올림 모드를 설정할 수 있습니다.
  • 크기 조정 옵션은 밉맵의 흐릿함을 줄이는 데 도움이 됩니다.

  • 반올림 모드는 이미지 크기를 조정할 때 max_extent와 함께 사용되며, max_extent를 초과하면 원본 이미지의 가로 세로 비율을 유지하여 소스 이미지의 크기가 조정됩니다.
  • 이 단계의 뒤집기 옵션을 사용하면 X, Y, Z축의 선형 변환을 제어할 수 있습니다.

  • 밉맵은 렌더링 속도를 높이고 앨리어싱을 줄이기 위해 미리 계산된 이미지입니다.
  • 각 레벨의 높이와 너비는 이전 레벨보다 절반입니다.
  • 밉맵 생성을 사용자 정의할 때 원하는 최대 수 와 사용할 필터를 지정합니다.
  • TextureConverter는 기본적으로 Kaiser 필터를 사용합니다.

  • 알파가 활성화된 경우 지정된 알파 참조 값을 사용하여 적용됩니다.
  • alpha_to_coverage는 알파 블렌딩을 커버리지 마스크로 대체합니다.
  • 앤티 앨리어싱 또는 반투명 텍스처를 사용하면 순서와 무관한 투명도를 얻을 수 있으며 게임에서 짙은 녹색을 렌더링 하는데 특히 유용합니다.

  • 그 후 알파 채널을 버리거나, 보존하거나, 미리 곱하는 옵션 이 표시됩니다.

  • 텍스처 처리의 마지막 단계인 압축 단계는 채널 매핑과 인코딩의 두 가지 단계로 이루어져 있습니다.
  • 채널 매핑은 특정 데이터 유형에 대한 범용 텍스처 압축 알고리즘을 적용합니다.
  • TextureConverter에서 채널 매핑을 지정하는 것은 선택 사항이며 RGBM 인코딩과 노멀 맵 인코딩의 두 가지 채널 매핑 모드를 지원합니다.

  • RGBM 인코딩은 HDR 데이터를 LDR 형식으로 압축하는 기술입니다.
  • RGBM 인코딩 메커니즘을 의사 코드를 통해 EncodeRGBM 함수에서 볼 수 있습니다.
  • RGBM 범위를 설정하는 RGBM_Range의 기본값은 6.0입니다.

  • 디코딩 메커니즘 또한 의사 코드를 통해 DecodeRGBM 함수에서 볼 수 있습니다.

  • 노멀 맵의 경우 객체 공간에서 법선을 인코딩할 때 각 법선이 단위 벡터입니다.
  • 텍스처 압축 알고리즘을 활용하기 위해서 이 값들을 다시 매핑할 수 있습니다.
  • 채널을 다시 매핑하는 방법 은 압축 형식에 따라 다르며 위의 차트를 가이드로 이용할 수 있습니다.
  • 예를 들어 ASTC로 노멀을 인코딩하는 경우 빨강, 녹색, 파랑 채널은 X로 설정되고 알파 채널은 Y로 설정됩니다.
  • TextureConverter는 노멀 맵 매개변수를 전달하면 선택한 형식으로 자동 재 매핑하여 인코딩을 처리합니다.

  • 셰이더에서 노멀 맵을 샘플링할 때 채널 매핑을 참고하여 샘플링하여야 합니다.
  • ASTC 예의 경우 텍스처를 샘플링하기 위한 X는 red 채널에서 샘플링하고 Y는 알파 채널에서 샘플링해야 하며, 이는 법선이 인코딩 된 방식의 반대입니다.

  • Metal texture swizzles를 사용하는 런타임 샘플링의 예는 위와 같습니다.
  • Swizzles를 사용하여 X, Y요소를 red, green채널에 다시 매핑할 수 있으므로 셰이더가 압축 형식에 무관하게 동작할 수 있습니다.
  • 예를 들어 위의 예에서는 ASTC로 압축된 노멀 맵에 대해 red, green 채널로 다시 매핑하는 예입니다.
  • red 채널은 MTLTextureSwizzleRed로 설정되고 green 채널은 MTLTextureSwizzleAlpha로 설정됩니다.

  • X, Y 채널 이 셰이더에서 샘플링되면 Z를 계산할 수 있습니다.

  • 모든 TextureConverter 명령에는 compression_format 인수를 사용하여 대상 압축 형식을 지정해야 합니다.

  • compressor 옵션을 기반으로 선택할 수 있습니다.
  • 압축 품질을 4가지 형식 죽에서 선택할 수 있습니다.

  • 위 예는 Apple 플랫폼에서 지원되는 텍스처 압축 형식 제품군에 대한 개요입니다.
  • iOS 및 Apple Silicon 플랫폼은 ASTC 및 PVRTC 제품군을 지원합니다.
  • macOS 플랫폼은 BCn 제품군을 지원합니다.

  • BCn 형식은 모두 4x4 픽셀 블록을 사용하여 동작하며, 픽셀 당 4 또는 8비트를 사용하는 7가지 형식의 집합입니다.
  • BC1 및 BC3은 일반적으로 RGB 및 RGBA 압축에 사용됩니다.
  • BC6은 HDR 이미지에 이상적입니다.
  • 이중 독립 채널이 있는 BC5는 노멀 맵 인코딩에 이상적입니다.

  • ASTC 형식 제품군은 모든 크기에서 최고 품질을 지원하기 때문에, 일반적으로 PVRTC보다 권장됩니다.

  • 최고 품질은 4x4 블록 크기이며 가장 낮은 압축률을 가집니다.
  • 최저 품질은 12x12 블록 크기이며 가장 높은 압축률을 가집니다.
  • LDR, sRGB, HDR는 압축된 ASTC 텍스처의 색상 범위를 지정하며, LDR 및 sRGB는 모두 0:1 범위에 있는 반면 HDR 변형 은 0:1 범위 밖의 데이터를 가질 수 있습니다.

  • PVRTC 형식은 2비트 또는 4비트 모드의 RGB 및 RGBA에서 사용할 수 있습니다.

  • iOS 장치에서는 A7 GPU 이하를 지원하는 경우에만 항상 ASTC 압축을 사용해야 합니다.
  • HDR 텍스처가 있는 경우 A13 이상 GPU에서 ASTC HDR을 활용할 수 있습니다.
  • macOS의 경우 BCn은 일반적으로 사용할 수 있습니다.
  • Apple Silicon Mac에서는 ASTC도 사용할 수도 있습니다.
  • PVRTC는 Apple Silicon에서 사용할 수 있지만 iOS 레거시 지원을 위한 것이기 때문에 권장하지 않습니다.

  • TextureTool 호환 모드 또는 기본 옵션으로 TextureConverter를 호출하는 경우 xcrun TextureConverter을 통해 호출합니다.
  • TextureConverter는 주어진 옵션을 옵션이 무엇인지 알려주기 때문에 빌드 스크립트를 쉽게 업데이트할 수 있습니다.

  • TextureConverter는 Xcode 13의 일부로 제공됩니다.
  • Windows에서는 developer.apple.com에서 Windows 2.0용 Metal 개발자 도구 패키지의 일부로 제공되지만, PVRTC는 지원되지 않습니다.

  • Windows용 Metal Compiler는 작년에 출시되었으며, Metal Shading Language 버전 2.3을 지원합니다.
  • 최신 릴리즈 버전은 Apple Silicon Mac에서 Metal Shading Language에 대한 지원을 포함하는 1.2입니다.
  • 버전 2.0에서는 Metal Shading Language 2.4의 새 기능을 사용할 수 있습니다.

 

목차: https://nyancoder.tistory.com/2

Comments