다음을 통해 공유


설명자 힙 개요

설명자 힙은 PSO(파이프라인 상태 개체)에 속하지 않는 많은 개체 유형[예: SRV(셰이더 리소스 뷰), UAV(순서가 지정되지 않은 액세스 뷰), CBV(상수 버퍼 뷰) 및 샘플러]을 포함합니다.

설명자 힙의 용도

설명자 힙의 기본 용도는 셰이더에서 최대한 많은 수의 렌더링 창(이상적으로 전체 렌더링 프레임)으로 참조하는 개체 형식의 설명자 사양을 저장하는 데 필요한 대량의 메모리 할당량을 포함하는 것입니다. 애플리케이션에서 파이프라인이 API에서 빠르게 보는 텍스처를 전환하는 경우 필요한 모든 상태 세트에 대해 즉석에서 설명자 테이블을 정의하기 위한 공간이 설명자 힙에 있어야 합니다. 애플리케이션은 리소스가 다른 개체에서 다시 사용되는 경우 정의를 다시 사용하도록 선택하거나, 다양한 개체 형식을 전환할 때 순차적으로 힙 공간을 할당할 수 있습니다.

또한 설명자 힙을 사용하면 개별 소프트웨어 구성 요소가 서로 별개로 설명자 스토리지를 관리할 수 있습니다.

모든 힙은 CPU에 표시됩니다. 또한 애플리케이션은 설명자 힙에 필요한 CPU 액세스 속성(쓰기 조합, 다시 쓰기 등)을 요청할 수 있습니다. 앱은 원하는 속성으로 원하는 수만큼 설명자 힙을 만들 수 있습니다. 앱은 항상 크기가 제한되지 않는 준비 전용 설명자 힙을 만든 후 필요에 따라 렌더링하는 데 사용되는 설명자 힙으로 복사할 수 있는 옵션을 제공합니다.

동일한 설명자 힙에 포함될 수 있는 항목과 관련해서 몇 가지 제한이 있습니다. CBV, UAV 및 SRV 항목은 동일한 설명자 힙에 있을 수 있습니다. 그러나 샘플러 항목은 CBV, UAV 또는 SRV 항목과 힙을 공유할 수 없습니다. 일반적으로 일반 리소스용과 샘플러용의 두 가지 설명자 힙 세트가 있습니다.

Direct3D 12에서 설명자 힙을 사용하는 방식은 대부분의 GPU 하드웨어의 경우와 비슷합니다. 즉, 설명자는 설명자 힙에서만 활성 상태를 유지하면 되며, 이러한 힙이 사용될 경우 몇 개의 주소 지정 비트만 있으면 됩니다. Direct3D 12에서는 설명자 힙을 사용해야 하며, 메모리에 설명자를 추가할 수 있는 옵션은 없습니다.

설명자 힙은 CPU에서만 즉시 편집할 수 있으며, GPU에서 설명자 힙을 편집하는 옵션은 없습니다.

동기화

설명자 힙 콘텐츠는 해당 콘텐츠를 참조하는 명령 목록을 기록하기 전, 도중 및 후에 변경할 수 있습니다. 그러나 실행을 위해 제출된 명령 목록이 해당 위치를 참조할 수 있는 경우에는 경합 상태가 발생할 수 있으므로 설명자를 변경할 수 없습니다.

바인딩

한 번에 하나의 CBV/SRV/UAV 조합 힙과 하나의 샘플러 힙만 바인딩할 수 있습니다. 이러한 힙은 그래픽 공유 및 컴퓨팅 파이프라인(해당 PSO에 설명됨) 사이에서 공유됩니다.

힙 전환

애플리케이션에서 SetDescriptorHeapsReset API를 사용하여 동일한 명령 목록 내 또는 다른 명령 목록에서 힙을 전환할 수 있습니다. 일부 하드웨어에서는 이 경우 현재 바인딩된 설명자 힙에 의존하는 모든 작업을 플러시하기 위해 GPU를 정지해야 하므로 많은 비용이 초래될 수 있습니다. 따라서 설명자 힙을 변경해야 할 경우 애플리케이션은 GPU 워크로드 양이 비교적 적어서 명령 목록을 시작하는 정도로만 변경 작업을 제한할 수 있을 때만 이러한 작업을 시도하는 것이 좋습니다.

번들

번들을 사용할 경우 SetDescriptorHeaps 메서드를 한 번만 호출할 수 있으며, 설명자 힙 세트가 번들을 호출하는 명령 목록의 설명자 힙과 정확히 일치해야 합니다. 번들이 설명자 테이블을 변경하지 않는 경우 설명자 힙을 설정할 필요가 없습니다.

번들에서 사용할 수 없는 API 호출 목록에 대해서는 명령 목록 및 번들 생성 및 기록을 참조하세요.

관리

모든 개체를 한 장면으로 렌더링하려면 많은 설명자가 필요하며, 준수해야 하는 여러 다른 관리 전략이 있습니다.

가장 기본적인 전략은 다음 그리기 호출에 대한 모든 요구 사항으로 설명자 힙의 새 영역을 채우는 것입니다. 따라서 명령 목록에서 그리기 호출을 실행하기 전에, 설명자 테이블 포인터를 새로 채운 테이블의 처음 부분으로 설정할 수 있습니다. 장점은 힙에서 특정 설명자의 위치를 기록할 필요가 없다는 것입니다.

이 전략의 단점은 설명자 힙에 설명자가 상당히 여러 번 반복될 수 있다는 것입니다. 비슷한 장면을 렌더링할 때 이러한 문제가 두드러지며 이로 인해 설명자 힙 공간이 빠르게 고갈될 수 있습니다. 충돌을 방지하기 위해서는 GPU에서 렌더링되는 설명자와 CPU에서 기록되는 설명자에 대해 별도 설명자 힙을 유지하는 것이 필요할 수 있습니다. 또는 하위 할당 시스템을 사용할 수 있습니다.

또한 필요한 새 설명자만 추가될 수 있도록, 하나의 그리기 호출부터 다음 그리기 호출로 겹치는 설명자 테이블을 신중히 사용하여 기본 시스템을 좀 더 최적화할 수 있습니다.

기본 전략보다 좀 더 효율적인 전략은 장면에 속하는 것으로 알려진 개체(또는 재료)에 필요한 설명자로 설명자 힙을 미리 채우는 것입니다. 이 경우 설명자 힙을 미리 채우기 때문에 그릴 때 설명자 테이블만 설정하면 됩니다.

미리 채우기 전략을 변형한 방식으로는 설명자 힙을 하나의 거대한 배열로 취급하여 알려진 고정 위치에 모든 필수 설명자를 포함하는 것이 있습니다. 그러면 그리기 호출은 설명자가 사용되어야 하는 배열에 대한 인덱스에 해당하는 상수 세트만 수신하면 됩니다.

설명자 힙에 상수를 배치하지 않고, 루트 상수 및 루트 설명자가 가장 자주 변경되는 항목을 포함하도록 하면 좀 더 최적화됩니다. 대부분의 하드웨어에서는 이 방법이 상수를 처리하는 효율적인 방법입니다.

실제로 그래픽 엔진은 상황에 따라 다른 전략을 사용하며, 각 전략의 요소를 조합하여 특정 그리기 요구를 충족할 수 있습니다.

설명자 힙