Implementación de Direct3D 11 para desarrolladores de juegos
En este artículo se describe cómo implementar los componentes de Direct3D 11 en un sistema si es necesario.
- Información general
- Direct3D 11.3
- Direct3D 11.2
- Direct3D 11.1
- D3D11InstallHelper.dll
- D3D11Install.exe
- Integración en programas de instalación
- Sugerencias de depuración
- Configuración corporativa
- Artículos relacionados
Información general
La API de Direct3D 11 amplía la API de Direct3D 10.1 existente con compatibilidad con la representación multiproceso y la creación de recursos, sombreador de proceso, teselación de hardware, compresión de textura BC6H/BC7 y modelo de sombreador HLSL 5.0 con vinculación dinámica de sombreador. Además del componente Direct3D 11, se incluyen varios componentes gráficos adicionales en el entorno de ejecución de DirectX 11: Direct3D 11, DXGI 1.1, 10level9 niveles de características, dispositivo de representación de software WARP10, Direct2D, DirectWrite y un Direct3D 10.1 actualizado con compatibilidad con 10level9 y WARP10. Para obtener información sobre estos y otros componentes gráficos de Windows, consulte Api de gráficos en Windows.
Todos estos nuevos componentes gráficos están integrados en los sistemas operativos Windows 7 y Windows Server 2008 R2. La API de Direct3D 11 y los componentes relacionados también se pueden instalar en Windows Vista mediante una actualización del sistema de Windows Update. Esta actualización requiere Windows Vista y Service Pack 2. Los usuarios finales con actualizaciones automáticas habilitadas, por lo tanto, probablemente ya tengan instalados los componentes de Direct3D 11, como todos los usuarios de Windows 7.
El ejemplo D3D11InstallHelper está diseñado para simplificar la detección de la API de Direct3D 11, instalar automáticamente la actualización del sistema si corresponde a un equipo del usuario final y proporcionar los mensajes adecuados al usuario final en el procedimiento manual si se requiere un Service Pack más reciente.
Nota
El compilador HLSL (D3DCompile*.dll) y la biblioteca de utilidades D3DX para Direct3D 11 (D3DX11*.dll) no están integrados en ninguna versión del sistema operativo Windows, pero se pueden implementar como parte del instalador de una aplicación mediante la tecnología DirectSetup existente; para obtener más información sobre el uso de DirectSetup, consulta Instalación de DirectX para desarrolladores de juegos. "Efectos 11" está disponible como una biblioteca de compatibilidad de código fuente compartida en Effects for Direct3D 11 Update, y puedes incluirla directamente en una aplicación (como la biblioteca de utilidades DXUT). Por lo tanto, no tiene ningún requisito adicional de redistribución en tiempo de ejecución.
Direct3D 11.3
Windows 10 incluye la API de Direct3D 11.3 integrada. Consulte Características de Direct3D 11.3 para obtener una lista de las nuevas características de la API de Direct3D 11.3.
Direct3D 11.2
Windows 8.1 y Windows Server 2012 R2 se incluyen con la API de Direct3D 11.2 integrada. Consulte Características de Direct3D 11.2 para obtener una lista de las nuevas características de la API de Direct3D 11.2.
Direct3D 11.1
Windows 8 y Windows Server 2012 se incluyen con la API de Direct3D 11.1 integrada. La compatibilidad parcial con la API de Direct3D 11.1 está disponible en Windows 7 o Windows Server 2008 R2 con la actualización de plataforma para Windows 7 instalada. Para obtener más información sobre la actualización de plataforma para Windows 7, consulta Actualización de plataforma para Windows 7.
D3D11InstallHelper.dll
D3D11InstallHelper.dll hospeda la funcionalidad básica para detectar componentes de Direct3D 11 y realizar la actualización del sistema a través del servicio Windows Update si procede. El archivo DLL no muestra mensajes ni cuadros de diálogo directamente.
El archivo DLL consta de los siguientes puntos de entrada:
-
CheckDirect3D11Status
-
Esta función realiza las comprobaciones necesarias y devuelve el estado de Direct3D 11 en este equipo. Esta función no requiere derechos de administrador.
- Un estado de D3D11IH_STATUS_INSTALLED indica que Direct3D 11 ya está instalado en el equipo y está listo para su uso.
- D3D11IH_STATUS_NOT_SUPPORTED indica que esta versión de Windows no admite Direct3D 11 ni tecnologías relacionadas.
- Un estado de D3D11IH_STATUS_NEED_LATEST_SP indica que el usuario debe instalar el Service Pack de Windows Vista más reciente.
- Por último, un estado de D3D11IH_STATUS_REQUIRES_UPDATE indica que el sistema no tiene Instalado Direct3D 11, pero que la actualización del sistema se aplica a esta versión de Windows.
-
DoUpdateForDirect3D11
-
Esta función usa la API de Windows Update para realizar la actualización del sistema para instalar Direct3D 11 en este sistema, si procede. Tenga en cuenta que esta función requiere conectividad de red para Windows Update tener éxito, así como derechos administrativos. Toma una función de devolución de llamada de progreso opcional y un puntero de contexto de usuario, y devuelve un código de resultado final cuando se completa.
- El resultado del D3D11IH_RESULT_SUCCESS indica que se aplicó la actualización del sistema y está lista para su uso, mientras que D3D11IH_RESULT_SUCCESS_REBOOT indica que la actualización del sistema requiere que el equipo se reinicie antes de que se complete. Tenga en cuenta que esta función no programa un reinicio del sistema.
- D3D11IH_RESULT_NOT_SUPPORTED indica que la actualización del sistema no se aplica a esta versión de Windows. Este resultado no debe producirse si solo se llama a esta función después de obtener un estado de D3D11IH_STATUS_REQUIRES_UPDATE de CheckDirect3D11Status.
- Un resultado de D3D11IH_RESULT_UPDATE_NOT_FOUND indica que no se encontró el paquete de actualización del sistema en los servidores Windows Update.
- Si se produce un error en la descarga o instalación del Windows Update, se devolverá D3D11IH_RESULT_UPDATE_DOWNLOAD_FAILED o D3D11IH_RESULT_UPDATE_INSTALL_FAILED como resultado.
- Si se devuelve un error de conectividad de red de la API de Windows Update, se devuelve el D3D11IH_RESULT_WU_SERVICE_ERROR resultado, lo que indica que el problema puede ser intermitente o relacionado con la configuración de red o la configuración del firewall. Intentar de nuevo la función de actualización puede realizarse correctamente.
Para obtener más información sobre la API de Windows Update, consulte api del agente de Windows Update.
D3D11Install.exe
Nota
D3D11Install.exe requiere que se ejecute D3D11InstallHelper.dll.
D3D11Install.exe es una herramienta para usar D3D11InstallHelper.dll como un instalador independiente completo con mensajes de interfaz de usuario y de usuario final, así como actuar como ejemplo para el uso adecuado del archivo DLL. El proceso se cierra con un 0 si Direct3D 11 ya está instalado, si la actualización del sistema se aplica correctamente sin necesidad de reiniciar el sistema, si se requiere una instalación de Service Pack o si este equipo no admite Direct3D 11. Se devuelve un 1 si la actualización del sistema se aplica correctamente y requiere que se complete un reinicio del sistema. Se devuelve un 2 para otras condiciones de error. Tenga en cuenta que este archivo ejecutable requiere derechos de administrador para ejecutarse y tiene un manifiesto que solicita elevación cuando se ejecuta en Windows Vista o Windows 7 con UAC habilitado. D3D11Install.exe se puede usar como herramienta independiente para implementar la actualización de Direct3D 11, o bien los instaladores pueden usarlo directamente.
Admite los siguientes modificadores de línea de comandos:
-
/Tranquilo
-
No muestra mensajes, mensajes, cuadros de diálogo de progreso ni mensajes de error.
-
/Pasiva
-
No muestra mensajes, mensajes o mensajes de error, pero mostrará el cuadro de diálogo de progreso.
-
/Mínimo
-
Muestra solo mensajes mínimos.
-
/y
-
Suprime la solicitud para confirmar la instalación de la actualización, si es necesario y aplicable, para una instalación estándar y mínima.
-
/langid decimal
-
Fuerza el código de identificador de idioma que se va a usar al mostrar los mensajes del usuario final y los recursos del cuadro de diálogo. El valor predeterminado es 1024, que usa la configuración de idioma predeterminada del sistema.
-
/Wu
-
Fuerza el uso de Windows Update en lugar del valor predeterminado del sistema, que puede ser Windows Server Update Services (WSUS) que se ejecuta en un servidor administrado o en alguna otra configuración no estándar.
Integración en programas de instalación
Para cumplir con la instalación fácil de soporte técnico, requisito técnico 3.1 para juegos para Windows, es necesario tener cuidado para que los avisos del usuario final se presenten al principio del proceso de instalación y para asegurarse de que no hay varios avisos de elevación relacionados con UAC. Hay tres opciones básicas para lograr este objetivo:
- El método más básico es ejecutar el D3D11Install.exe con el modificador de línea de comandos /minimal. Esto debe realizarse al principio del instalador Q&A y la instalación debe usar el valor devuelto de 1 para indicar que se debe programar un reinicio al final de la instalación. La ejecución del programa requiere derechos administrativos.
- Use D3D11InstallHelper.dll directamente para detectar la necesidad de la actualización, proporcionando los mensajes de usuario final necesarios para el estado D3D11IH_STATUS_NEED_LATEST_SP, donde la resolución requiere operaciones de usuario manuales. El resultado del estado de D3D11IH_STATUS_NOT_SUPPORTED podría usarse para controlar la instalación de recursos relacionados con Direct3D 11 o como condición de error para las aplicaciones de Direct3D 11, pero no es necesariamente un mensaje útil para el usuario final. Para el estado D3D11IH_STATUS_REQUIRES_UPDATE, el instalador puede usar directamente el punto de entrada dll DoUpdateForDirect3D11 para realizar la actualización y controlar los distintos mensajes resultantes del usuario final. Se pueden encontrar ejemplos de mensajes estándar examinando el cuadro de diálogo D3D11Install.exe y los recursos de la tabla de cadenas. El punto de entrada de actualización requiere derechos de administrador.
- Un enfoque híbrido consiste en comprobar el estado con D3D11InstallHelper.dll y, en el caso del código de estado D3D11IH_STATUS_NEED_LATEST_SP o D3D11IH_STATUS_REQUIRES_UPDATE, se puede ejecutar D3D11Install.exe con los modificadores /minimal e /y para mostrar el cuadro de diálogo o para realizar la actualización, según sea necesario. Estos pasos deben realizarse al principio del proceso de instalación, normalmente inmediatamente después del Q&A y la ejecución del ejecutable requiere derechos administrativos.
Integración en InstallShield
Controlar la implementación de Direct3D 11 desde InstallShield InstallScript se realiza fácilmente con el ejemplo D3D11InstallHelper. Los pasos necesarios para integrarse con InstallShield mediante InstallScript son los siguientes (mediante el método 3, descrito en la sección anterior):
Abra un proyecto installScript en el editor de InstallShield.
Agregue D3D11InstallHelper.dll y D3D11Install.exe al proyecto en Archivos de soporte técnico.
Para agregar los archivos al proyecto InstallShield
- En la pestaña Instalación Designer, haga clic en Archivos de soporte técnico/Billboards en Comportamiento y lógica en el panel de navegación de la izquierda.
- Haga clic en Language Independent (Independiente del idioma), haga clic con el botón derecho en la ventana Archivos y seleccione Insertar archivos. Vaya a agregar D3D11InstallHelper.dll y D3D11Install.exe. La ubicación predeterminada para estos archivos es: raíz del SDK\Samples\C++\Misc\Bin\x86
En el explorador de InstallScript, haga clic en el archivo InstallScript (normalmente Setup.rul) que llamará al archivo DLL o ejecutable, ubicado en Comportamiento y lógica en el panel de navegación de la izquierda.
Pegue el siguiente Objeto InstallScript en el archivo situado cerca de la parte superior:
#define D3D11IH_STATUS_INSTALLED 0 #define D3D11IH_STATUS_NOT_SUPPORTED 1 #define D3D11IH_STATUS_REQUIRES_UPDATE 2 #define D3D11IH_STATUS_NEED_LATEST_SP 3 #define D3D11IH_STATUS_ERROR -1 prototipo NUMBER D3D11InstallHelper.CheckDirect3D11StatusIS();
#define D3D11IH_RESULT_SUCCESS 0 #define D3D11IH_RESULT_SUCCESS_REBOOT 1 #define D3D11IH_RESULT_NOT_SUPPORTED 2 #define D3D11IH_RESULT_UPDATE_NOT_FOUND 3 #define D3D11IH_RESULT_UPDATE_DOWNLOAD_FAILED 4 #define D3D11IH_RESULT_UPDATE_INSTALL_FAILED 5 #define D3D11IH_RESULT_WU_SERVICE_ERROR 6 #define D3D11IH_RESULT_ERROR -1 prototipo NUMBER D3D11InstallHelper.DoUpdateForDirect3D11IS(BOOL); ```
Pegue el siguiente Objeto InstallScript en el archivo de la función OnFirstUIBefore , justo antes de la devolución 0:
Dlg_D3D11: UseDLL( SUPPORTDIR ^ "D3D11InstallHelper.DLL" ); nResult = D3D11InstallHelper.CheckDirect3D11StatusIS(); UnUseDLL( SUPPORTDIR ^ "D3D11InstallHelper.DLL" ); if ( nResult = D3D11IH_STATUS_REQUIRES_UPDATE || nResult = D3D11IH_STATUS_NEED_LATEST_SP) then nResult = LaunchAppAndWait( SUPPORTDIR^"D3D11Install.exe", "/minimal /y", WAIT); if ( nResult < 0 ) then MessageBox("Unable to launch D3D11Install.exe", SEVERE); elseif ( nResult == 1 ) then BATCH_INSTALL = 1; endif; endif;
Integración en un paquete MSI
A continuación se muestra una descripción general de los pasos necesarios para integrar la implementación de Direct3D 11 mediante acciones personalizadas msi (mediante el método 3, descrito anteriormente en este tema):
- Agregue una propiedad a la tabla De propiedades MSI denominada RelativePathToD3D11IH que contiene la ruta de acceso relativa a D3D11Install.exe y D3D11InstallHelper.dll durante la instalación (normalmente se encuentra en la imagen multimedia). Esto también establece una propiedad MSI D3D11IH_STATUS en el estado devuelto por CheckDirect3D11Status (una propiedad de cadena igual al símbolo de enumeración o "ERROR").
- Después de la acción CostFinalize, llame a la función D3D11InstallHelper.dll SetD3D11InstallMSIProperties como una acción personalizada inmediata para establecer las propiedades MSI adecuadas para las demás acciones personalizadas.
- Tras la instalación, desencadene una acción personalizada diferida después de la acción InstallFiles que llama a la función de D3D11InstallHelper.dll DoD3D11InstallUsingMSI. La acción personalizada debe establecer la marca msidbCustomActionTypeNoImpersonate para que se ejecute en un contexto con privilegios elevados.
- Después de la acción InstallFinalize, llame a la función D3D11InstallHelper.dll FinishD3D11InstallUsingMSI como una acción personalizada inmediata para controlar el código de resultado de la solicitud de reinicio correcto, si es necesario.
Este procedimiento se describe en detalle en las instrucciones siguientes, que describen un proceso que se puede realizar mediante un editor MSI, como el editor de Orca. Algunos editores msi tienen asistentes que simplifican algunos de estos pasos de configuración.
Para configurar un paquete MSI para la integración con D3D11InstallHelper.dll
Abra el paquete MSI en Orca.
Agregue la fila que se muestra en la tabla siguiente a la tabla Binary del paquete MSI.
Nombre data D3D11IH Ruta de acceso del archivo al DLL\D3D11InstallHelper.dll Nota
Este archivo se incrustará en el paquete MSI, por lo que debe realizar este paso cada vez que vuelva a compilar D3D11InstallHelper.dll.
Agregue las filas que se muestran en la tabla siguiente a la tabla CustomAction del paquete MSI.
Acción Tipo Source Destino Direct3D11SetProps msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue = 65 D3D11IH SetD3D11InstallMSIProperties Direct3D11DoInstall msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3137 D3D11IH DoD3D11InstallUsingMSI Direct3D11Finish msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue = 65 D3D11IH FinishD3D11InstallUsingMSI Agregue los valores que se muestran para Action, Condition y Sequence en la tabla Siguiente a la tabla InstallExecuteSequence en el paquete MSI.
Acción Condición Secuencia Notas Direct3D11SetProps 1016 El número de secuencia coloca la acción poco después de CostFinalize. Direct3D11DoInstall NO instalada 4004 Esta acción personalizada solo se realizará durante una nueva instalación para todos los usuarios. El número de secuencia coloca la acción después de InstallFiles y después de las reversiones. Direct3D11Finish 6615 El número de secuencia coloca la acción poco después de InstallFinalize. Agregue la fila que se muestra en la tabla siguiente a la tabla Property del paquete MSI.
Propiedad Valor RelativePathToD3D11IH ruta de acceso de archivo relativa que contiene D3D11Install.exe y D3D11InstallHelper.dll Nota
La ubicación especificada por la ruta de acceso es relativa a la ubicación especificada por la ruta de instalación; por ejemplo, "redist\".
Guarde el paquete MSI. Para obtener información más detallada sobre los paquetes MSI y Windows Installer, consulte Windows Installer.
Sugerencias de depuración
Tanto D3D11InstallHelper.dll como D3D11Install.exe se pueden compilar con la configuración de depuración en Visual Studio y estas versiones imprimirán mensajes en el mecanismo de salida de depuración estándar de Windows.
Configuración corporativa
El ejemplo D3D11InstallHelper está diseñado para la implementación estándar a través de Windows Update, que es el escenario más común para la instalación de un juego por parte de los consumidores. Sin embargo, muchos desarrolladores de juegos, que trabajan para editores y estudios de desarrollo, lo hacen en la configuración empresarial que tienen un servidor administrado localmente que proporciona actualizaciones de software mediante la tecnología de Windows Server Update Services (WSUS). En este tipo de entorno, el administrador de TI local tiene control de aprobación sobre qué actualizaciones están disponibles para los equipos dentro de la red corporativa y la versión de consumidor estándar de KB de actualización 971644 no está disponible.
Hay tres soluciones básicas para implementar DirectX 11 en la configuración corporativa o empresarial:
- En algunas configuraciones, es posible comprobar directamente Windows Update en lugar de usar el servidor WSUS administrado localmente. Por este motivo, D3D11InstallHelper admite el modificador de línea de comandos /wu . Sin embargo, no todas las redes corporativas permiten conexiones a los servidores públicos de Microsoft.
- El administrador de TI local puede aprobar kb 971512, una actualización compatible con la empresa implementada desde WSUS, que incluye la API de Direct3D 11. Esta es la única opción para que un usuario estándar obtenga la actualización de Direct3D 11 en un entorno que está totalmente bloqueado.
- Como alternativa, la 971512 de KB se puede instalar manualmente.
Es muy raro que el equipo de un jugador solo pueda obtener actualizaciones de un servidor WSUS administrado localmente, y solo es desarrolladores de grandes organizaciones que probablemente estén en estos entornos.
Artículos relacionados
Firewall de Windows para desarrolladores de juegos
Explorador de juegos de Windows para desarrolladores de juegos