Развертывание Direct3D 11 для разработчиков игр

В этой статье описывается развертывание компонентов Direct3D 11 в системе при необходимости.

Обзор

API Direct3D 11 расширяет существующий API Direct3D 10.1 с поддержкой многопоточной отрисовки и создания ресурсов, шейдер вычислений, аппаратного тесселяции, сжатия текстур BC6H/BC7 и модели HLSL шейдера 5.0 с динамической компоновкой шейдера. Помимо компонента Direct3D 11, в среду выполнения DirectX 11 входят ряд дополнительных графических компонентов: Direct3D 11, DXGI 1.1, 10level9, устройство отрисовки программного обеспечения WARP10, Direct2D, DirectWrite и обновленный Direct3D 10.1 с поддержкой 10level9 и WARP10. Сведения об этих и других графических компонентах Windows см. в API графики в Windows.

Все эти новые графические компоненты встроены в операционные системы Windows 7 и Windows Server 2008 R2. API Direct3D 11 и связанные компоненты также можно установить в Windows Vista с помощью обновления системы из Обновл. Windows. Для этого обновления требуется Windows Vista и пакет обновления 2. Конечные пользователи с включенными автоматическими обновлениями, поэтому, скорее всего, уже установлены компоненты Direct3D 11, как и все пользователи Windows 7.

Пример D3D11InstallHelper предназначен для упрощения обнаружения API Direct3D 11, автоматического установки обновления системы, если применимо к компьютеру конечного пользователя, и предоставления соответствующих сообщений конечным пользователям в процедуре вручную, если требуется более новый пакет обновления.

Примечание.

Компилятор HLSL (D3DCompile*.dll) и библиотека служебной программы D3DX для Direct3D 11 (D3DX11*.dll) не встроены в любую версию операционной системы Windows, но их можно развернуть в составе установщика приложения с помощью существующей технологии DirectSetup; Дополнительные сведения об использовании DirectSetup см. в разделе "Установка DirectX для разработчиков игр". "Эффекты 11" доступны в качестве общей библиотеки поддержки источников в Effects for Direct3D 11 Update, и ее можно включить непосредственно в приложение (например, библиотеку служебной программы DXUT). Таким образом, у него нет дополнительных требований к распространению во время выполнения.

Direct3D 11.3

Windows 10 поставляется с встроенным API Direct3D 11.3. Сведения о новых функциях Direct3D 11.3 см. в API Direct3D 11.3.

Direct3D 11.2

Windows 8.1 и Windows Server 2012 R2 предоставляются с встроенным API Direct3D 11.2. Сведения о новых функциях Direct3D 11.2 см. в API Direct3D 11.2.

Direct3D 11.1

Windows 8 и Windows Server 2012 предоставляют встроенный API Direct3D 11.1. Частичная поддержка API Direct3D 11.1 доступна в Windows 7 или Windows Server 2008 R2 с установленным обновлением платформы для Windows 7 . Дополнительные сведения об обновлении платформы для Windows 7 см. в разделе "Обновление платформы" для Windows 7.

D3D11InstallHelper.dll

D3D11InstallHelper.dll содержит основные функции для обнаружения компонентов Direct3D 11 и выполнения обновления системы через службу Обновл. Windows, если это применимо. Библиотека DLL не отображает сообщения или диалоговые окна напрямую.

Библиотека DLL состоит из следующих точек входа:

CheckDirect3D11Status

Эта функция выполняет необходимые проверка и возвращает состояние Direct3D 11 на этом компьютере. Эта функция не требует прав администратора.

  • Состояние D3D11IH_STATUS_INSTALLED указывает, что Direct3D 11 уже установлен на компьютере и готов к использованию.
  • D3D11IH_STATUS_NOT_SUPPORTED указывает, что эта версия Windows не поддерживает технологии Direct3D 11 или связанные с ними технологии.
  • Состояние D3D11IH_STATUS_NEED_LATEST_SP указывает, что последний пакет обновления Windows Vista должен быть установлен пользователем.
  • Наконец, состояние D3D11IH_STATUS_REQUIRES_UPDATE указывает, что система не установлена Direct3D 11, но обновление системы применяется к этой версии Windows.

DoUpdateForDirect3D11

