Introducción a multithreading en Direct3D 11

Multithreading está diseñado para mejorar el rendimiento mediante el uso de uno o varios subprocesos al mismo tiempo.

En el pasado, esto a menudo se ha realizado mediante la generación de un único subproceso principal para la representación y uno o varios subprocesos para realizar trabajos de preparación, como la creación de objetos, la carga, el procesamiento, etc. Sin embargo, con la sincronización integrada en Direct3D 11, el objetivo detrás del multithreading es usar cada ciclo de CPU y GPU sin hacer que un procesador espere a otro procesador (especialmente no hacer que la GPU espere porque afecta directamente a la velocidad de fotogramas). Al hacerlo, puede generar la mayor cantidad de trabajo mientras mantiene la mejor velocidad de fotogramas. El concepto de un único fotograma para la representación ya no es el necesario, ya que la API implementa la sincronización.

Multithreading requiere alguna forma de sincronización. Por ejemplo, si varios subprocesos que se ejecutan en una aplicación deben tener acceso a un único contexto de dispositivo (ID3D11DeviceContext), esa aplicación debe usar algún mecanismo de sincronización, como secciones críticas, para sincronizar el acceso a ese contexto de dispositivo. Esto se debe a que el procesamiento de los comandos de representación (generalmente se realiza en la GPU) y la generación de los comandos de representación (generalmente se realizan en la CPU a través de la creación de objetos, la carga de datos, el cambio de estado, el procesamiento de datos) suelen usar los mismos recursos (texturas, sombreadores, estado de canalización, etc.). La organización del trabajo en varios subprocesos requiere sincronización para evitar que un subproceso modifique o lea los datos que está modificando otro subproceso.

Aunque el uso de un contexto de dispositivo (ID3D11DeviceContext) no es seguro para subprocesos, el uso de un dispositivo Direct3D 11 (ID3D11Device) es seguro para subprocesos. Dado que cada ID3D11DeviceContext es un único subproceso, solo un subproceso puede llamar a ID3D11DeviceContext a la vez. Si varios subprocesos deben tener acceso a un único ID3D11DeviceContext, deben usar algún mecanismo de sincronización, como secciones críticas, para sincronizar el acceso a ese ID3D11DeviceContext. Sin embargo, no se requieren varios subprocesos para usar secciones críticas o primitivos de sincronización para acceder a un solo id3D11Device. Por lo tanto, si una aplicación usa ID3D11Device para crear objetos de recursos, esa aplicación no es necesaria para usar la sincronización para crear varios objetos de recursos al mismo tiempo.

La compatibilidad con multithreading divide la API en dos áreas funcionales distintas:

El rendimiento de multithreading depende de la compatibilidad del controlador. Cómo: Comprobar la compatibilidad con controladores proporciona más información sobre cómo consultar el controlador y cuáles son los resultados.

Direct3D 11 se ha diseñado desde cero para admitir multithreading. Direct3D 10 implementa compatibilidad limitada con multithreading mediante la capa segura para subprocesos. En esta página se enumeran las diferencias de comportamiento entre las dos versiones de DirectX: Diferencias de subprocesos entre versiones de Direct3D.

Multithreading y DXGI

Solo un subproceso a la vez debe usar el contexto inmediato. Sin embargo, la aplicación también debe usar ese mismo subproceso para las operaciones de microsoft DirectX Graphics Infrastructure (DXGI), especialmente cuando la aplicación realiza llamadas al método IDXGISwapChain::P resent .

Nota

No es válido usar un contexto inmediato simultáneamente con la mayoría de las funciones de la interfaz DXGI. Para los SDK de DirectX de marzo de 2009 y versiones posteriores, las únicas funciones DXGI seguras son AddRef, Release y QueryInterface.

 

Para obtener más información sobre el uso de DXGI con varios subprocesos, consulta Consideraciones sobre multiproceso.

Multithreading