~プログラミング~ DirectX 11はDirectX 9と何が違うか その2

C++言語でDirectX 11を使ったアプリケーションを開発してみよう。

DirectX 9の時との比較をしながらDirectX 11でのアプリケーションの作り方をまとめてみようと思います。

 

前回に続き、DirectX 9がDirectX 11になるまでの間にどのような変更点があったのかを確認してみます。

本格的なマルチスレッド対応

Direct3D 9や10でもマルチスレッドに対応していなくはないのですが、原則としてレンダリング用の単一のスレッドがリソースアクセスや描画を行う必要がありました。

 

Direct3D 11からは、複数のスレッドで同じメソッドを同時に呼び出すことが出来ます。

DXGI(DirectX Graphics Infrastructure)の導入

DirectX 9までは3Dランタイム(Direct3D)に含まれていた機能の一部が切り離されて、DXGIというフレームワークが登場しました。

ハードウェアとの通信など低レベルのタスクを担当すします。

 

バージョンアップの度に変化が激しいレンダリング部分と、それほど変化のない低レベルな部分を分離したという事らしいです。

 

ビデオカードやモニタなどをアダプタという抽象的な概念で扱えるようにしたり、スワップチェーン(ダブルバッファリング)などをDXGIが担当するようになります。

デバイスとデバイスコンテキスト

Direct3D 9や10までは、リソースやオブジェクトの作成とレンダリングは単一のデバイスオブジェクト(IDirect3DDevice9)が管理していました。

 

Direct3D 11からは、リソースやオブジェクトの作成はデバイスオブジェクト(ID3D11Device)が、レンダリングはデバイスコンテキストオブジェクト(ID3D11DeviceContext)が管理するようになります。

デバイスロストはもうしない

DirectX 9までは、たどえばスクリーンセーバーが起動した場合など、デバイスロストな状態となり以降描画が出来なくなってしまいます。これに対処するためデバイスロストを検知してロストしてたらリセットし直すといったコードを書かなければならなりませんでした。

(IDirect3DDevice9::PresentメソッドがD3DERR_DEVICELOSTを返したらIDirect3DDevice9::Resetメソッドを呼ぶなど)

 

DirectX 10以降ではこのようなタイミングでデバイスがロストする事はなくなりました。

 

 ※但し、以下のようなシナリオではデバイスの再作成が必要

  • グラフィックスドライバーがアップグレードされた場合
  • システムのグラフィックスアダプターが省電力モードから性能重視モードに変わった場合
  • グラフィックスデバイスが応答を停止してリセットされた場合
  • グラフィックスアダプターが物理的に接続された場合、または取り外された場合