Эта функция использует API Обновл. Windows для выполнения обновления системы для установки Direct3D 11 в этой системе, если применимо. Обратите внимание, что эта функция требует подключения к сети Обновл. Windows для успешного выполнения, а также прав администратора. Он принимает необязательную функцию обратного вызова хода выполнения и указатель контекста пользователя и возвращает окончательный код результата при завершении.

  • Результат D3D11IH_RESULT_SUCCESS указывает, что обновление системы было применено и готово к использованию, в то время как D3D11IH_RESULT_SUCCESS_REBOOT указывает, что обновление системы требует перезагрузки компьютера до его завершения. Обратите внимание, что эта функция не планирует перезагрузку системы.
  • D3D11IH_RESULT_NOT_SUPPORTED указывает, что обновление системы не применяется к этой версии Windows. Этот результат не должен возникать, если эта функция вызывается только после получения состояния D3D11IH_STATUS_REQUIRES_UPDATE из CheckDirect3D11Status.
  • Результат D3D11IH_RESULT_UPDATE_NOT_FOUND указывает, что пакет обновления системы не найден на серверах Обновл. Windows.
  • Если Обновл. Windows скачивание или установка завершается ошибкой, D3D11IH_RESULT_UPDATE_DOWNLOAD_FAILED или D3D11IH_RESULT_UPDATE_INSTALL_FAILED будут возвращены в качестве результата.
  • Если ошибка подключения к сети возвращается из API Обновл. Windows, возвращается результат D3D11IH_RESULT_WU_SERVICE_ERROR, указывающий, что проблема может быть периодический или связана с конфигурацией сети или параметрами брандмауэра. Попытка повторного обновления функции может завершиться успешно.

Дополнительные сведения об API Обновл. Windows см. в Обновл. Windows API агента.

D3D11Install.exe

Примечание.

D3D11Install.exe требует выполнения D3D11InstallHelper.dll.

D3D11Install.exe — это средство для использования D3D11InstallHelper.dll в качестве автономного установщика с сообщениями пользовательского интерфейса и конечных пользователей, а также для правильного использования библиотеки DLL. Процесс завершает работу с 0, если установлен Direct3D 11, если системное обновление применяется успешно, не требуя перезагрузки системы, если требуется установка пакета обновления или если direct3D 11 не поддерживается этим компьютером. Возвращается значение 1, если обновление системы успешно применено и требует завершения перезагрузки системы. Возвращается значение 2 для других условий ошибки. Обратите внимание, что этот исполняемый файл требует прав администратора для запуска, и он содержит манифест, который запрашивает повышение прав при запуске в Windows Vista или Windows 7 с включенной функцией UAC. D3D11Install.exe можно использовать как автономное средство для развертывания обновления Direct3D 11 или его можно использовать непосредственно установщиками.

Он поддерживает следующие параметры командной строки:

/Тихий

Отображает сообщения, запросы, диалоговые окна хода выполнения или сообщения об ошибках.

/Пассивный

Отображает сообщения, запросы или сообщения об ошибках, но отобразит диалоговое окно хода выполнения.

/Минимальный

Отображает только минимальные запросы.

/Y

Подавляет запрос на подтверждение установки обновления при необходимости и применимости для стандартной и минимальной установки.

/langid decimal

Принудительно задает код идентификатора языка при отображении сообщений конечного пользователя и ресурсов диалогового окна. Значение по умолчанию — 1024, которое использует системный параметр языка по умолчанию.

/Ву

Принудительное использование Обновл. Windows вместо системного по умолчанию, которое может быть службами windows Server Update Services (WSUS), работающими на управляемом сервере или другой нестандартной конфигурации.

Интеграция с программами установки

