次の方法で共有


ゲーム開発者向けの Direct3D 11 の展開

この記事では、必要に応じて Direct3D 11 コンポーネントをシステムに展開する方法について説明します。

概要

Direct3D 11 API は、マルチスレッド レンダリングとリソース作成、コンピューティング シェーダー、ハードウェア テッセレーション、BC6H/BC7 テクスチャ圧縮、HLSL シェーダー モデル 5.0 と動的シェーダー リンケージをサポートする既存の Direct3D 10.1 API を拡張します。 Direct3D 11 コンポーネントに加えて、DirectX 11 ランタイムには、Direct3D 11、DXGI 1.1、10level9 機能レベル、WARP10 ソフトウェア レンダリング デバイス、Direct2D、DirectWrite、および 10level9 と WARP10 をサポートする更新された Direct3D 10.1 という追加のグラフィックス コンポーネントが多数含まれています。 これらのグラフィックス コンポーネントとその他の Windows グラフィックス コンポーネントの詳細については、「Windows グラフィックス API」を参照してください。

これらの新しいグラフィックス コンポーネントはすべて、Windows 7 および Windows Server 2008 R2 オペレーティング システムに組み込まれています。 Direct3D 11 API および関連コンポーネントは、Windows Update のシステム更新プログラムを使用して Windows Vista にインストールすることもできます。 この更新プログラムには、Windows Vista および Service Pack 2 が必要です。 自動更新が有効になっているエンドユーザーは、すべての Windows 7 ユーザーと同様に、Direct3D 11 コンポーネントが既にインストールされている可能性があります。

D3D11InstallHelper サンプルは、Direct3D 11 API の検出を簡略化し、エンド ユーザーのコンピューターに該当する場合はシステム更新プログラムを自動的にインストールし、新しい Service Pack が必要な場合は、手動でエンド ユーザーに適切なメッセージを提供するように設計されています。

手記

HLSL コンパイラ (D3DCompile*.dll) と Direct3D 11 (D3DX11*.dll) 用 D3DX ユーティリティ ライブラリは、Windows オペレーティング システムのどのバージョンにも組み込まれていませんが、既存の DirectSetup テクノロジを使用してアプリケーションのインストーラーの一部として展開できます。DirectSetup の使用方法の詳細については、「ゲーム開発者向けの DirectX インストール 」を参照してください。 "Effects 11" は、Direct3D 11 Update Effects で共有ソース サポート ライブラリとして使用でき、(DXUT ユーティリティ ライブラリと同様に) アプリに直接含めることができます。 そのため、実行時の再配布に関する追加の要件はありません。

Direct3D 11.3

Windows 10 には、Direct3D 11.3 API が組み込まれています。 Direct3D 11.3 API の新機能の一覧については、「Direct3D 11.3 の機能」を参照してください。

Direct3D 11.2

Windows 8.1 および Windows Server 2012 R2 には、Direct3D 11.2 API が組み込まれています。 Direct3D 11.2 API の新機能の一覧については、「Direct3D 11.2 の機能」を参照してください。

Direct3D 11.1

Windows 8 および Windows Server 2012 には、Direct3D 11.1 API 組み込まれています。 Direct3D 11.1 API の部分的なサポートは、Windows 7 または Windows Server 2008 R2 で、Platform Update for Windows 7 がインストールされている状態で利用できます。 Windows 7 のプラットフォーム更新プログラムの詳細については、「Windows 7 用プラットフォーム更新プログラム」を参照してください。

D3D11InstallHelper.dll

D3D11InstallHelper.dll は、Direct3D 11 コンポーネントを検出し、必要に応じて Windows Update サービスを介してシステム更新を実行するためのコア機能をホストします。 DLL はメッセージやダイアログ ボックスを直接表示しません。

DLL は、次のエントリ ポイントで構成されます。

CheckDirect3D11Status

