[go: nahoru, domu]

[この記事は 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 に移植したものです。



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


[この記事は Shannon Woods、テクニカルプログラムマネージャーによる Android Developers Blog の記事 "Low-overhead rendering with Vulkan" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。]
ゲームおよび 3D グラフィック アプリケーションの開発者がぶつかる大きな壁。それは、1 秒にも満たないごく短い時間に、どれだけ複雑なシーンを描画できるかということです。グラフィック開発では、レンダリングにおける GPU の効率的なデータ利用を実現するため、ほとんどの作業をデータの編成に費やします。一部のグラフィック プロセッサーのドライバーは実際に処理する前にそのすべてのデータを再編成することがあるため、どんなに慎重な開発者でも予期しえないボトルネックに直面することがあります。これらのドライバーを制御するために使用される API もマルチスレッドで使用するために設計されておらず、並列であればより効率的に実行できる呼び出しについて、ロックを同期する必要がでてきます。これらのすべてが CPU のオーバーヘッドとなり、本来ならばシーンの描画に費やしたい時間と能力がここで消費されてしまいます。

オーバーヘッド削減と、開発者の制御強化

CPU オーバーヘッドのいくつかの原因に対処して、開発者がレンダリングをより直接的に制御できるようにするために、新しい 3D レンダリング API である Vulkan™ を Android に導入するための作業が行われてきました。OpenGL™ ES と同様に、Vulkan は Khronos によって管理されている 3D グラフィックおよびレンダリングのオープン スタンダードです。Vulkan は、ドライバーの CPU オーバーヘッドを最小化するため、およびアプリケーションが GPU の動作をより直接的に制御できるように、設計されています。また、Vulkan は、複数のスレッドが作業を実行できるようにする(コマンド バッファーの作成を同時に行うなど)ことによって、より優れた並列処理が可能です。

API は想定内で作動してこそ本領を発揮する

さまざまなデバイスで動作するアプリケーションを一度に記述できるように、Android 5.0 Lollipop では OpenGL ES のための 5 万を超える新しいテストを含む Android の Compatibility Test Suite(CTS)を大幅に拡張、その後も多数追加されています。これはドライバーの問題を特定して修正するための広範なオープン ソースのテスト スイートを提供しており、開発者とエンド ユーザーにとってより堅牢で信頼できる操作性を生み出します。Vulkan に関しては、Android CTS で使用するための同様のテストを開発するだけでなく、開発したテストを Khronos に提供し、Vulkan 自体のオープン ソース適合テスト スイートで使用できるようにしています。これにより、Khronos は Vulkan のドライバーを複数のプラットフォームおよびハードウェアでテストでき、3D グラフィックのエコシステム全体の改善が可能です。

すべては開発者の選択

Vulkan を作成、テスト、および出荷するために鋭意作業中ですが、それと同時に OpenGL ES にも貢献してサポートする予定です。これにより開発者は、簡潔な OpenGL ES か、直接的な制御の Vulkan か、用途に応じて適切な API を選択できるようになります。どちらの API を選択した場合でも、開発者が快適に使用できることをお約束します。
Vulkan はまだ開発中ですが、仕様、テスト、およびツールは、準備ができ次第http://www.khronos.org/vulkan にリリースされる予定です。


Posted by Yoshifumi Yamaguchi - Developer Relations Team