다음을 통해 공유


API 계층(Direct3D 10)

Direct3D 10 런타임은 코어의 기본 기능부터 시작하여 외부 계층에서 선택적 및 개발자 지원 기능을 빌드하는 계층으로 구성됩니다.

코어 계층

핵심 계층은 기본적으로 존재합니다. API와 디바이스 드라이버 간에 매우 얇은 매핑을 제공하여 고주파 호출에 대한 오버헤드를 최소화합니다. 핵심 계층은 성능에 필수적이므로 중요한 유효성 검사만 수행합니다.

나머지 계층은 선택 사항입니다. 일반적으로 계층은 기능을 추가하지만 기존 동작은 수정하지 않습니다. 예를 들어 코어 함수는 인스턴스화되는 디버그 계층과 관계없이 동일한 반환 값을 갖지만 디버그 계층이 인스턴스화되면 추가 디버그 출력이 제공될 수 있습니다.

D3D10CreateDevice를 호출하고 하나 이상의 D3D10_CREATE_DEVICE_FLAG 값을 제공하여 디바이스를 만들 때 계층을 만듭니다.

디버그 계층

디버그 계층은 포괄적인 추가 매개 변수 및 일관성 검사(예: 셰이더 연결 및 리소스 바인딩 유효성 검사, 매개 변수 일관성 검사 및 오류 설명 보고)를 제공합니다. 디버그 계층에서 생성된 출력은 ID3D10InfoQueue 인터페이스 를 사용하여 액세스할 수 있는 문자열 큐로 구성됩니다( ID3D10InfoQueue(Direct3D 10)를 사용하여 디버그 출력 사용자 지정 참조). 코어 계층에서 생성된 오류는 디버그 계층의 경고와 함께 강조 표시됩니다.

디버그 계층을 지원하는 디바이스를 만들려면 DirectX SDK를 설치한 다음(D3D10SDKLayers.DLL 가져오기 위해) D3D10CreateDevice를 호출할 때 D3D10_CREATE_DEVICE_DEBUG 플래그를 지정해야 합니다. 물론 디버그 계층을 사용하여 애플리케이션을 실행하면 상당히 느려집니다. D3DX10 API에 대한 디버그 메시지를 사용하거나 사용하지 않도록 설정하려면 D3DX10DebugMute를 호출합니다.

디버그 계층은 메모리 누수를 나열할 때 해당 이름과 함께 개체 인터페이스 포인터의 목록을 출력합니다. 기본 식별 이름은 "<이름 없음>"입니다. ID3D10DeviceChild::SetPrivateData 메서드와 D3Dcommon.h에 있는 WKPDID_D3DDebugObjectName GUID를 사용하여 식별 이름을 설정할 수 있습니다. 예를 들어 sDKLayer 이름이 mytexture.jpg pTexture의 이름을 지정하려면 다음 코드를 사용합니다.

const char c_szName[] = "mytexture.jpg";
pTexture->SetPrivateData( WKPDID_D3DDebugObjectName, sizeof( c_szName ) - 1, c_szName );

일반적으로 프로덕션 버전에서 이러한 호출을 컴파일해야 합니다.

참조 계층으로 전환

이 계층을 사용하면 애플리케이션이 HAL(하드웨어 디바이스)과 참조 또는 REF(소프트웨어 디바이스) 간에 전환할 수 있습니다. 디바이스를 전환하려면 먼저 참조로 전환 계층을 지원하는 디바이스를 만든 다음( D3D10CreateDevice 참조) ID3D10SwitchToRef::SetUseRef를 호출해야 합니다.

모든 디바이스 상태, 리소스 및 개체는 이 디바이스 전환을 통해 유지 관리됩니다. 그러나 리소스 데이터를 정확히 일치시킬 수 없는 경우도 있습니다. 이는 참조 디바이스에서 사용할 수 없는 하드웨어 디바이스에서 일부 정보를 사용할 수 있기 때문입니다.

거의 모든 실시간 애플리케이션은 파이프라인의 HAL 구현을 사용합니다. 파이프라인이 하드웨어 디바이스에서 참조 디바이스로 전환되면 렌더링 작업이 하드웨어와 소프트웨어 모두에서 동시에 수행됩니다. 소프트웨어 디바이스가 렌더링되므로 리소스를 시스템 메모리에 다운로드해야 합니다. 이렇게 하려면 시스템 메모리에 캐시된 다른 리소스를 제거하여 공간을 확보해야 할 수 있습니다.

참고

이 참조 계층으로 전환 기능은 Direct3D 10 및 Direct3D 10.1에서만 지원되며 Direct3D 11 이상 버전에서는 더 이상 지원되지 않습니다.

 

Thread-Safe 계층

이 계층은 다중 스레드 애플리케이션이 여러 스레드에서 디바이스에 액세스할 수 있도록 설계되었습니다.

Direct3D 10 애플리케이션은 디바이스 함수를 사용하여 디바이스 동기화를 제어할 수 있습니다. 이렇게 하면 애플리케이션에서 중요한 섹션(다중 스레딩 보호를 일시적으로 사용/사용하지 않도록 설정)을 사용하거나 사용하지 않도록 설정하고 여러 Direct3D 10 API 진입점에 대해 위험 섹션 잠금을 적용/해제할 수 있습니다. 스레드로부터 안전한 계층은 기본적으로 사용하도록 설정됩니다. 단일 스레드 애플리케이션의 경우 스레드로부터 안전한 계층은 성능에 영향을 주지 않습니다.

Direct3D 9와 Direct3D 10의 차이점:

  • Direct3D 9와 달리 Direct3D 10 API는 기본적으로 스레드로부터 안전합니다.

 

API 기능(Direct3D 10)