Чтобы обеспечить простую установку поддержки, техническое требование 3.1 для игр для Windows необходимо принять меры, чтобы все запросы конечных пользователей были представлены в начале процесса установки, и чтобы обеспечить отсутствие нескольких запросов на повышение прав, связанных с UAC. Существует три основных варианта достижения этой цели:

  1. Самый простой метод — выполнить D3D11Install.exe с параметром командной строки /min. Это необходимо сделать рано в установщике Q&A, и установка должна использовать возвращаемое значение 1, чтобы указать, что перезагрузка должна быть запланирована в конце установки. Для выполнения программы требуются права администратора.
  2. Используйте D3D11InstallHelper.dll напрямую для обнаружения необходимости обновления, предоставляя все сообщения конечных пользователей, необходимые для D3D11IH_STATUS_NEED_LATEST_SP состояния, где разрешение требует ручных операций пользователя. Результат состояния D3D11IH_STATUS_NOT_SUPPORTED можно использовать для управления установкой ресурсов, связанных с Direct3D 11, или в качестве условия ошибки только для приложений Direct3D 11, но в противном случае это не обязательно полезное сообщение конечного пользователя. Для состояния D3D11IH_STATUS_REQUIRES_UPDATE установщик может напрямую использовать точку входа DLL DoUpdateForDirect3D11 для выполнения обновления и обработки различных результируемых сообщений конечных пользователей. Примеры стандартных сообщений можно найти, проверив диалоговое окно D3D11Install.exe и ресурсы таблицы строк. Для точки входа обновления требуются права администратора.
  3. Гибридный подход заключается в том, чтобы проверка состояние с помощью D3D11InstallHelper.dll, а в случае кода состояния D3D11IH_STATUS_NEED_LATEST_SP или D3D11IH_STATUS_REQUIRES_UPDATE D3D11Install.exe можно выполнить с помощью переключателей /min и /y, чтобы отобразить диалоговое окно или выполнить обновление по мере необходимости. Эти действия должны выполняться в начале процесса установки, как правило, сразу после Q&A и запуска исполняемого файла требуются права администратора.

Интеграция с InstallShield

Обработка развертывания Direct3D 11 из InstallShield в InstallShield легко выполняется с помощью примера D3D11InstallHelper. Действия, необходимые для интеграции с InstallShield с помощью InstallScript, приведены ниже (с помощью метода 3, описанного в предыдущем разделе):

  1. Откройте проект InstallScript в редакторе InstallShield.

  2. Добавьте D3D11InstallHelper.dll и D3D11Install.exe в проект в файлах поддержки.

    Добавление файлов в проект InstallShield

    1. На вкладке конструктора установки щелкните "Поддержка файлов/рекламных щитов" в разделе "Поведение" и "Логика " в области навигации слева.
    2. Щелкните язык независимо от языка, а затем щелкните правой кнопкой мыши в окне "Файлы " и выберите " Вставить файлы". Перейдите к добавлению D3D11InstallHelper.dll и D3D11Install.exe. Расположение по умолчанию для этих файлов: root\SDK\Samples\C++\Misc\Bin\x86
  3. В обозревателе InstallScript щелкните файл InstallScript (обычно Setup.rul), который вызовет библиотеку DLL или исполняемый файл, расположенный в разделе "Поведение и логика " в области навигации слева.

  4. Вставьте следующий InstallScript в файл в верхней части:

#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 прототип NU МБ ER 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 прототип NU МБ ER D3D11InstallHelper.DoUpdateForDirect3D11IS(BOOL); ''

  1. Вставьте следующий InstallScript в файл в функцию OnFirstUIBefore перед возвратом 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;
    

Интеграция с пакетом MSI

Ниже приведено высокоуровневое описание шагов, необходимых для интеграции развертывания Direct3D 11 с помощью пользовательских действий MSI (с помощью метода 3, описанного ранее в этом разделе):

  1. Добавьте свойство в таблицу свойств MSI с именем RelativePathToD3D11IH , которая содержит относительный путь к D3D11Install.exe и D3D11InstallHelper.dll во время установки (обычно это в образе носителя). Это также задает свойство MSI D3D11IH_STATUS состояние, возвращаемое CheckDirect3D11Status (строковое свойство, равное символу перечисления или "ERROR").
  2. После действия CostFinalize вызовите функцию D3D11InstallHelper.dll SetD3D11InstallMSIProperties в качестве немедленного настраиваемого действия, чтобы задать соответствующие свойства MSI для других пользовательских действий.
  3. После установки активируйте отложенное пользовательское действие после действия InstallFiles, которое вызывает функцию D3D11InstallHelper.dll DoD3D11InstallUsingMSI. Настраиваемое действие должно задать флаг msidbCustomActionTypeNoImpersonate для выполнения в контексте с повышенными привилегиями.
  4. После действия InstallFinalize вызовите функцию D3D11InstallHelper.dll FinishD3D11InstallUsingMSI в качестве немедленного настраиваемого действия для обработки кода результата запроса на перезагрузку при необходимости.