この関数は、必要なチェックを実行し、このコンピューターの Direct3D 11 の状態を返します。 この関数には管理者権限は必要ありません。

  • D3D11IH_STATUS_INSTALLEDの状態は、Direct3D 11 が既にコンピューターにインストールされており、使用できる状態であることを示します。
  • D3D11IH_STATUS_NOT_SUPPORTEDは、このバージョンの Windows が Direct3D 11 または関連テクノロジをサポートしていないことを示します。
  • D3D11IH_STATUS_NEED_LATEST_SPの状態は、最新の Windows Vista Service Pack をユーザーがインストールする必要があることを示します。
  • 最後に、D3D11IH_STATUS_REQUIRES_UPDATEの状態は、システムに Direct3D 11 がインストールされていないが、システム更新プログラムがこのバージョンの Windows に適用されることを示します。

DoUpdateForDirect3D11

この関数は、Windows Update API を使用して、このシステムに Direct3D 11 をインストールするためのシステム更新プログラムを実行します (該当する場合)。 この関数では、Windows Update へのネットワーク接続と管理者権限が必要であることに注意してください。 省略可能な進行状況コールバック関数とユーザー コンテキスト ポインターを受け取り、完了すると最終的な結果コードを返します。

  • D3D11IH_RESULT_SUCCESSの結果は、システム更新プログラムが適用され、使用できる状態であることを示します。D3D11IH_RESULT_SUCCESS_REBOOTは、コンピューターが完了する前にコンピューターを再起動する必要があることを示します。 この関数は、システムの再起動をスケジュールしないことに注意してください。
  • D3D11IH_RESULT_NOT_SUPPORTEDは、システム更新プログラムがこのバージョンの Windows に適用されないことを示します。 この結果は、この関数が CheckDirect3D11Status からD3D11IH_STATUS_REQUIRES_UPDATE状態を取得した後にのみ呼び出される場合は発生しません。
  • D3D11IH_RESULT_UPDATE_NOT_FOUNDの結果は、Windows Update サーバーでシステム更新プログラム パッケージが見つからなかったことを示します。
  • Windows Update のダウンロードまたはインストールに失敗した場合は、結果としてD3D11IH_RESULT_UPDATE_DOWNLOAD_FAILEDまたはD3D11IH_RESULT_UPDATE_INSTALL_FAILEDが返されます。
  • Windows Update API からネットワーク接続エラーが返された場合、D3D11IH_RESULT_WU_SERVICE_ERROR結果が返され、問題が断続的であるか、ネットワーク構成またはファイアウォール設定に関連している可能性があることを示します。 更新関数をもう一度試しても成功する可能性があります。

Windows Update API の詳細については、Windows Update エージェント API に関する記事を参照してください。

D3D11Install.exe

手記

D3D11Install.exe を実行するには、D3D11InstallHelper.dll が必要です。

D3D11Install.exe は、D3D11InstallHelper.dll を UI メッセージとエンド ユーザー メッセージを含むスタンドアロン インストーラーとして使用するためのツールであり、DLL を適切に使用するための例として機能します。 Direct3D 11 が既にインストールされている場合、システムの更新プログラムがシステムの再起動を必要とせずに正常に適用される場合、Service Pack のインストールが必要な場合、またはこのコンピューターで Direct3D 11 がサポートされていない場合、プロセスは 0 で終了します。 システム更新プログラムが正常に適用され、システムの再起動が完了する必要がある場合は、1 が返されます。 他のエラー条件に対して 2 が返されます。 この実行可能ファイルを実行するには管理者権限が必要であり、UAC が有効になっている Windows Vista または Windows 7 で実行するときに昇格を要求するマニフェストがあることに注意してください。 D3D11Install.exe は、Direct3D 11 更新プログラムを展開するためのスタンドアロン ツールとして使用することも、インストーラーで直接使用することもできます。

次のコマンド ライン スイッチがサポートされています。

/quiet

メッセージ、プロンプト、進行状況ダイアログ ボックス、またはエラー メッセージを表示しません。

/passive

メッセージ、プロンプト、またはエラー メッセージは表示されませんが、進行状況ダイアログ ボックスが表示されます。

/minimal

最小限のプロンプトのみを表示します。

/y

必要に応じて、標準インストールと最小インストールで更新プログラムのインストールを確認するように求めるメッセージが表示されないようにします。

/langid decimal の

エンド ユーザー メッセージとダイアログ ボックス リソースを表示するときに使用する言語識別子コードを強制します。 既定値は 1024 で、システムの既定の言語設定を使用します。

