目次

3D Low overhead API (Low Level API) Metal/D3D12/Vulkan

新しい API

負荷が小さくより低レベルで Game Console に近づく。

API Platform FeatureLevel API Shader Common Shader Binary
Metal iOS 8 +, OSX(macOS) 10.11+ 10+ (OpenGL ES 3.1) Objective-C C++ Y
Direct3D 12 Windows 10 + 11+ C++ hlsl Y
Vulkan Windows 7+, Linux, Android 10+ C glsl/hlsl 他 Y

従来の API の反省点

Draw Call の CPU 負荷が非常に高い

Draw Call 負荷が高い理由の一つ ステート

Draw 命令の負荷が非常に高くなる。ステートなどの情報を何度もメモリコピーしなければならない。 Draw 命令の負荷が高いために何度も Draw を呼び出すことが出来ない。

コマンドバッファ

新しい API のメリット

新しい API のデメリット

これまでドライバが自動的にうまいこと管理してくれていた部分まで、自分でやる必要が生じます。 特に複数のプロセッサから同時にアクセスされるメモリやキャッシュの仕組みを考慮しなければなりません。 API の設計次第ですが、例えばレンダーターゲットを次の描画でテクスチャとして参照する場合は同期命令が必要です。

Game Console (ゲーム専用機) との関係

Game Console (専用機) は最初から API の overhead が小さいため、これらの API を採用しなくても十分パフォーマンスが出るように作られています。 そのため、Game Console がこれらの新しい API を採用する必要性は特にないでしょう。 ただし対応することで PC や Mobile デバイスとの互換性が取りやすくなるメリットがあります。

またパフォーマンス的な差が小さくなるので、専用機に対する敷居が下がります。 たとえば Linux や Android を使っても、今まで以上に性能を引き出せるゲーム端末を簡単に作れるようになるでしょう。

いつから使えるのか

API Platform Beta SDK Release GPUs
Metal iOS iOS 8~ 2014/06 2014/09 PowerVR G6430/GX6450/GX6850 (Apple A7,A8,A8X,A9,A9X)
Direct3D 12 Windows 10 2014/10 2015/07/29 RADEON GCN, GeForce Kepler/Maxwell, Intel Gen7.5~ (Haswell/Broadwell/Skylake)
Mantle Windows 2014/05 2015 RADEON GCN (Windows)
Metal OS X Mac OS X 10.11 El Capitan 2015/06 2015/09 GeForce Kepler~/RADEON GCN/Intel HD Graphics 4000 (Gen7~)
Vulkan Android / Windows / Linux 2016/02 GeForce Kepler~/RADEON GCN/Intel HD Graphics Gen9~(Windows)/Gen7~(Linux)/OpenGL ES 3.1~
2018/06/21 20:05
2016/08/26 18:35
2016/09/24 14:52

どんな GPU で使えるのか

これまでの Direct3D 8 → Direct3D 9 → Direct3D 10 → Direct3D 11 のような GPU の進化に沿った拡張ではないのが今回の最大の特徴です。 CPU を活用するために行われた API とドライバの再設計なので、ハード的な要件はほぼ無いと言って良いでしょう。

現在使われている Direct3D 11 世代の GPU でそのまま新しい API が使えます。 ただしハード的に対応が可能だったとしても、ドライバがリリースされるかどうかはメーカー次第です。 ドライバがなければ使うことができません。

特にモバイル向け GPU はユーザーが自由にドライバをインストールできるわけではないので、注意が必要です。

互換性の問題

現在 (2014) OpenGL ES 2.0 によって、ほぼすべての Mobile 端末から Web まで高い互換性を保つことができるようになっています。 ところがもし Low overhead API が多く使われるようになると、上記のように対応プラットフォームがばらばらで、再び互換性の問題が生じることになります。

