Argument Buffersを用いたMetalのパフォーマンス改善

## Argument Buffersとは

Metal 2の新機能の中でも、**Metal利用ケース全般において影響があり、恩恵も大きい**のがArgument Buffersです。

Argument Buffer（以下AB）は、バッファやテクスチャ、サンプラーといったリソースをひとまとめにしてシェーダ関数の引数に渡せるようにするしくみです。**CPU負荷を減らし、アプリケーションのパフォーマンスを改善**するというメリットがあります。

## 従来の引数モデルの問題

従来の方法では、レンダリングループの中でGPU処理に必要なリソースをそれぞれAPIを呼んでセットする必要がありました。必要なバッファをセットするAPIを呼び、テクスチャをセットするAPIを呼び、サンプラーをセットするAPIを呼び、そしてやっと描画APIを呼べたわけです。

<img width="784" alt="ab_before.png" src="https://qiita-image-store.s3.amazonaws.com/0/3180/8c1ecd1e-bcde-29d8-4f88-fdf8e1a56978.png">

上の図のとおり、従来の引数モデルでは、バッファ毎、テクスチャ毎、サンプラー毎にAPIコールが必要で、つまり**レンダリングする必要のあるオブジェクトの数に比例**してAPIコール、つまりCPUの負荷が増えます。そして前述したように**レンダリングループの中で**行う必要があり、毎フレームの負荷となるため、実質的に画面上に表示するオブジェクトの数の制約にもなっていました。

これがABを使用することにより、**ひとまとめにしたバッファひとつに対して1回だけAPIを呼ぶだけで済む**ようになります。

<img width="774" alt="ab_after.png" src="https://qiita-image-store.s3.amazonaws.com/0/3180/a86aadb8-3ba5-1a3c-10bd-7eacab7ac87b.png">

これにより、GPUに渡すリソース数に応じて増えていたCPU負荷が、劇的に軽減される、というわけです。

## ベンチマーク結果

次の図は、WWDC17のセッション[^bench]で紹介されていたベンチマーク結果です。利用するリソースの数によってどのように処理時間が変わるか、従来の方法と、ABを用いた場合の計測結果が示されています。

<img width="783" alt="ab_performance.png" src="https://qiita-image-store.s3.amazonaws.com/0/3180/2746fc33-e7f7-b74b-74bd-37a8606c3bd9.png">

このベンチマーク結果によると、16のリソースを使用した場合には、ABを用いることでなんと18倍のパフォーマンス改善が見られたようです。

[^bench]: ["Introducing Metal 2" (https://developer.apple.com/videos/play/wwdc2017/601/)](https://developer.apple.com/videos/play/wwdc2017/601/)


### 続きは書籍で: Argument Buffersの実装

本記事は技術書「[iOS 11 Programming](https://peaks.cc/shu223/iOS11)」の私が執筆を担当した『第１３章
 Metal』から抜粋したものです[^zu]。Argument Buffersの解説は下記目次の、13.10にあります。実装方法についても解説しています。

- 13.1	はじめに
- 13.2	Metalの概要
- 13.3	Metalの基礎
- 13.4	MetalKit
- 13.5	Metal入門その１ - 画像を描画する
- 13.6	Metal入門その２ - シェーダを利用する
- 13.7	Metal入門その３ - シェーダでテクスチャを描画する
- 13.8	ARKit+Metalその１ - マテリアルをMetalで描画する
- 13.9	ARKit+Metalその２ - MetalによるARKitのカスタムレンダリング
- 13.10	Metal 2
- 13.11	Metalを動作させるためのハードウェア要件

書籍のタイトルにはiOS 11とありますが、Metalについては新機能の紹介だけではなくて、**基礎からじっくり解説**しています。Metalの章だけで**37ページ**もあります。

他の章も他著やネットではなかなか得られない濃い情報が詰まっているので、気になった方はぜひ[サンプルPDF](http://peaks.cc/shu223/iOS11)もあるので見てみてください。

- 第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のサイトにて電子書籍・紙の書籍ともに販売されています。

<div class="peaks_widget" style="overflow:hidden; padding:20px; border:1px solid #dedede;"><div class="peaks_widget__image" style="float:left; margin-right:15px; line-height:0;"><a target="_blank" id="purchase" href="https://peaks.cc/shu223/iOS11"><img alt="iOS 11 Programming" style="border:none; max-width:140px;" src="https://s3-ap-northeast-1.amazonaws.com/peaks-images/project002_cover.jpg" width="500"></a></div><div class="peaks_widget__info"><p style="margin:0 0 3px 0; font-size:110%; font-weight:bold;"><a target="_blank" id="purchase" href="http://peaks.cc/shu223/iOS11">iOS 11 Programming</a></p><ul style="margin:0; padding:0;"><li style="font-size:90%; list-style:none;"><span>著者：</span><span>堤 修一,</span><span>吉田 悠一,</span><span>池田 翔,</span><span>坂田 晃一,</span><span>加藤 尋樹,</span><span>川邉 雄介,</span><span>岸川克己,</span><span>所 友太,</span><span>永野 哲久,</span><span>加藤&#160;寛人,</span></li><li style="font-size:90%; list-style:none;">発行日：2017年11月16日</li><li style="font-size:90%; list-style:none;">対応フォーマット：製本版,PDF</li><li style="font-size:90%; list-style:none;"><a target="_blank" id="purchase" style="text-decoration:underline; color:#1DA1F2;" href="http://peaks.cc/shu223/iOS11">PEAKSで購入する</a></li></ul></div></div>

執筆を担当したARKit、Metalの章の詳細、あるいは全体的なおすすめポイントは以下の記事にも書きました。

- [「iOS 11 Programming」を共著で執筆しました／本書のおすすめポイント - Over&Out その後](http://d.hatena.ne.jp/shu223/20171128/1511827476)

[^zu]: 実際の書籍では、図はこの記事と同じものではなく、書籍向けに清書されています。