/wu を する

マネージド サーバーまたはその他の標準以外の構成で実行されている Windows Server Update Services (WSUS) である可能性がある、システムの既定値ではなく、Windows Update を強制的に使用します。

インストール プログラムへの統合

Windows 用ゲームのサポート容易インストール技術的要件 3.1 に準拠するには、インストール プロセスの早い段階でエンドユーザーのプロンプトが表示されるように注意し、UAC 関連の昇格プロンプトが複数存在しないように注意する必要があります。 この目標を達成するには、次の 3 つの基本的な選択肢があります。

  1. 最も基本的な方法は、/minimal コマンド ライン スイッチを使用して D3D11Install.exe を実行することです。 これはインストーラー 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の場合は、/minimal /y スイッチを使用して D3D11Install.exe を実行して、ダイアログ ボックスを表示したり、更新を実行したりできます。 これらの手順は、インストール プロセスの早い段階 (通常は Q&A の直後) に実行する必要があり、実行可能ファイルを実行するには管理者権限が必要です。

InstallShield への統合

InstallShield の InstallScript からの Direct3D 11 展開の処理は、D3D11InstallHelper サンプルを使用して簡単に行うことができます。 InstallScript を使用して InstallShield と統合するために必要な手順は次のとおりです (前のセクションで説明した方法 3 を使用)。

  1. InstallShield エディターで InstallScript プロジェクトを開きます。

  2. サポート ファイルでプロジェクトに D3D11InstallHelper.dll と D3D11Install.exe を追加します。

    InstallShield Project にファイルを追加するには

    1. [インストール デザイナーの] タブで、左側のナビゲーション ウィンドウの [の動作とロジック] の [サポート ファイル/ビルボード] をクリックします。
    2. [言語に依存しない クリックし、[ファイル] ウィンドウで右クリックし、[ファイルの挿入] 選択します。 参照して D3D11InstallHelper.dll と D3D11Install.exeを追加します。 これらのファイルの既定の場所は、SDK root\Samples\C++\Misc\Bin\x86 です。
  3. InstallScript エクスプローラーで、DLL または実行可能ファイルを呼び出す InstallScript ファイル (通常は Setup.rul) をクリックします。このファイルは、左側のナビゲーション ウィンドウの Behavior and Logic にあります。

  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 プロトタイプ 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 プロトタイプ NUMBER D3D11InstallHelper.DoUpdateForDirect3D11IS(BOOL);```

  1. OnFirstUIBefore 関数のファイルに、戻り値 0 の直前に、次の InstallScript を貼り付けます。

    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 パッケージへの統合

MSI カスタム アクションを使用して Direct3D 11 の展開を統合するために必要な手順の概要を次に示します (このトピックで前述した方法 3 を使用)。

  1. インストール時に D3D11Install.exe と D3D11InstallHelper.dll への相対パスを含む relativePathToD3D11IH という MSI プロパティ テーブルにプロパティを追加します (通常はメディア イメージ内にあります)。 これにより、MSI プロパティD3D11IH_STATUS CheckDirect3D11Status によって返される状態 (列挙記号または "ERROR" と等しい文字列プロパティ) も設定されます。
  2. CostFinalize アクションの後、D3D11InstallHelper.dll 関数 SetD3D11InstallMSIProperties を直接カスタム アクションとして呼び出して、他のカスタム アクションに適切な MSI プロパティを設定します。
  3. インストール時に、DoD3D11InstallUsingMSI D3D11InstallHelper.dll 関数を呼び出す InstallFiles アクションの後に遅延カスタム アクションをトリガーします。 カスタム アクションでは、昇格されたコンテキストで実行する msidbCustomActionTypeNoImpersonate フラグを設定する必要があります。
  4. InstallFinalize アクションの後、D3D11InstallHelper.dll 関数 FinishD3D11InstallUsingMSI を直ちにカスタム アクションとして呼び出し、必要に応じて再起動要求の結果コードを処理します。

この手順の詳細については、次の手順で説明します。この手順では、Orca エディターなど、MSI エディターを使用して実行できるプロセスについて説明します。 一部の MSI エディターには、これらの構成手順の一部を簡略化するウィザードがあります。

D3D11InstallHelper.dll と統合するために MSI パッケージを構成するには

  1. Orca で MSI パッケージを開きます。

  2. 次の表に示す行を MSI パッケージのバイナリ テーブルに追加します。

    名前 データ
    D3D11IH DLL\D3D11InstallHelper.dll へのファイル パス

     

    手記

    このファイルは MSI パッケージに埋め込まれるので、D3D11InstallHelper.dll再コンパイルするたびにこの手順を実行する必要があります。

     

  3. 次の表に示す行を MSI パッケージの CustomAction テーブルに追加します。

    アクション 種類 ターゲット
    Direct3D11SetProps msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue = 65 D3D11IH SetD3D11InstallMSIProperties
    Direct3D11DoInstall msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3137 D3D11IH DoD3D11InstallUsingMSI
    Direct3D11Finish msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue = 65 D3D11IH FinishD3D11InstallUsingMSI

     

  4. 次の表のアクション、条件、シーケンスに表示される値を、MSI パッケージの InstallExecuteSequence テーブルに追加します。

    アクション 条件 順序 筆記
    Direct3D11SetProps 1016 シーケンス番号は、CostFinalize の直後にアクションを配置します。
    Direct3D11DoInstall インストールされていません 4004 このカスタム アクションは、すべてのユーザーの新規インストール中にのみ行われます。 シーケンス番号は、InstallFiles の後とロールバック後にアクションを配置します。
    Direct3D11Finish 6615 シーケンス番号は、InstallFinalize の直後にアクションを配置します。

     

  5. 次の表に示す行を、MSI パッケージの Property テーブルに追加します。

    財産 価値
    RelativePathToD3D11IH D3D11Install.exe と D3D11InstallHelper.dll を含む相対ファイル パス

     

    手記

    パスで指定された場所は、インストール パスで指定された場所 ("redist\" など) に対する相対位置です。

     

  6. MSI パッケージを保存します。 MSI パッケージと Windows インストーラーの詳細については、「Windows インストーラーの」を参照してください。

デバッグのヒント

D3D11InstallHelper.dll と D3D11Install.exe の両方を Visual Studio のデバッグ構成でビルドできます。これらのバージョンでは、標準の Windows デバッグ出力メカニズムにメッセージが出力されます。

会社の設定

D3D11InstallHelper サンプルは、コンシューマーがゲームをインストールするための最も一般的なシナリオである Windows Update を使用した標準展開用に設計されています。 ただし、パブリッシャーや開発スタジオで作業している多くのゲーム開発者は、Windows Server Update Services (WSUS) テクノロジを使用してソフトウェア更新プログラムを提供するローカル管理サーバーを持つエンタープライズ設定で行います。 この種の環境では、ローカルの IT 管理者は、企業ネットワーク内のコンピューターで使用できる更新プログラムを承認制御できます。また、標準のコンシューマー バージョンの更新 KB 971644は使用できません。

企業/エンタープライズ設定で DirectX 11 を展開するための 3 つの基本的なソリューションがあります。

  • 一部の構成では、ローカルで管理されている WSUS サーバーを使用するのではなく、Windows Update を直接確認できます。 このため、D3D11InstallHelper では、/wu コマンドライン スイッチがサポートされています。 ただし、すべての企業ネットワークでパブリック Microsoft サーバーへの接続が許可されているわけではありません。
  • ローカル IT 管理者は、OFFICE 11 API を含む、WSUS から展開されたエンタープライズでサポートされる更新プログラムである KB 971512を承認できます。 これは、Standard ユーザーが完全にロックダウンされている環境で Direct3D 11 更新プログラムを取得するための唯一のオプションです。
  • または、KB 971512を手動でインストールすることもできます。

ゲーマーのコンピューターがローカルで管理されている WSUS サーバーからのみ更新プログラムを取得できることは非常にまれであり、このような環境に存在する可能性が高い大規模な組織の開発者だけです。

ゲーム開発者向けの Windows ファイアウォールの

ゲーム開発者向け Windows ゲーム エクスプローラー