特に iOS の場合は、OpenGL ES 3.0 対応 GPU と Metal 対応 GPU が一致しているので、OpenGL ES 3.0 を用いるメリットが大幅に減少しています。 もしかしたら OpenGL ES 3.0/3.1 はあまり普及することがなく、別の新しい API に取って代わられることになるかもしれません。

実際の API の種類

AMD Mantle

最初に発表された Low Level API (Low Overhead API) です。 Vulkan のベースとなりました。 RADEON Driver に含まれています。 ただし Windows かつ RADEON GCN 専用なので、今後は Vulkan の使用が推奨されるものと思われます。

DirectX 12 (Direct3D 12)

Direct3D 11 の後継。 Windows 専用ですが Xbox One も対応します。

ゲーム専用機や Metal とは異なり、同じ低レベル API でも不特定多数の GPU に対応する必要があります。 そのためある程度抽象化されており、低負荷ながら汎用性が重視されています。

GPU 毎にハードの対応度によっていくつかのグループ分けが行われています。 tier1, tier2, tier3 それぞれ、一度にバインド可能な Descriptor 数などリソースの上限に違いがあります。 tier3 に対応している RADEON GCN ではほぼ制限無しにリソースにアクセスできるようです。

既存の多くの GPU で対応しますが新しい機能を活用するには FeatureLevel 12 以上の GPU が必要です。

DirectX 12 (Direct3D 12) の詳細はこちらに追加していきます。

Apple Metal (iOS/OSX)

もっとも早く一般公開された低レベル API です。 Apple 独自で特徴は完全新規 API なこと。 互換性の枷が一切ないため非常にシンプルです。

シェーダー言語はただの C(C++) 言語であり、GLSL でも hlsl (Cg) でもありません。 良く知った C++ の構文がそのまま使えるため迷うことが非常に少なくなっています。(厄介で特殊な GLSL の構文を覚える必要がなくなりました!)

これまで iOS/OS X では OpenGL が用いられていたにも関わらず OpenGL の影響は残っていません。 座標系もよりシンプルでハードウエアに近いもの。座標原点は左上で、Z Clip 空間も 0~w です。つまり Direct3D と同じ仕様になっています。

その代わり API は完全に Objective-C (swift) なので、同じコードを iOS/OSX 以外の他の Platform でそのまま流用するのは困難です。

もともと iOS 8 (PowerVR 6 series) 専用でしたが 10.11 (El Capitan) から OS X でも利用できるようになります。 対応している Mac は Mid 2012 以降 (MacPro のみ 2013以降)となります。 GPU でいえば GeForce Kepler 以降、RADEON GCN、Intel HD Graphics Gen7 (IvyBridge) 以降の制限があります。 今までは iOS 端末実機がないと Metal の確認もビルドもできませんでしたが、OS X のサポートにより今後 Mac でも動作確認が可能で Metal 対応アプリが開発しやすくなります。

Metal の詳細はこちらに追加していきます。

Vulkan

Khronos の Multi platform API であり、OpenGL の後継となります。 唯一 OS を選ばない Multi Platform API なので、もし広く受け入れられるなら API が統一される可能性があります。 Android が Vulkan を採用することを発表しています。

開発側の立場としては、今後に期待する意味でも、解消されるであろう OpenGL の問題点をあげてみます。

Vulkan の詳細はこちらに追加していきます。

Game Console

ゲームコンソールは対応するハードウエアが単一なので、Driver が GPU の違いを吸収する必要がありません。 最初から低レベルかつオーバーヘッドが少ない API が提供されています。 その代わり PC/Mobile 向けの汎用 API との互換性がありません。 また同じメーカーであっても、Game Console 毎に OS もライブラリも新規に作られており完全に別物です。 ハードウエアに近い API なので、ハードウエアの世代が変わると互換性を維持することが困難になります。

なお Xbox のように DirectX を採用している場合でも、対応 GPU が単一なのでかなりの最適化が施されています。 PC と比べて非常に軽量です。