Vulkan デベロッパー ツールを用いた開発環境のご紹介
2016年4月20日水曜日
[この記事は Shannon Woods、テクニカル プログラム マネージャーによる Android Developers Blog の記事 "Optimize, Develop, and Debug with Vulkan Developer Tools" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。]
本記事では、Vulkan™ に対応した Android 開発ツールのプレビューをお届けします。Vulkan は、Google が Khronos グループの一員として開発に携わった、新しい 3D レンダリング API であり、デベロッパーが GPU を明示的に、かつ少ないオーバーヘッドで制御できるのが特徴です。Vulkan では CPU のオーバーヘッドが減少するため、総合ベンチマークでシングル コアでのドローコールのスループットを比較すると従来の OpenGL ES の 10 倍にもなります。マルチコアを並列的に高効率で使うことを可能にするスレッディングとの相性が良い API 設計は、ドローコールの多いアプリケーションのパフォーマンスを飛躍的に高めます。
Vulkan のサポートは、Nexus 5X、Nexus 6P、Nexus Player などの Android N Preview 対応端末で、Android N Preview を介して利用できます(もちろん、OpenGL ES も引き続き使用できます)。デベロッパーの皆さんがプログラミング作業にすぐ取りかかれるように、Vulkan を効果的に使用する方法を説明したサンプルとガイドをまとめました。Vulkan が実際に Android 端末で実行されている動画をご覧ください。使われているのは、Robert Hodgin 制作の Fish Tornado のデモを、Google の Art, Copy & Code チームが Vulkan に移植したものです。
ぜひこの Android 版 Vulkan のプレビューを開発作業の参考にしてください。
Posted by Ryosuke Matsuuchi - Developer Relations Team
本記事では、Vulkan™ に対応した Android 開発ツールのプレビューをお届けします。Vulkan は、Google が Khronos グループの一員として開発に携わった、新しい 3D レンダリング API であり、デベロッパーが GPU を明示的に、かつ少ないオーバーヘッドで制御できるのが特徴です。Vulkan では CPU のオーバーヘッドが減少するため、総合ベンチマークでシングル コアでのドローコールのスループットを比較すると従来の OpenGL ES の 10 倍にもなります。マルチコアを並列的に高効率で使うことを可能にするスレッディングとの相性が良い API 設計は、ドローコールの多いアプリケーションのパフォーマンスを飛躍的に高めます。
Vulkan のサポートは、Nexus 5X、Nexus 6P、Nexus Player などの Android N Preview 対応端末で、Android N Preview を介して利用できます(もちろん、OpenGL ES も引き続き使用できます)。デベロッパーの皆さんがプログラミング作業にすぐ取りかかれるように、Vulkan を効果的に使用する方法を説明したサンプルとガイドをまとめました。Vulkan が実際に Android 端末で実行されている動画をご覧ください。使われているのは、Robert Hodgin 制作の Fish Tornado のデモを、Google の Art, Copy & Code チームが Vulkan に移植したものです。
Vulkan API で可能になる最適化
OpenGL ES と Vulkan には共通する部分も多くありますが、Vulkan には、1 ミリ秒も無駄にしないデベロッパーの皆さんの役に立つ新機能があります。- メモリ割り当てのアプリケーションによる制御: Vulkan には、メモリを GPU に割り当てる方法やタイミングを非常に細かく制御するメカニズムが用意されています。このメカニズムによって、自分のアプリケーションに適した独自の割り当てポリシーや再利用ポリシーを使用できます。最終的には、実行回数やメモリのオーバーヘッドが減り、コストのかかるメモリ割り当てのタイミングをアプリケーションで制御できるようになります。
- 非同期的なコマンド生成: OpenGL ES では、アプリケーションがドローコールを呼び出すと、すぐに GPU に対してドローコールが発行されます。一方 Vulkan では、代わりにアプリケーションがドローコールをコマンド バッファに対して発行するので、ドローコールを生成して記録する作業と、ドローコールを GPU に対して発行する作業を分けられるようになっています。コマンド生成をいくつかのスレッドに分散させることで、アプリケーションは複数の CPU コアをより効率的に活用できます。また、こうしたコマンド バッファは再利用できるので、コマンドの生成と発行に伴うオーバーヘッドが削減されます。
- 分かりにくい作業の解消: OpenGL ES で困ることの 1 つが、コマンドによって作業を開始させるタイミングについて API 仕様に明示的に示されていない、またはデベロッパーに対して明らかにされていない場合がある点です。Vulkan では、作業を明示的に開始させるコマンドと、そうではないコマンドを仕様で明示しているので、動作を予測しやすくなり、一貫性が向上しています。
- 完全なマルチ スレッド設計: OpenGL ES アプリケーションでは、レンダリングを予測可能な形で正確に行うために、必ず 1 つのコンテキストに対応するコマンドは 1 つのスレッドから発行することになっています。Vulkan では対照的に、そうした条件がないので、アプリケーションはコマンド バッファの生成といった作業をいくつも並行して行えます。しかしその一方で、データの修正や読み取りを複数のスレッドから同時に実行する場合、その安全性が暗黙的に保証されるわけではありません。スレッドの同期を管理する権限や責任は、アプリケーション側が持つことになります。
- モバイル フレンドリーな機能: Vulkan の機能には、多くのモバイル端末で使われている、タイリング方式の GPU で高いパフォーマンスを実現するのに特に役立つものがあります。個々のレンダリング パス間の相互作用に関する情報をアプリケーションで用意できるので、タイリング方式の GPU は限られたメモリ帯域幅を効果的に使うことができ、オフチップでのデータ読み取りの実行を避けられます。
- シェーダーのオフライン コンパイル: Vulkan では、シェーダー用の中間言語である SPIR-V をサポートしています。これにより、シェーダーを前もってコンパイルしておいて、SPIR-V バイナリをアプリケーションと一緒に出荷することが可能です。こうしたバイナリでは、GLSL のような高水準言語よりも解析が簡単です。そのため、ドライバがこの解析を行う場合のばらつきが小さくなります。また、SPIR-V をサポートすることで、特別なシェーディング言語やクロス プラットフォーム対応のシェーディング言語のためのコンパイラをサードパーティが提供することも可能になります。
- 任意のツールによる検証作業: OpenGL ES では、呼び出したコマンドをすべて検証し、設定が望ましい範囲内にあることや、オブジェクトが動作に適切な状態になっていることを確認しています。Vulkan は、それ自体ではこうした検証を行いません。代わりに任意のデバッグ ツールを使用することで、Vulkan のコマンド呼び出しが正確であり、最終製品で実行時オーバーヘッドが生じないことを確認するようになっています。
検証レイヤを用いたデバッグ
上記のとおり、Vulkan 内部には検証システムがないので、コードを検証するためには API 外部のツールを使用する必要があります。Vulkan のレイヤ メカニズムでは、検証コードやその他のデベロッパー ツールを使って、開発中にすべての API の呼び出しを点検できるようになっており、出荷バージョンにオーバーヘッドを含める必要がありません。Google がまとめたガイドでは、Android NDK で使用する検証レイヤの構築方法を説明し、最初から最後までバグのない Vulkan コードを書くのに不可欠なツールを紹介しています。シェーダー ツールチェーンによる開発
Shaderc というツール コレクションには、GLSL を SPIR-V にコンパイルするためのビルド ツールや実行時ツールが用意されています。シェーダーはビルド時にコマンドライン コンパイラの glslc を使ってコンパイルすることが可能で、既存のビルド システムへ簡単に統合できます。また、実行中に作成や編集が行われたシェーダーは、Shaderc ライブラリを使って、GLSL シェーダーを C インターフェース経由で SPIR-V にコンパイルできます。どちらのツールも、Khronos のリファレンス コンパイラの上に構築されています。その他のリソース
Vulkan のエコシステムは広大です。導入と活用のためのリソースや、参考資料が豊富に用意されています。- Khronos による Vulkan 関連リソースには、概要や、参考になるウェブページ、仕様、ユーザー コミュニティによる Vulkan のデモがあります。
- Android のサンプル
- Android のチュートリアル
- LunarG の LunarXchange には、Windows と Linux で Vulkan 開発を行うためのリソースがあります。
ぜひこの Android 版 Vulkan のプレビューを開発作業の参考にしてください。
Posted by Ryosuke Matsuuchi - Developer Relations Team