Эта процедура подробно описана в следующих инструкциях, описывающих процесс, который можно выполнить с помощью редактора MSI, например редактора Orca. В некоторых редакторах MSI есть мастеры, которые упрощают некоторые из этих шагов настройки.

Настройка пакета MSI для интеграции с D3D11InstallHelper.dll

  1. Откройте пакет MSI в Orca.

  2. Добавьте строку, показанную в следующей таблице, в двоичную таблицу в пакете MSI.

    Имя. Data
    D3D11IH Путь к dll\D3D11InstallHelper.dll

     

    Примечание.

    Этот файл будет внедрен в пакет MSI, поэтому этот шаг необходимо выполнить каждый раз при повторной компиляции D3D11InstallHelper.dll.

     

  3. Добавьте строки, показанные в следующей таблице, в таблицу CustomAction в пакете MSI.

    Действие Тип Оригинал Target
    Direct3D11SetProps msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue = 65 D3D11IH SetD3D11InstallMSIProperties
    Direct3D11DoInstall msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeInScript + msidbCustomActionActionTypeNoImpersonate = 3137 D3D11IH DoD3D11InstallUsingMSI
    Direct3D11Finish msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue = 65 D3D11IH FinishD3D11InstallUsingMSI

     

  4. Добавьте значения, отображаемые для действия, условия и последовательности в таблице InstallExecuteSequence в пакете MSI.

    Действие Condition Sequence Примечания.
    Direct3D11SetProps 1016 Порядковый номер помещает действие вскоре после CostFinalize.
    Direct3D11DoInstall НЕ установлен 4004 Это настраиваемое действие будет выполняться только во время новой установки для всех пользователей. Порядковый номер помещает действие после установкиFiles и после отката.
    Direct3D11Finish 6615 Порядковый номер помещает действие вскоре после установкиFinalize.

     

  5. Добавьте строку, показанную в следующей таблице , в таблицу свойств в пакете MSI.

    Свойство Значение
    RelativePathToD3D11IH относительный путь к файлу, содержащий D3D11Install.exe и D3D11InstallHelper.dll

     

    Примечание.

    Расположение, указанное путем, относительно расположения, указанного путем установки, например redist\.

     

  6. Сохраните пакет MSI. Дополнительные сведения о пакетах MSI и установщике Windows см. в разделе установщика Windows.

Советы по отладке

Оба файла D3D11InstallHelper.dll и D3D11Install.exe можно создать с конфигурацией отладки в Visual Studio, и эти версии будут выводить сообщения в стандартный механизм вывода отладки Windows.

Параметры организации

Пример D3D11InstallHelper предназначен для стандартного развертывания через Обновл. Windows, что является наиболее распространенным сценарием для установки игры потребителями. Однако многие разработчики игр, работающие на издателях и в студиях разработки, делают это в корпоративных параметрах, имеющих локально управляемый сервер, предоставляющий обновления программного обеспечения с помощью технологии Windows Server Update Services (WSUS). В этой среде локальный ИТ-администратор имеет контроль над тем, какие обновления становятся доступными для компьютеров в корпоративной сети, а стандартная версия потребительских обновлений КБ 971644 недоступна.

Существует три основных решения для развертывания DirectX 11 в корпоративных или корпоративных параметрах:

  • В некоторых конфигурациях можно напрямую проверка Обновл. Windows, а не использовать локально управляемый сервер WSUS. По этой причине D3D11InstallHelper поддерживает параметр командной строки /wu . Однако не все корпоративные сети позволяют подключаться к общедоступным серверам Майкрософт.
  • Локальный ИТ-администратор может утвердить КБ 971512, поддерживаемое предприятием обновление, развернутое из WSUS, которое включает API Direct3D 11. Это единственный вариант для стандартного пользователя, чтобы получить обновление Direct3D 11 в среде, которая полностью заблокирована.
  • Кроме того, КБ 971512 можно установить вручную.

Очень редко компьютер игрока может получать обновления только с локально управляемого сервера WSUS, и это только разработчики в крупных организациях, которые, скорее всего, находятся в таких средах.

Брандмауэр Windows для разработчиков игр

Игры Windows Обозреватель для разработчиков игр