GDC 2015ではDirectX 12そのものの新しいニュースはなかったが、複数のセッションでプログラマー向けの詳細な解説を見ることができた。その中で、DirectX 12がゲームのパフォーマンスを向上させる仕組みが具体的に見えてきたのでご報告しておこう。

しかし本当に効果はあるのか、なぜ従来のDX11 APIよりも高速なゲームが作れるのか、といった疑問もある。

年内のリリースが予定されているDirectX 12。Microsftプラットフォームのゲーム開発APIとして、PC、コンソール、モバイル端末までの幅広いデバイスでより高いパフォーマンスを引き出すとされているメジャーアップデートだ。

データ構造や並列性の強化でCPU＆GPUパワーを大幅に引き出す

DirectX 12（以下『DX12』）は、ゲームグラフィックスのパフォーマンスを高めるため、特にプログラミングモデルの面でドラスティックな変更が行なわれたAPIだ。DX11以前の手法ではドライバーが担当していた処理もゲーム側が明示的に行なえるようにし、それによってCPU・GPUの処理を無駄なく活用しようという考えが根本にある。

DX12は開発者向けのバージョンが既にリリースされており、現在は、ゲームエンジン系のプログラマがDX12の機能を活用するべく対応を進めているという状況にある。それを反映して、今回のGDCで多数行なわれたDX12関連セッションでは、非常に具体的な実装テクニックの話題が中心となっていた。

まずGPUパワーを引き出すカギとなっているのが、描画リソースをを扱うための新しいデータ構造や属性の数々だ。GPUに描画を命令するコマンドは以前よりCommand Listという形でまとめられ、Drawコールに渡される仕組みとなっていたが、それに加えてDX12では、より小さな単位で描画命令をまとめるBundleという概念を導入している。

Bundleは小さなオブジェクトの描画など、ごく少ないコマンドから構成される要素だ。単位が小さく、汎用性が高くなるため、再利用も容易である。これによりコマンドの再利用率を高めてCPUの処理を軽減したり、GPUが新たな命令を解釈する手間を減らすといったことができるようだ。

またDX12ではテクスチャなどのリソースについても、細かく属性や使用タイミングを指定、コントロールできるようになった。これにより、以前ならドライバー側で勝手に行なっていた変換・転送系の処理を、本当に必要なタイミングに限ることができ、負荷を削減できる。

それはGPU側も同じで、順番を気にせずに（アウト・オブ・オーダー）で処理できるものにどんどん処理を進めることができるため、DX11以前では順番にタイミングを図りながら処理をしていたケースでも、まとめて一気に片付けるという形の効率化が可能になった。このあたりも、従来はドライバー側で推測を交えながら勝手にやっていた処理を、プログラム側で明示的に制御できるようになった効果である。

そういった細かい制御が可能になったという点は、処理の並列性を向上させるためにも重要な要素となっている。例えば互いに依存性のないコマンドやリソースについて明示化することにより余計なブロッキング（処理待ち）をなくせるため、複数スレッドで効率的にGPUへの転送や命令の発行を行なえるというものだ。

【DX12 リソースマネジメントによるパフォーマンス向上】

今回行なわれていた技術セッションでは上記のようなAPIアーキテクチャや実装のガイドラインが次々に示されていった。確実に言えるのは、単にDX12でゲームを作っただけで速くなるわけではないということだ。DX12に備わった機能をしっかり活用してはじめて、効率的にGPUパワーを引き出し、コンソールマシンなみのパフォーマンスをPC上で得ることが可能となる。

とはいえ、いま遊ぶことのできるほとんどのゲームは、Direct Xを直接コントロールするのではなく、何らかのゲームエンジンに載って動作しているものだ。したがって、Unity、Unreal Engine、CryEngineといったメジャー系のエンジンがDX12への最適化を進めれば、それらを使った最新ゲームのパフォーマンスも上がっていくということになる。

このことから、2009年に登場したDX11への対応が広く進むのに数年を要したことにくらべ、各ゲームのDX12への対応はより速いペースで進んでいくと期待できる。

ちなみに、Xbox Oneには既にDX12相当の機能が盛り込まれており、DX12の恩恵を新たに受けられるのはPC、モバイルといったコンソール以外のプラットフォームにおいてとなる。それでも、ハイエンドPCゲームがさらに幅広い環境で遊べるようになるというのは、多くのゲーマーにとって嬉しい知らせになるはずだ。