イベント
[GDC 2014]DirectX 12,ついに発表。その特徴に迫る
DirectX 11が発表されたのは2009年。Windows 7とほぼ同時期にリリースされたことを憶えている人もいることだろう。2012年にWindows 8とDirectX 11.1が,2013年にはWindows 8.1とDirectX 11.2がリリースされているが,メジャーバージョンアップとしては本当に久しぶりということになる。
DirectX 12登場の背景
「GPUの性能はどんどん向上している。CPUは,1コアあたりの性能向上率はそれほどでもなくなっている一方,CPUのコア数自体は増加傾向にある。では,そんな状況にあって,ゲーム開発者は一体何を欲しているのか」。DirectX 12の開発は,この問いかけが起点になっているという。
氏は,そうした要望に応える形で提供されることとなるのがDirectX 12であると位置づけていた。
なお,DirectXとは,Microsoftが自社プラットフォームに提供するマルチメディアプログラミングAPIのことで,本来はサウンドやネットワーク,入力インタフェース関連などまでを網羅したものとなるが,今回発表されたのは「DirectX 12」の3DグラフィックスAPI部分「Direct3D 12」になる。
ただ,慣例的に「DirectX≒Direct3D」とされる傾向が強く,本セッションでもそのように扱われていたため,本稿もそれに倣い,Direct3D 12とDirectX 12を基本的に区別しない。この点はご了承のほどを。
DirectXが誕生した1990年代中期は,さまざまなメーカーがそれぞれ独特なアーキテクチャに基づくGPUを用意しており,そして,そこには機能差もあったことから,“違い”を吸収するための抽象化レイヤーを分厚くする必要があった。当時のGPUは,データやパラメータを与えて「GPUの機能を呼び出す」というプログラミングモデルだったこともあり,ゲームアプリケーションとGPUまでの“距離感”が相当に大きかった,という表現も可能だろう。
しかし現在,PC向けGPUのメジャープレイヤーはIntelとNVIDIA,AMDの3社のみであり,モバイルデバイスや組み込み機器向けGPUですらも,3社いずれかのアーキテクチャに似た構造となった。かつてのような分厚い抽象化レイヤーはもはや必要なくなってきている。
そこでMicrosoftは,1990年代に構築された古い土台をすべて取り去って,すっきりした透明性の高いアーキテクチャへと,DirectXを改変することにしたのである。
またMicrosoftは,WindowsベースのPCだけでなく,Windows PhoneとXbox OneにもDirectX 12を提供する計画があると今回明らかにしており,グラフィックスAPIを一気に刷新する心づもりでいる。一時期は「DirectXはもう終わり」とまことしやかに囁かれるほどだったが,ここで心機一転の再スタートを図ろうということなのだ。
DirectX 12は何がどうすごいのか
現状のDirectXは,「DirectX APIを通じてパラメータをドライバに受け渡し,ドライバ側がGPUに向けて(描画)コマンドとパラメータ列を形成して発行する」構造になっているが,ここに問題が2つある。
1つは,DirectXが提供している「APIを利用してDirectX側が作り出すコマンドとパラメータのペア」が,GPU内部のハードウェアを直接ドライブするようにはなっていない点だ。これは,「DirectXのアーキテクチャが古すぎて,実在する最新世代のGPUアーキテクチャとかけ離れすぎてしまった」と考えれば分かりやすいだろうか。
詳細は後日あらためてお伝えしたいと思うが,誤解を恐れずに簡略化して言うと,PSOというのは,グラフィックスパイプラインとGPU内部ハードウェアとの対応を一意的に定義づけて利用する仕組みのこと。PSOを定義づけておけば,それ以降はGPUに対し「これからお願いする描画は,PSOで定義した工程表(パイプライン)ベースでお願いします」と発注できる。
従来のDirectXでは「頂点シェーダでこの処理を行う」「ピクセルシェーダでこの処理を行う」といった感じの,細切れな指示になっていたため,処理のストール(stall,停止)が生じやすかった。その点PSOなら,GPUはあらかじめ定義された工程表に基づいて,すぐに処理に取りかかれるのである。
もう1つは,コマンドを伝送する仕組みそのものの問題だ。
従来のDirectXでは,APIを通して,「描画の件なんですがね」「第一パラメータは●●です」「第二パラメータは××です」といった感じに,コマンドを逐次的に発行していた。砂時計にたとえるなら,上がCPU,下がGPUで,上下は大きく開いているのに,中央部がぎゅっとすぼまったイメージ。砂粒(≒仕事)は1本の線状でしか,GPUのほうに落ちていかないのである。
その点,DirectX 12では,あらかじめ確保しておいたメモリバッファ上で描画コマンドやパラメータを形成しておき,これをドライバへ一気に渡せるようになった。当然,メモリバッファ上に描画コマンドやパラメータを形成する処理は複数のCPUスレッドで並列に実行できる。つまり,マルチスレッドを効果的に利用できるということだ。砂時計でいえば,中央のすぼまった部分が押し広げられたようなイメージだろうか。
「ドライバを通じてGPU側に伝送される前の描画コマンド」はドライバ側でGPUのネイティブ命令に変換されるので,ここにまだ抽象化レイヤーは存在することになるが,まとまった量の描画コマンド列を一気に発行できる以上,効率は従来比で格段に改善する。
さらにDirectX 12では,この「GPU側で直接実行できるように変換されたネイティブコマンド列」を保存しておける仕組みも導入された。これは「Bundles」(バンドル)と呼ばれ,そのままBundlesを再発行してGPUを駆動することもできる。うまく活用すれば,抽象化レイヤーを超えた先で,超高効率でGPUをドライブすることも可能なのだ。
また,テクスチャや各種データテーブルなどといった,レンダリングに必要な素材を,アプリケーション側が任意のスタイルでその素性を定義しつつグラフィックスメモリ上に置き,実際のレンダリング時には各種シェーダから自由にアクセスする仕組みも新設されている。DirectXのAPIを介して「これはテクスチャです」としていちいち宣言したり定義したりすることなく,かなりのダイレクト感をもって,グラフィックスメモリ上にデータや素材を自在に置けるようになったのである。
CPUのプログラムにおいて,当該プログラムの開発者は,プログラム実行の各局面に応じて,確保したメモリ空間を好きに使っていた。そういった自由なメモリの使い方がGPUでもできるようになったことになる。
もっともこれは,家庭用ゲーム機のGPUプログラミングでは結構前からそうだったので,概念的に新しいものではない。DirectX 12が,家庭用ゲーム機的なGPUプログラミング哲学を取り入れたという認識のほうが正しいので,この点は押さえておく必要があろう。
DirectX 12のβ版は2014年後半リリース。正式リリースは2015年か
DirectX 12にはどの程度の性能を期待できるのか。
セッションでは,「3DMark 11」の「High Temple」を,従来どおりのDirectX 11で動作させたものと,DirectX 12に対応させて動作させたものとで,CPU負荷に違いが出るかどうかが披露された。
その結果が下のスライドだが,DirectX 11では,4つあるCPUスレッドのうち1つで極端に負荷が高くなっている。それに対し,Bundlesを活用しているDirectX 12では,CPU負荷が極端に低い。
DirectX 11での実行結果。テキストで表示された「O+」のバーが長いほど当該スレッドのCPU負荷が高いことを示すが,ここでは「Thread 0」の負荷が高い |
DirectX 12での実行結果。「Thread 0」のCPU負荷は極端に下がっている |
処理の内訳も下のとおり示された。下の図は,上の「Thread 0」〜「Thread 3」がDirectX 11,下の「Thread 0」〜「Thread 3」がDirectX 12のそれぞれ内訳だ。「App Logic」はアプリケーション実行負荷。「Direct3D」はDirect3DのAPIオーバーヘッド,「UM Driver」はユーザーモードドライバ負荷,「Kernel」はOSカーネル負荷,「KM Driver」はカーネルモードドライバ負荷,「Present」は描画表示負荷を示しているが,違いは一目瞭然といえる。
セッションでは,NVIDIAによる評価版のDirectX 12ドライバ上で動作する「Forza Motorsport 5」の技術デモが公開された。こちらは性能を示すものではなく,「実際にゲームが動いている」ことを示すための目的で公開されたようだ。「PC版のForza Motorsport 5がDirectX 12ベースで開発されている」ことを示すものではないので,その点は注意してほしい。
気になるDirectX 12の提供時期だが,2014年後半にプレビュー版(β版)がリリースされる予定となっている。正式版は「2015年のクリスマス商戦に臨むPCゲームのリリースに間に合うような形で提供したい」という形で予告されたので,常識的に考えれば,正式リリースは2015年ということになるだろう。
DirectX 12にまつわる疑問に答えてみる
最後に,セッション後の質疑応答や,セッション後に筆者が関係者に取材した情報を基に,想定される質問と回答を用意してみた。こちらも合わせて参考にしてもらえればと思う。
Q:DirectX 12はどのOSに提供されるのか
A:
Windows 7とWindows 8.x(もしくはその後継OS)と見られる。間もなくサポートが終了するので当たり前といえばそれまでだが,Windows XPへの提供は「ない」と公式に否定されている。
Q:DirectX 12はWindows以外にも提供されるのか
A:
セッションのレポートでも触れたとおり,Windows PhoneとXbox Oneには提供される見込み。Xbox One向けのゲームタイトルのPC向け移植やWindows Phoneへの移植が容易になるはずだ。
Q:DirectX 12の対応GPUは?
A:
当面はDirectX 11世代のGPUが対応製品となる見込み。NVIDIAならFermi世代,AMDならGraphics Core Next世代ということになる。
Q:DirectX 12向けに開発されたゲームはDirectX 11環境で動作するのか。逆に,DirectX 11向けのタイトルはDirectX 12で動作する?
A:
DirectX 11とDirectX 12は,名前こそ「DirectX」ながら,基本アーキテクチャが異なるため,相互に互換性はない。
実のところ,この仕切り直しは,DirectX 10の時も起こった。DirectX 10では基本アーキテクチャがDirectX 9から一新されたため,過渡期のPCゲームでは,タイトルによって,DirectX 9バイナリとDirectX 10バイナリの2つが提供されたりしていたが,DirectX 12の登場直後は同じようなことが起こるだろう。
Q:DirectX 12で実現されているのは性能向上のためのアーキテクチャ改変“だけ”で,新しいシェーダステージの追加や,新機能の搭載はない?
A:
Microsoftの公式回答は「現時点では未定」。ただし,現段階でも「プログラマブルブレンド」(Programmable Blend)パイプラインと,順不同半透明描画(Order Independent Transparency),コンサバティブ・ラスタライゼーション(Conservative Rasterization)などの搭載は決定している。
Q:聞けば聞くほど,DirectX 12のコンセプトはMantleのそれと非常によく似ている。PSOやコマンドバッファの概念,素材の取り扱い概念はMantleと同じではないのか
そのとおり。経緯は不明ながら,仕様にはよく似ている部分がある。これまでAMD(や旧ATI Technologies)もしくはNVIDIAの提唱する「独自機能」がDirectXに採用されたことは過去にたくさんあるので,今回もそのパターンという可能性はあるが,この点についてMicrosoft,そしてAMDから公式の言及はない。
この件に関して現時点で言えることは,AMDがDirectX 12を歓迎していることと,DirectX 12の登場によってMantleの立ち位置が微妙になることの2点だけだ。
Q:DirectX 12で,Compute Shaderはどう扱われるのか
A:
Compute Shaderの取り扱いは未定。Mantleのような「非同期でのGPGPUとグラフィックスレンダリングの同時発行」も,対応するかどうかは未定とされている。
Q:DirectX 12が登場したことで,PlayStation 4に何らかの影響はある?
A:
直接的には「ない」が,間接的には「ある」と思われる。
実のところ,現在PlayStation 4(以下,PS4)の開発者に向けて提供されているグラフィックスライブラリの1つに,「疑似DirectX 11ライブラリ」がある。そして,聞くところによれば,PCゲームを開発して,それをPS4にポーティングするスタイルのゲームスタジオは,この疑似DirectX 11ライブラリを活用することが多いという。正式にDirectX 12がリリースされた後は,“疑似DirectX 12ライブラリ”が提供されるはずだが,そこにタイムラグが発生したりする可能性はあるだろう。
逆に言えば,PS4ネイティブに開発しているゲームスタジオへの影響は間接的にもあまりない。
Q:DirectSoundとかDirectInputとか,他のDirectXファミリーはどうなるのか
A:
未定とのこと。ただ,「現在のところ話せる段階にはないが,最終版のDirectX 12には,これまでのDirectXと同じように,グラフィックス以外のAPIも含まれるだろう」とのコメントは得られている。
- 関連タイトル:
DirectX
- この記事のURL: