Argument Buffersとは
Metal 2の新機能の中でも、Metal利用ケース全般において影響があり、恩恵も大きいのがArgument Buffersです。
Argument Buffer(以下AB)は、バッファやテクスチャ、サンプラーといったリソースをひとまとめにしてシェーダ関数の引数に渡せるようにするしくみです。CPU負荷を減らし、アプリケーションのパフォーマンスを改善するというメリットがあります。
従来の引数モデルの問題
従来の方法では、レンダリングループの中でGPU処理に必要なリソースをそれぞれAPIを呼んでセットする必要がありました。必要なバッファをセットするAPIを呼び、テクスチャをセットするAPIを呼び、サンプラーをセットするAPIを呼び、そしてやっと描画APIを呼べたわけです。
上の図のとおり、従来の引数モデルでは、バッファ毎、テクスチャ毎、サンプラー毎にAPIコールが必要で、つまりレンダリングする必要のあるオブジェクトの数に比例してAPIコール、つまりCPUの負荷が増えます。そして前述したようにレンダリングループの中で行う必要があり、毎フレームの負荷となるため、実質的に画面上に表示するオブジェクトの数の制約にもなっていました。
これがABを使用することにより、ひとまとめにしたバッファひとつに対して1回だけAPIを呼ぶだけで済むようになります。
これにより、GPUに渡すリソース数に応じて増えていたCPU負荷が、劇的に軽減される、というわけです。
ベンチマーク結果
次の図は、WWDC17のセッション1で紹介されていたベンチマーク結果です。利用するリソースの数によってどのように処理時間が変わるか、従来の方法と、ABを用いた場合の計測結果が示されています。
このベンチマーク結果によると、16のリソースを使用した場合には、ABを用いることでなんと18倍のパフォーマンス改善が見られたようです。
続きは書籍で: Argument Buffersの実装
本記事は技術書「iOS 11 Programming」の私が執筆を担当した『第13章
Metal』から抜粋したものです2。Argument Buffersの解説は下記目次の、13.10にあります。実装方法についても解説しています。
- 13.1 はじめに
- 13.2 Metalの概要
- 13.3 Metalの基礎
- 13.4 MetalKit
- 13.5 Metal入門その1 - 画像を描画する
- 13.6 Metal入門その2 - シェーダを利用する
- 13.7 Metal入門その3 - シェーダでテクスチャを描画する
- 13.8 ARKit+Metalその1 - マテリアルをMetalで描画する
- 13.9 ARKit+Metalその2 - MetalによるARKitのカスタムレンダリング
- 13.10 Metal 2
- 13.11 Metalを動作させるためのハードウェア要件
書籍のタイトルにはiOS 11とありますが、Metalについては新機能の紹介だけではなくて、基礎からじっくり解説しています。Metalの章だけで37ページもあります。
他の章も他著やネットではなかなか得られない濃い情報が詰まっているので、気になった方はぜひサンプルPDFもあるので見てみてください。
- 第1章 iOS 11 概要
- 第2章 ARKit
- 第3章 Core ML
- 第4章 Swift 4の新機能とアップデート
- 第5章 Xcode 9 の新機能
- 第6章 Drag and Drop
- 第7章 FilesとDocument Based Application
- 第8章 レイアウト関連の新機能及び変更点
- 第9章 Core NFC
- 第10章 PDF Kit
- 第11章 SiriKit
- 第12章 HomeKit入門とiOS 11のアップデート
- 第13章 Metal
- 第14章 Audio関連アップデート
PEAKSのサイトにて電子書籍・紙の書籍ともに販売されています。
- 著者:堤 修一,吉田 悠一,池田 翔,坂田 晃一,加藤 尋樹,川邉 雄介,岸川克己,所 友太,永野 哲久,加藤 寛人,
- 発行日:2017年11月16日
- 対応フォーマット:製本版,PDF
- PEAKSで購入する
執筆を担当したARKit、Metalの章の詳細、あるいは全体的なおすすめポイントは以下の記事にも書きました。
-
"Introducing Metal 2" (https://developer.apple.com/videos/play/wwdc2017/601/) ↩
-
実際の書籍では、図はこの記事と同じものではなく、書籍向けに清書されています。 ↩