Direct3D 11의 디바이스 소개
Direct3D 11 개체 모델은 리소스 만들기 및 렌더링 기능을 디바이스 및 하나 이상의 컨텍스트로 구분합니다. 이 분리는 다중 스레딩을 용이하게 하도록 설계되었습니다.
디바이스
디바이스는 리소스를 만들고 디스플레이 어댑터의 기능을 열거하는 데 사용됩니다. Direct3D 11에서 디바이스는 ID3D11Device 인터페이스로 표시됩니다.
각 애플리케이션에는 디바이스가 하나 이상 있어야 하며, 대부분의 애플리케이션은 하나의 디바이스만 만듭니다. D3D11CreateDevice 또는 D3D11CreateDeviceAndSwapChain을 호출하여 컴퓨터에 설치된 하드웨어 드라이버 중 하나에 대한 디바이스를 만들고 D3D_DRIVER_TYPE 플래그를 사용하여 드라이버 유형을 지정합니다. 각 디바이스는 원하는 기능에 따라 디바이스 컨텍스트를 하나 이상 사용할 수 있습니다.
디바이스 컨텍스트
디바이스 컨텍스트에는 디바이스가 사용되는 상황 또는 설정이 포함됩니다. 더 구체적으로, 디바이스 컨텍스트는 파이프라인 상태를 설정하고 디바이스가 소유한 리소스를 사용하여 렌더링 명령을 생성하는 데 사용됩니다. Direct3D 11은 두 가지 유형의 디바이스 컨텍스트를 구현합니다. 하나는 즉시 렌더링용이고 다른 하나는 지연된 렌더링용입니다. 두 컨텍스트 모두 ID3D11DeviceContext 인터페이스로 표시됩니다.
직접 실행 컨텍스트
즉각적인 컨텍스트는 드라이버에 직접 렌더링됩니다. 각 디바이스에는 GPU에서 데이터를 검색할 수 있는 하나의 즉각적인 컨텍스트만 있습니다. 즉각적인 컨텍스트를 사용하여 명령 목록을 즉시 렌더링(또는 재생)할 수 있습니다.
즉각적인 컨텍스트를 가져오는 방법에는 두 가지가 있습니다.
- D3D11CreateDevice 또는 D3D11CreateDeviceAndSwapChain을 호출합니다.
- ID3D11Device::GetImmediateContext를 호출합니다.
지연된 컨텍스트
지연된 컨텍스트는 명령 목록에 GPU 명령을 기록합니다. 지연된 컨텍스트는 주로 다중 스레딩에 사용되며 단일 스레드 애플리케이션에는 필요하지 않습니다. 지연된 컨텍스트는 일반적으로 기본 렌더링 스레드 대신 작업자 스레드에서 사용됩니다. 지연된 컨텍스트를 만들 때 즉시 컨텍스트에서 상태를 상속하지 않습니다.
지연된 컨텍스트를 가져오려면 ID3D11Device::CreateDeferredContext를 호출합니다.
컨텍스트가 한 번에 하나의 스레드에서만 사용되는 한 모든 스레드에서 즉시 또는 지연된 모든 컨텍스트를 사용할 수 있습니다.
스레딩 고려 사항
이 표에서는 이전 버전의 Direct3D와 Direct3D 11의 스레딩 모델의 차이점을 강조 표시합니다.
Direct3D 11과 이전 버전의 Direct3D 간의 차이점:
모든 ID3D11Device 인터페이스 메서드는 자유 스레드이므로 여러 스레드가 동시에 함수를 호출하는 것이 안전합니다.
- 모든 ID3D11DeviceChild 파생 인터페이스(ID3D11Buffer, ID3D11Query 등)는 자유 스레드입니다.
- Direct3D 11은 리소스 만들기 및 렌더링을 두 인터페이스로 분할합니다. ID3D11Device는 작업 순서를 강력하게 정의하므로 맵, 매핑 해제, 시작, 종료 및 GetData는 ID3D11DeviceContext에서 구현됩니다. ID3D11Resource 및 ID3D11Asynchronous 인터페이스는 자유 스레드 작업에 대한 메서드도 구현합니다.
- ID3D11DeviceContext 메서드(ID3D11DeviceChild에 있는 메서드 제외)는 자유 스레드가 아닙니다. 즉, 단일 스레딩이 필요합니다. 한 번에 하나의 스레드만 해당 메서드(그리기, 복사, 맵 등)를 안전하게 호출할 수 있습니다.
- 일반적으로 자유 스레딩은 사용된 동기화 기본 형식의 수와 기간을 최소화합니다. 그러나 오랫동안 유지된 동기화를 사용하는 애플리케이션은 애플리케이션이 예상할 수 있는 동시성 양에 직접적인 영향을 줄 수 있습니다.