Japan
このブログでは、Google から開発者のみなさま向けの情報をいち早くお届けします。
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 に移植したものです。
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
コメントを投稿
ラベル
#hack4jp
3
Addy Osmani
1
ADK
2
AdMob
1
ALPN
1
AMP
2
Analytics
4
Andorid
6
Android
138
Android Auto
1
Android Design Support Library
1
Android Developer Story
2
Android N
1
Android Studio
11
Android Support Library
3
Android TV
7
Android Wear
20
androidmarket
3
AngularJS
2
API
20
APIExpert
45
app engine
21
App Indexing
5
App Invites
5
AppCompat
2
Apps Script
6
aprilfool
3
ArtTech
1
Audio
1
Auth Code
1
Authentication
2
AuthSub
2
Autotrack
1
Beacons
5
BigQuery
6
BLE
4
Blink
1
blogger
1
Brillo
1
Brotli
1
Calendar
1
Cardboard
3
Career
1
Case Study
1
chrome
49
Chrome Custom Tab
1
chrome extension
2
Chrome for Android
1
Chrome for iOS
1
Chromecast
6
chromewebstore
5
Chromium
4
ClientLogin
3
Cloud
8
Cloud Test Lab
1
CocoaPods
1
codejam
5
codelab
2
compute engine
3
Dart
2
DataCenter
1
Deep Learning
1
Demo Party
1
Design Sprint
3
DesignBytes
1
DevArt
3
DevBytes
6
Developer
14
Developer Console
3
Developer Preview
1
Developer Relations
2
DevFest
6
DevFestX
3
devtools
3
DirectShare
1
Doodle
1
DoubleClick
4
Doze モード
1
drive
2
EarlGrey
1
Easter Egg
1
ECMAScript 2015
1
Eddystone
2
egypt
1
English
2
ES6
1
Firebase
3
font
2
game
14
GDD11JP
56
GDD2010JP
23
GDE
2
GDG
9
Geo
17
Gingerbread
1
GLIDE
5
Gmail
1
Go
1
golang
4
goo.gl
1
Google
5
Google Apps
1
Google Cast
6
Google Cloud Messaging
8
Google Cloud Platform
5
Google Developer Experts
2
Google Developers Academy
1
Google Developers live
5
Google Developers Summit
1
Google Drive
2
Google Fit
2
Google for Work
1
Google Maps
22
Google Play
23
Google Play Game Services
6
Google Play Services
18
Google Plus
14
Google Search
3
Google Sign-In
8
Google+
1
Googleapps
10
GoogleGames
1
GoogleI/O
19
GoogleLabs
1
GoogleTV
1
gRPC
2
GTUG
5
GWT
2
hack4jp
2
hackathon
5
HTML5
17
HTML5Rocks
1
HTTP/2
3
HTTPS
2
ID Token
1
Identity
9
Identity Toolkit
1
Ignite
4
IME
10
intern
2
iOS
6
IoT
1
IPv6
1
JavaScript
3
K-12
1
Knowledge Graph
1
l10n
8
Lollipop
10
Machine Learning
1
Marshmallow
10
Material
1
Material Design
17
MDL
1
MIDI
1
Mobile
6
Mobile Bootcamp
4
Mobile Vision
3
mod_pagespeed
1
monetize
3
Mozc
14
Music
1
NativeDriver
2
Nearby
3
Nexus
1
Nexus S
1
NFC
1
NPAPI
2
NPN
1
oauth
5
OpenGL
3
OpenID
3
OpenID Connect
2
OpenSocial
1
opensource
11
Payment
1
People API
1
Performance
5
PersonFinder
1
Physical Web
2
Place Picker
1
Player Analytics
4
Policy
1
Polymer
6
Progressive Web Apps
2
project hosting
1
Promise
1
Promo code
1
Protocol Buffers
1
publicdata
1
Push API
1
Push Notification
1
QUIC
1
RAIL
1
Remote Display API
1
Runtime Permission
1
Sample Code
2
schema.org
1
security
7
Service Worker
3
sketchup
1
SmartLock for Passwords
4
social
4
SPDY
3
speak2tweet
1
startup
3
streetview
3
Study Jams
3
techtalk
12
TensorFlow
1
test
2
ToS
1
Transliteration
1
Twitter
1
Udacity
14
Unity
2
UX
1
V8
2
VP9
1
Vulkan
2
Watch Face
2
wave
2
Weave
1
Web
2
Web Animations
1
Web Components
4
Web Manifest
1
WebAssembly
1
WebMusic
3
WTM
2
YouTube
14
YouTube API
1
インタビュー
1
コードサンプル
1
プライバシー
1
言論の自由
1
節電
3
東日本大震災
9
日本語入力
40
ブログ アーカイブ
2016
4
3
2
1
2015
12
11
10
9
8
7
6
5
4
3
2
2014
12
11
10
9
8
7
6
5
4
3
2
1
2013
12
11
10
9
8
7
6
5
4
3
2
1
2012
12
11
10
9
8
7
6
5
4
3
2
1
2011
12
11
10
9
8
7
6
5
4
3
2
1
2010
12
11
Feed
Follow @googledevjp
"プロダクトに関するご意見は
プロダクトフォーラム
にお願いします"