しんさんのブログ

科学や技術のこと読書のことなど

CPUオーバーヘッドの少ない新しい3DグラフィックスAPIの話

3DグラフィックスAPIとして、2大勢力がOpenGLDirectXがあります。
DirectXマイクロソフト、でOpenGLはクロノスグループがそれぞれ作成・アップデートを行っています。

これらのGraphics APIは、ハードウェアであるGPUの違いを吸収しいろいろなハードでプログラムが動作するように、ハードウェアを抽象化するような分厚い中間レイヤーを持っています。
そのおかげで、異なるGPUを積んでいるような様々なPCで同じコードが動作するようになっています。

しかし、便利な反面、APIコールのオーバーヘッドが大きくなり、実行速度が遅くなる場合があります。
例えばDraw call一つとっても、異なるGPUに合わせて多くのコンテキストの設定が必要になりますが、それらはGPUの負荷ではなくCPUの負荷として、効いてきます。
つまり、Graphics APIのCPU負荷が無視できないくらい大きいのです。

Xboxやプレステ, Wiiなどのゲーム機では、このグラフィックスAPIのオーバーヘッドが軽く作ってあり、ハードに最適化したプログラムが書けるようになっています。対象となるハードが1種類なのでこのようなことができるのです。
もちろん、GPU内のシェーダーやGPU内部の処理がネックになっている場合はAPIのオーバーヘッドが変わっても実行速度が変わることはありません。
余談ですが最近目にしたLow overhead APIの記事でもGPUの処理を軽くするような記述がありました。あくまでGraphics APIの持つ、CPUのoverheadの軽量化が主で、GPU処理の最適化はまた別の話です。誤解しやすい点ですので注意しましょう。

前置きが長くなりましたが、最近このAPIのオーバーヘッドが低いLow layerのGraphics APIがあちこちから発表されています。


DrectXは、DirectX12

OpneGLは、Vulkan
また、AndroidもVulkanをサポートするとGoogleから発表されています。
Low-overhead rendering with Vulkan | Android Developers Blog

Appleは、Metal

AMDはMantleという名前で独自のAPIを発表しています。
http://www.amd.com/ja-jp/innovations/software-technologies/technologies-gaming/mantle#

この中で、Mantleに関してはかなり前に発表されたのですが、今はあまり話題になっていません。
現状ではDirectX12とVulkanがメジャーになりそうな予感です。
Metalに関しては、よくわかりません。

とくにDirectX12は、Windows10に合わせてリリースされたこともあり話題になっていますが、最初に書いたようにLow OverheadのAPIというのは、速度が速いといういい面だけではなく、
ハードに合わせた記述をしないと最悪ハングしたり、うまく速度が出なかったり、プログラマの力量がそのまま出てしまう面がありますし、移植もやりにくくなるのではないかと思われます。