루트 서명 제한
루트 서명은 주요 리소스이며 고려할 엄격한 제한과 비용이 있습니다.
메모리 제한 및 비용
루트 서명의 최대 크기는 64개 DWORD입니다.
이 최대 크기는 대량 데이터를 저장하는 방법으로 루트 서명의 남용을 방지하기 위해 선택됩니다. 루트 서명의 각 항목에는 이 64개 DWORD 제한에 대한 비용이 있습니다.
- 설명자 테이블의 경우 각각 1개 DWORD의 비용이 필요합니다.
- 루트 상수의 경우 32비트 값이므로 각각 1개 DWORD 비용이 필요합니다.
- 루트 설명자(64비트 GPU 가상 주소)의 경우 각각 2개 DWORD 비용이 필요합니다.
정적 샘플러에는 루트 서명 크기에 대한 비용이 없습니다.
성능 비용
간접 참조 수준을 기준으로 성능 비용은 루트 상수의 경우 0개, 루트 설명자의 경우 1개, 설명자 테이블의 경우 2개입니다. 루트 서명이 커서 가장 빠른 메모리에서 약간 더 느린 메모리 오버플로되는 경우(일부 하드웨어에서 발생할 수 있음) 루트 서명의 끝에 있는 오버플로 항목의 성능 비용에 1을 추가합니다.
예를 들어 루트 인수 공간용으로 16개 DWORD의 고정된 크기가 있는 하드웨어에서 오버플로가 발생할 수 있습니다. 입력 어셈블러가 사용되는 경우 이 제한은 1씩 추가로 감소할 수 있습니다. 이 경우 루트 서명이 15개 또는 16개 DWORD 기본 메모리에 대해 너무 크면 약간 더 느린 메모리로 오버플로됩니다. 다른 하드웨어에는 고정된 기본 루트 인수 메모리가 없습니다(따라서 오버플로 상황이 발생하지 않음).
모든 하드웨어의 경우 루트 인수가 변경되면 드라이버에서 모든 루트 인수의 버전을 유지 관리해야 합니다(드라이버에서 버전이 관리되지 않는 설명자 힙 및 버퍼 리소스와 같은 다른 스토리지와 다름). 오버플로 상황이 발생하는 하드웨어에서는 변경이 발생한 위치에 따라 기본 또는 오버플로 영역의 버전만 관리해야 합니다. 버전 관리 양은 분명히 필요한 최소값으로 유지되어야 합니다.
일반적으로 다음 지침을 고려합니다.
- 유연하게 더 큰 루트 서명과 균형을 맞추지만 필요에 따라 작은 루트 서명을 사용합니다.
- 매개 변수가 자주 변경될 가능성이 크도록 큰 루트 서명에서 매개 변수를 정렬하거나, 지정된 매개 변수에 대한 낮은 액세스 대기 시간이 중요한 경우에는 먼저 발생시킵니다.
- 사용 가능한 경우 설명자 힙에 상수 버퍼 보기를 넣는 데 루트 상수 또는 루트 상수 버퍼 보기를 사용합니다.
정적 샘플러
정적 샘플러(상태가 완전히 정의되고 변경할 수 없는 샘플러)는 루트 서명의 일부이지만 64개 DWORD 제한으로 계산되지 않습니다. 샘플러를 정적으로 정의할 수 있는 경우 샘플러가 설명자 힙의 일부가 될 필요가 없습니다.
정적 샘플러를 사용하는 성능 비용이 없으며, 루트 서명에는 정적 샘플러(루트 서명 또는 일부 하드웨어의 예약된 공간에 저장됨) 및 동적 샘플러(샘플러 설명자 힙에 저장됨)가 혼합되어 포함될 수 있습니다. 설명자 힙의 샘플러는 동적으로 할당 및 인덱싱될 수 있습니다(정적 샘플러는 이렇게 할 수 없음).
정적 샘플러는 HLSL 셰이더에서 루트 서명의 일부로 기록될 수 있습니다(HLSL의 루트 서명 지정 참조).
관련 항목