ケータイ用語の基礎知識

第762回:Vulkan とは

 Vulkan(バルカン)は、OpenGLなどの規格化を手がけている業界団体 Khronosグループが規格化した、次世代のグラフィック用APIです。AMDの提唱する「Mantle」をベースにしたもので、以前はXGL(neXt Generation Graphics Library)とも呼ばれていました。2016年2月、公式な最初のバージョン「Vulkan 1.0」が公開されています。

 Vulkanは、主にゲームエンジンやゲームアプリケーション向けのグラフィックに最適化されたAPI群です。特に3Dオブジェクトを使ったアニメーションなどが使われるゲームで、劇的な性能向上を期待できます。

4月に開催された、グーグルのゲーム開発者向けイベントで披露された、Vulkanのデモ

 WindowsやLinuxに対応するほか、スマートフォンやタブレットでは、今度登場するAndroidの次のバージョン、「Android N」で標準的な機能として対応される予定になっています。

 スマートフォンでよく採用されるチップセット「Snapdragonシリーズ」に内蔵されるGPU「Adreno」に対応したソフトウェア開発キットなども、Snapdragonのメーカーである米クアルコムからすでに提供されています。

ゲーム専用機に近い性能へ

 Vulkanは、スマートフォンでも現在は標準的に搭載されているGPU(グラフィックス プロセッシング ユニット、画像処理を担当する装置)や、マルチスレッド処理に最適化することで、アニメーション的なグラフィック表示、特にゲームなどの3Dグラフィックスの表示において、処理のオーバーヘッドを省くことができ、その処理能力を劇的に向上させることができる、と、Khronosグループは説明します。

 これはつまり、3Dオブジェクトを大量に表示させるような場合でも画像が粗くなったり、コマ送りのように表示間隔が延びてしまう「処理落ち」を防ぎ、より滑らかな動画表示ができるようになります。

 ゲーム専用機では、この種のAPIが標準的に用意されています。最近ではたとえばアップルが同社のOS向けに「Metal」というAPIを用意する、といった動きもあります。Vulkanの登場によってAndroidでもゲーム専用機に近い性能のグラフィックプログラムを書くことできるようになるはずです。

効率よくグラフィックを処理

 これまでのOpenGLなどのAPIでは、グラフィックオブジェクトを抽象的に扱うことで、どのハードウェアでも同じように画像を作ることに主眼が置かれていました。これに対して、Vulkanは、よりハードウェアに近い考え方を導入し、グラフィックを表示する処理を行う際、オーバーヘッドを減らし、効率よく表示します。

 現代のハードウェアの特徴としては、CPUやGPUといった搭載ハードウェアがマルチコア化されていることが挙げられます。同じ演算処理装置が多数搭載されていて、同時に計算・演算処理といった作業を行うことができるようになっているわけです。

 OpenGLなどでは、「空間座標のここにこのような形のオブジェクトを配置し、続いてここにこれを配置し……」と、グラフィックオブジェクトをその都度処理するような概念でした。これは、現代のハードウェアの特徴にあっていないために、余計な処理(オーバーヘッド)が発生してしまい、ハードウェアの負荷になっていたわけです。

 Vulkanでは、これをGPUに対して「オブジェクトの1番は左、2番は上、3番は右、4番は下に移動させる」というように複数の命令を用意し、同時に送り込むことで複数のグラフィック命令を実行できます。簡単にいえばCPUスレッドごとにGPUへの複数の命令を用意できるわけで、効率よく現代的なハードウェアを利用できるようになったわけです。

 これまで考慮しなくて済んでいたレンダリング用バッファ(Vulkanなどでは「スワップチェーン」と呼ばれています)やパイプラインの制御なども自分でするというように、プログラムのすべき処理自体は増えるのですが、その分CPUへの負荷をプログラムが肩代わりすることで全体の性能を上げられます。

 一般的に、抽象度の高い、これまでのグラフィックAPIの利用では命令を実行する際に作業待ちになるプロセッサが出やすく、それが処理のボトルネックとなりがちでした。これがグラフィック性能の上限を決めてしまっていたわけです。

 Vulkanではハードウェアに近い概念を導入することで、これらハードウェアひとつひとつに直接命令を用意する、というようなことができるようになるため(プログラマーの腕に、性能が左右される面があるものの)処理待ちで手が空いてしまうハードウェアを減らすことができます。

 たとえばグラフィックを表示する際にオブジェクトの画面上での頂点の位置を決めるためのハードウェア「シェーダー」はGPU内に複数搭載されているのですが、これらひとつひとつにすべき作業を用意しておき、同時にこれらに平行して作業を行わせるというようなプログラムにできるわけです。負荷をバランス良く配分でき、より効率的にハードウェア性能を使えるようになります。複数のキャラクターが同時にアニメーションで動いたり、背景に紙吹雪が舞ったり、髪の毛がたなびいたりというような処理を無理なく行うことができるようになるのです。

 Vulkanのようなハードウェアのあり方に近い考え方を導入し、よりハードウェアに近い考え方をプログラマーに要求するAPIのことを「低レベルAPI」といいます。高レベルAPIがより抽象的にプログラム上の要素を扱うのに対して、低レベルAPIは(現代のAPIでは、直接ハードウェアにアクセスするわけではないものの)、実際のハードウェアへアクセスするかのようにプログラムを組むことができます。

 高レベルAPIではCPUが命令を解釈してハードウェアの構成に近い形に翻訳し実行するため、プログラマーはハードウェアの構成などを考えずにプログラムを作ることができる反面、ハードウェアに命令を受け渡す際に負荷が集中しやすいというデメリットがあります。逆に低レベルAPIは、プログラマーが機械の構成へ歩み寄ることで、ハードウェアの構成に有利なプログラムを作ることができます。プログラムが冗長になりがちだったり、あるいは同じような処理をするのにいちいち自分で処理を書かねばならないというデメリットがあるものの、ハードウェアに適したプログラムを作れます。

 Vulkanを採用するメリットもまさにそこです。ハードウェアを理解したプログラマーならば、より性能の高いプログラムを書ける可能性が高まったと言えるでしょう。

大和 哲

1968年生まれ東京都出身。88年8月、Oh!X(日本ソフトバンク)にて「我ら電脳遊戯民」を執筆。以来、パソコン誌にて初歩のプログラミング、HTML、CGI、インターネットプロトコルなどの解説記事、インターネット関連のQ&A、ゲーム分析記事などを書く。兼業テクニカルライター。ホームページはこちら
(イラスト : 高橋哲史)