다음을 통해 공유


Direct3D 11의 다중 스레딩 소개

다중 스레딩은 하나 이상의 스레드를 동시에 사용하여 작업을 수행하여 성능을 향상하도록 설계되었습니다.

과거에는 렌더링을 위한 단일 기본 스레드와 개체 만들기, 로드, 처리 등과 같은 준비 작업을 수행하기 위한 하나 이상의 스레드를 생성하여 이 작업을 수행했습니다. 그러나 Direct3D 11에서 기본 제공 동기화를 사용하는 경우 다중 스레딩의 목표는 프로세서가 다른 프로세서를 기다리지 않고 모든 CPU 및 GPU 주기를 활용하는 것입니다(특히 GPU가 프레임 속도에 직접적인 영향을 주기 때문에 기다리지 않음). 이렇게 하면 최상의 프레임 속도를 유지하면서 대부분의 작업을 생성할 수 있습니다. 렌더링을 위한 단일 프레임의 개념은 API가 동기화를 구현하기 때문에 더 이상 필요하지 않습니다.

다중 스레딩에는 어떤 형태의 동기화가 필요합니다. 예를 들어 애플리케이션에서 실행되는 여러 스레드가 단일 디바이스 컨텍스트(ID3D11DeviceContext)에 액세스해야 하는 경우 해당 애플리케이션은 중요한 섹션과 같은 일부 동기화 메커니즘을 사용하여 해당 디바이스 컨텍스트에 대한 액세스를 동기화해야 합니다. 이는 렌더링 명령(일반적으로 GPU에서 수행)을 처리하고 렌더링 명령(일반적으로 개체 만들기, 데이터 로드, 상태 변경, 데이터 처리를 통해 CPU에서 수행됨)을 생성하는 경우 동일한 리소스(텍스처, 셰이더, 파이프라인 상태 등)를 사용하기 때문입니다. 여러 스레드에서 작업을 구성하려면 한 스레드가 다른 스레드에서 수정되는 데이터를 수정하거나 읽지 못하도록 동기화가 필요합니다.

디바이스 컨텍스트(ID3D11DeviceContext)의 사용은 스레드로부터 안전하지 않지만 Direct3D 11 디바이스(ID3D11Device)의 사용은 스레드로부터 안전합니다. 각 ID3D11DeviceContext 는 단일 스레드이므로 한 번에 하나의 스레드만 ID3D11DeviceContext 를 호출할 수 있습니다. 여러 스레드가 단일 ID3D11DeviceContext에 액세스해야 하는 경우 중요한 섹션과 같은 일부 동기화 메커니즘을 사용하여 해당 ID3D11DeviceContext에 대한 액세스를 동기화해야 합니다. 그러나 중요한 섹션 또는 동기화 기본 형식을 사용하여 단일 ID3D11Device에 액세스하는 데는 여러 스레드가 필요하지 않습니다. 따라서 애플리케이션이 ID3D11Device 를 사용하여 리소스 개체를 만드는 경우 해당 애플리케이션은 동기화를 사용하여 여러 리소스 개체를 동시에 만들 필요가 없습니다.

다중 스레딩 지원은 API를 두 가지 기능 영역으로 나눕니다.

다중 스레딩 성능은 드라이버 지원에 따라 달라집니다. 방법: 드라이버 지원 확인 은 드라이버 쿼리 및 결과의 의미에 대한 자세한 정보를 제공합니다.

Direct3D 11은 다중 스레딩을 지원하기 위해 처음부터 설계되었습니다. Direct3D 10은 스레드로부터 안전한 계층을 사용하여 다중 스레딩에 대한 제한된 지원을 구현합니다. 이 페이지에는 DirectX의 두 버전인 Direct3D 버전 간의 스레딩 차이점 간의 동작 차이점이 나열되어 있습니다.

다중 스레딩 및 DXGI

한 번에 하나의 스레드만 직접 컨텍스트를 사용해야 합니다. 그러나 애플리케이션은 특히 애플리케이션이 IDXGISwapChain::P resent 메서드를 호출하는 경우 Microsoft DXGI(DirectX Graphics Infrastructure) 작업에 동일한 스레드를 사용해야 합니다.

참고

대부분의 DXGI 인터페이스 함수와 동시에 직접 컨텍스트를 사용하는 것은 유효하지 않습니다. 2009년 3월 이상 DirectX SDK의 경우 안전한 유일한 DXGI 함수는 AddRef, ReleaseQueryInterface입니다.

 

여러 스레드에서 DXGI를 사용하는 방법에 대한 자세한 내용은 다중 스레드 고려 사항을 참조하세요.

다중 스레딩