다음을 통해 공유


Direct3D 11의 디바이스 소개

Direct3D 11 개체 모델은 리소스 만들기 및 렌더링 기능을 디바이스 및 하나 이상의 컨텍스트로 구분합니다. 이 분리는 다중 스레딩을 용이하게 하도록 설계되었습니다.

장치

디바이스는 리소스를 만들고 디스플레이 어댑터의 기능을 열거하는 데 사용됩니다. Direct3D 11에서 디바이스는 ID3D11Device 인터페이스로 표시됩니다.

각 애플리케이션에는 하나 이상의 디바이스가 있어야 하며, 대부분의 애플리케이션은 하나의 디바이스만 만듭니다. D3D11CreateDevice 또는 D3D11CreateDeviceAndSwapChain호출하여 컴퓨터에 설치된 하드웨어 드라이버 중 하나에 대한 디바이스를 만들고 D3D_DRIVER_TYPE 플래그를 사용하여 드라이버 유형을 지정합니다. 각 디바이스는 원하는 기능에 따라 하나 이상의 디바이스 컨텍스트를 사용할 수 있습니다.

디바이스 컨텍스트

디바이스 컨텍스트에는 디바이스가 사용되는 상황 또는 설정이 포함됩니다. 더 구체적으로, 디바이스 컨텍스트는 디바이스가 소유한 리소스를 사용하여 파이프라인 상태를 설정하고 렌더링 명령을 생성하는 데 사용됩니다. Direct3D 11은 즉시 렌더링을 위한 컨텍스트와 지연된 렌더링을 위한 두 가지 유형의 디바이스 컨텍스트를 구현합니다. 두 컨텍스트 모두 ID3D11DeviceContext 인터페이스로 표시됩니다.

직접 실행 컨텍스트

즉각적인 컨텍스트는 드라이버에 직접 렌더링됩니다. 각 디바이스에는 GPU에서 데이터를 검색할 수 있는 하나의 즉각적인 컨텍스트만 있습니다. 즉시 컨텍스트를 사용하여 명령 목록을 즉시 렌더링(또는 재생)할 수 있습니다.

즉각적인 컨텍스트를 가져오는 방법에는 두 가지가 있습니다.

지연된 컨텍스트

지연된 컨텍스트는 GPU 명령을 명령 목록에 기록합니다. 지연된 컨텍스트는 주로 다중 스레딩에 사용되며 단일 스레드 애플리케이션에는 필요하지 않습니다. 지연된 컨텍스트는 일반적으로 주 렌더링 스레드 대신 작업자 스레드에서 사용됩니다. 지연된 컨텍스트를 만들 때 즉시 컨텍스트에서 상태를 상속하지 않습니다.

지연된 컨텍스트를 가져오려면 id3D11Device::CreateDeferredContext호출합니다.

컨텍스트가 한 번에 하나의 스레드에서만 사용되는 한 모든 스레드에서 즉시 또는 지연된 컨텍스트를 사용할 수 있습니다.

스레딩 고려 사항

이 표에서는 이전 버전의 Direct3D와 Direct3D 11의 스레딩 모델의 차이점을 강조 표시합니다.

Direct3D 11과 이전 버전의 Direct3D 간의 차이점:
모든 ID3D11Device 인터페이스 메서드는 자유 스레드이므로 여러 스레드가 동시에 함수를 호출하도록 하는 것이 안전합니다.

  • 모든 ID3D11DeviceChild파생 인터페이스(ID3D11Buffer, ID3D11Query등)는 자유 스레드입니다.
  • Direct3D 11은 리소스 만들기 및 렌더링을 두 인터페이스로 분할합니다. ID3D11Device 작업 순서를 강력하게 정의하므로 map, Unmap, Begin, End 및 GetData는 ID3D11DeviceContext 구현됩니다. ID3D11ResourceID3D11Asynchronous 인터페이스는 자유 스레드 작업에 대한 메서드도 구현합니다.
  • ID3D11DeviceContext 메서드(ID3D11DeviceChild있는 메서드 제외)는 자유 스레드가 아닙니다. 즉, 단일 스레딩이 필요합니다. 한 번에 하나의 스레드만 해당 메서드(그리기, 복사, 맵 등)를 안전하게 호출할 수 있습니다.
  • 일반적으로 자유 스레딩은 사용된 동기화 기본 형식의 수와 해당 기간을 최소화합니다. 그러나 오랫동안 유지된 동기화를 사용하는 애플리케이션은 애플리케이션이 예상할 수 있는 동시성 양에 직접적인 영향을 줄 수 있습니다.
ID3D10Device 인터페이스 메서드는 자유 스레드로 설계되지 않았습니다. ID3D10Device는 Direct3D 9의 ID3D9Device와 마찬가지로 모든 만들기 및 렌더링 기능을 구현합니다. 맵 및 맵 해제는 ID3D10Resource 파생 인터페이스에서 구현되며, Begin, End 및 GetData는 ID3D10Asynchronous 파생 인터페이스에서 구현됩니다.

디바이스