다음을 통해 공유


명령 큐 및 명령 목록의 디자인 원칙

렌더링 작업 및 다중 스레드 스케일링을 다시 사용할 수 있도록 하려면 Direct3D 앱이 렌더링 작업을 GPU에 제출하는 방법을 기본적으로 변경해야 했습니다. Direct3D 12에서 렌더링 작업을 제출하는 프로세스는 다음과 같은 세 가지 중요한 방법에서 이전 버전과 다릅니다.

  1. 직접 컨텍스트 제거. 이렇게 하면 다중 스레딩을 사용할 수 있습니다.
  2. 이제 앱에는 렌더링 호출을 GPU(그래픽 처리 장치) 작업 항목으로 그룹화하는 방법이 있습니다. 이를 통해 다시 사용할 수 있게 됩니다.
  3. 이제 앱은 작업이 GPU에 제출되는 시기를 명시적으로 제어합니다. 이를 통해 항목 1 및 2를 사용할 수 있습니다.

직접 컨텍스트 제거

Microsoft Direct3D 11에서 Microsoft Direct3D 12로 가장 큰 변경 내용은 더 이상 디바이스와 연결된 하나의 직접 컨텍스트가 없다는 것입니다. 대신, 렌더링하기 위해 앱은 기존 렌더링 API를 호출할 수 있는 명령 목록을 만듭니다. 명령 목록은 기본 형식을 그리거나 렌더링 상태를 변경하는 호출을 포함하는 직접 컨텍스트를 사용한 Direct3D 11 앱의 렌더링 메서드와 비슷하게 표시됩니다. 직접 컨텍스트와 같이 각 명령 목록은 자유 스레드가 아니지만, 최신 다중 코어 프로세서를 이용하는 여러 명령 목록을 동시에 기록할 수 있습니다.

명령 목록은 일반적으로 한 번 실행됩니다. 그러나 애플리케이션이 새 실행을 제출하기 전에 이전 실행이 완료되는지 확인하는 경우 명령 목록을 여러 번 실행할 수 있습니다. 명령 목록 동기화에 대한 자세한 내용은 명령 목록 실행 및 동기화를 참조하세요.

GPU 작업 항목 그룹화

명령 목록 외에 Direct3D 12는 ‘번들’이라는 두 번째 명령 목록 수준을 추가하여 오늘날 모든 하드웨어에 있는 기능을 활용합니다. 이 두 가지 유형을 구별하는 데 도움이 되도록 첫 번째 수준 명령을 ‘직접 명령 목록’이라고 할 수 있습니다. 번들의 목적은 앱이 직접 명령 목록 내에서 나중에 반복해서 실행할 적은 수의 API 명령을 그룹화할 수 있게 하는 것입니다. 번들을 만들 때 드라이버는 나중에 효율적으로 실행할 수 있도록 최대한 많은 전처리를 수행합니다. 그러면 번들은 여러 명령 목록 내에서 실행되고 동일한 명령 목록 내에서 여러 번 실행될 수 있습니다.

번들을 재사용하면 단일 CPU 스레드에서 효율성을 크게 높일 수 있습니다. 번들은 전처리되며 여러 번 제출될 수 있기 때문에 번들 내에서 수행할 수 있는 작업에는 일정한 제한이 있습니다. 자세한 내용은 명령 목록 및 번들 만들기 및 기록을 참조하세요.

GPU 작업 제출

GPU에서 작업을 실행하려면 앱이 Direct3D 디바이스와 연결된 명령 큐에 명시적으로 명령 목록을 제출해야 합니다. 여러 번 실행하도록 직접 명령 목록을 제출할 수 있지만, 앱은 다시 제출하기 전에 GPU에서 직접 명령 목록의 실행이 완료되는지 확인해야 합니다. 번들에는 동시 사용 제한 사항이 없고 번들을 여러 명령 목록에서 여러 번 실행할 수 있지만, 실행을 위해 번들을 명령 큐에 직접 제출할 수는 없습니다.

모든 스레드는 언제든지 명령 큐에 명령 목록을 제출할 수 있으며 런타임은 제출 순서를 유지하면서 명령 큐에서 명령 목록 제출을 자동으로 직렬화합니다.