즉시 및 지연된 렌더링

Direct3D 11은 즉시 및 지연이라는 두 가지 유형의 렌더링을 지원합니다. 둘 다 ID3D11DeviceContext 인터페이스를 사용하여 구현됩니다.

즉시 렌더링

즉각적인 렌더링은 GPU에서 실행하기 위해 버퍼의 명령을 큐에 대기하는 디바이스에서 렌더링 API 또는 명령을 호출하는 것을 의미합니다. 즉각적인 컨텍스트를 사용하여 명령 목록을 렌더링하고, 파이프라인 상태를 설정하고, 재생합니다.

D3D11CreateDevice 또는 D3D11CreateDeviceAndSwapChain을 사용하여 즉각적인 컨텍스트를 만듭니다.

지연된 렌더링

지연된 렌더링은 다른 시간에 재생할 수 있도록 명령 버퍼에 그래픽 명령을 기록합니다. 지연된 컨텍스트를 사용하여 명령 목록에 명령(렌더링 및 상태 설정)을 기록합니다. 지연 렌더링은 Direct3D 11의 새로운 개념입니다. 지연된 렌더링은 추가 스레드에서 렌더링하기 위한 명령을 기록하는 동안 한 스레드에서 렌더링을 지원하도록 설계되었습니다. 이 병렬 다중 스레드 전략을 사용하면 복잡한 장면을 동시 작업으로 분할할 수 있습니다. 복잡한 장면을 렌더링하는 방법에 대한 자세한 내용은 다중 패스 렌더링을 참조하세요.

ID3D11Device::CreateDeferredContext를 사용하여 지연된 컨텍스트를 만듭니다.

Direct3D는 명령 버퍼에서 명령을 큐에 대기할 때 렌더링 오버헤드를 생성합니다. 반면 , 명령 목록은 재생 중에 훨씬 더 효율적으로 실행됩니다. 명령 목록을 사용하려면 지연된 컨텍스트로 렌더링 명령을 기록하고 즉각적인 컨텍스트를 사용하여 다시 재생합니다.

단일 스레드 방식으로 단일 명령 목록만 생성할 수 있습니다. 그러나 각각 별도의 스레드에서 여러 지연된 컨텍스트를 동시에 만들고 사용할 수 있습니다. 그런 다음 이러한 여러 지연된 컨텍스트를 사용하여 동시에 여러 명령 목록을 만들 수 있습니다.

바로 가기 컨텍스트에서는 둘 이상의 명령 목록을 동시에 재생할 수 없습니다.

디바이스 컨텍스트가 즉시 또는 지연된 컨텍스트인지 확인하려면 ID3D11DeviceContext::GetType을 호출합니다.

ID3D11DeviceContext::Map 메서드는 명령 목록 내의 첫 번째 호출이 D3D11_MAP_WRITE_DISCARD 동적 리소스(D3D11_USAGE_DYNAMIC)에 대해 지연된 컨텍스트에서만 지원됩니다. D3D11_MAP_WRITE_NO_OVERWRITE 지정된 유형의 리소스에 사용할 수 있는 경우 후속 호출에서 지원됩니다.

지연된 컨텍스트의 쿼리는 데이터 생성 및 조건자 그리기로 제한됩니다. 지연된 컨텍스트에서 ID3D11DeviceContext::GetData 를 호출하여 쿼리에 대한 데이터를 가져올 수 없습니다. 직접 컨텍스트에서만 GetData 를 호출하여 쿼리에 대한 데이터를 가져올 수 있습니다. D3D11DeviceContext::SetPredication을 호출하여 GPU에서 쿼리 결과를 사용하여 렌더링 조건자(쿼리 형식)를 설정할 수 있습니다. ID3D11DeviceContext::Begin 및 ID3D11DeviceContext::End 호출을 통해 쿼리 데이터를 생성할 수 있습니다. 그러나 즉시 컨텍스트에서 ID3D11DeviceContext::ExecuteCommandList 를 호출하여 지연된 컨텍스트 명령 목록을 제출할 때까지 쿼리 데이터를 사용할 수 없습니다. 그런 다음 GPU에서 쿼리 데이터를 처리합니다.

다중 스레딩