UIにMetalが使えないかいろいろ試してみた話
発表当時はiOSのみの対応でしたが、その後macOSやtvOSでもサポートされ、Appleのさまざまなデバイスで使用できるようになりました。古いデバイスだと対応していないものがありますが、iPhoneに限っていえばMetalが使えるのはiPhone 5s以降のデバイスであり、iOS 11のサポートもiPhone 5s以降のデバイスですので、iOS 11のみサポートするアプリケーションであれば気兼ねなくMetalを使うことができます。
MetalでUIパーツを描く
Metalを使うといっても、ここで扱う例では3Dオブジェクトを扱うわけではないので、3Dプログラミングの知識は必要ありません。UIKitにより構成されるUIにGPUが得意とする並列計算で算出されたテクスチャを貼り付け、 UIView や CALayer だけでは作ることが難しいUIを実現します。このようにUIパーツを作ると、以下のような利点があります。
- コードの保守性が上がる。従来のUIKitで実現しようとすると複数の CALayer や UIView を組み合わせなければならず非常に複雑になってしまったり、大きなリソースを扱う必要があったりするもの、またはそもそも実現不可能なものをShaderだけで表現できるためです。
- デザイナーの選択肢が増え、より魅力的なアプリを作ることができる可能性がある。
Metalでは、並列計算に使うCompute Shaderと、Vertex ShaderやFragment Shaderなどのグラフィックパイプラインに使うShaderを、同じMSL(Metal Shading Language)というC++をベースとした言語で記述できます。Compute Shaderは汎用性が高く、(後述のFragment Shader的な表現も流体シミュレーションによる表現もCompute ShaderのKernel Functionとして記述されています)、テクスチャを算出する際により直感的にプログラミングできると感じました。
また、グラフィックパイプラインと並列計算で使うデータ型は MTLTexture や MTLBuffer といった共通のインターフェイスを持つので、 MTLTexture に並列計算で何かしらのデータを記述し、それをグラフィックパイプラインにテクスチャとして渡す、または、グラフィックパイプラインを通さずに MTKView サポートレベルの描写 や CAMetalLayer のdrawableなテクスチャに直接書き込んで表示する、といったこともできます。
Fragment Shader的な表現
既存のグラフィックパイプラインで使われるFragment Shaderでは、関数に渡される補間後の座標を元に各ピクセルの色が決定されますが、前述のように、Metalではグラフィックパイプラインを通さなくてもCompute ShaderのKernel Functionを使うだけで同じようなことができます。 MTKView がViewの内容を更新できるタイミングで、フレーム毎に MTKViewDelegate の func draw(in view: MTKView) という関数が呼ばれますが、このタイミングで現在時刻と座標を元に各ピクセルの色を決定し、時間により描画内容を変えることでアニメーションさせます。
引数として、入力先のテクスチャ、現在時刻、ユーザーによるタッチイベントがある場合はその座標とタッチイベントの数、最後にそのピクセルの座標(テクスチャ左上を原点としたとき)をとります。関数の最後の o.write(float4(0.サポートレベルの描写 0), gid) の部分で、 float4(0.0) の代わりにそのピクセルの色を書きこむというのが大まかな流れです。
この基本形から3つのUIパーツを作ってみました。残念ながら、これらの例はすべてGIFとして圧縮されているので画質が落ちていますが、実際のデバイス上(iPhone 6 Plus、iPhone 7、iPhone Xでテスト)では60FPSで動いています。
図形の描写
Shaderでは、直線、円、長方形などの基本的な図形を数式で書くことができます。この例では、丸角の長方形と横にスクロールするストライプ柄の背景を組み合わせてダウンロードメーターを作ってみました。サンプルコードは「参考:Downloading Iconの書き方」を参照してください。直線を描画するにしても、 UIBezierPath のように各頂点を指定していくのではなく、対象のピクセルから描画しようとしている線までの距離を算出して色を変化させています。
有機的なアニメーションの描写
ネオンのような光の表現
私個人のGitHubリポジトリで、ShaderViewというライブラリを公開しています。ShaderViewには、 MTKView を使うときに必要な、 MTLLibrary 、 MTLFunction 、 MTLComputePipelineState 、 MTLCommandQueue の生成、 MTLCommandBuffer サポートレベルの描写 への各パラメータの設定などがラップされており、Shader関数プログラミングに集中できます。手っ取り早くMetalのShaderを使ってみたいときに向いていますし、ShaderViewが使えるPlaygroundもWorkspaceに入っていますので、ぜひダウンロードして遊んでみてください(よろしければスターを付けていただけるととてもうれしいです)。
流体シミュレーションによる表現
下のGIFがこの流体シミュレーションを実際にUIに適応した例です。初期値として CGImage から MTLTexture を生成し、NavierStokes方程式により算出された各フレームでの速度場により各ピクセルの色を移流させると、以下のようなアニメーションができあがります。
まず UIImageView をBasicな UIView の拡大アニメーションで表示した後、Shaderアニメーションを使って期限が切れたチケットが煙のようにふわっと消えていくようなアニメーションにしてみました。より「消えちゃった感」がでていて面白いアニメーションができたのではないかと思います。
この投稿ではMetalの基本的な使い方には触れていませんが、CPU側からGPU側への変数や関数といったデータの転送、 MTKViewDelegate の func draw(in view: MTKView) 内での MTLCommandQueue から MTLCommandBuffer を作りコミットするまでの流れなどについては、上のMobileFluidSimulationやShaderViewを始め、Apple公式のサンプルプロジェクト(例:MetalGameOfLife)や他のオンラインリソースが参考になると思います。
最後に:Metalを使ってみて
Advent Calendar、明日の記事は高村さんによる「React Starter KitにみるWebフロントエンドに求められる機能と実装」です。お楽しみに!
AMD FireProプロフェッショナルグラフィックカード、SPECviewperf®12 で本物の描写性能を発揮
ゲーム用グラフィックカードの性能を評価するには3DMarkが用いられる一方で、プロフェッショナル用グラフィックカードの評価にはリアルワールドパフォーマンスのより良い目安として SPECviewperf®が用いられています。Standard Performance Evaluation Company (SPEC)サポートレベルの描写 により開発された SPECviewperf®は、様々な種類の異なったプロフェッショナル・グラフィックスアプリケーションでテストを行うことにより、プロフェッショ ナルグラフィックスカードのパフォーマンスを正確に測定するために作成されました。
2013年12月18日にリリースされた最新の SPECviewperf® 12は、完全にゼロから開発され、完全なオープ ンプラットフォームでベンダー特有のコードや隠れた最適化等を一切含んでいません。
下記に示すように、新しい SpecViewperf®12 を使用した測定結果で、SAPPHIRE AMD FirePro グラフィックスカー ドは、ハイエンド、メインストリームそしてエントリーレベルの全製品カテゴリーでnVidia製品を凌駕するパフォーマンスを叩き出しています。これらの図が示すように、エンドユーザーのためにパフォーマンス向上と リアルワールドアプリケーションの信頼性を確かなものにする最適化を ISV と直接 AMD FirePro チームが進めてきた証拠に他なりません。
(図1) AMD FireProは、エントリーレベルプロフェッショナルテスト比較において全8テストアイテムで勝利し ており、MAYA テストにおいては 3.6 倍のパフォーマンスであることが分かります。
(図2) ミドルレンジのメインストリーム製品のテストにおいて、全てのテストでライバルに勝利し、図に示されたように、SNX のパフォーマンスで 2.3 倍の優位性がありました。
(図3) ミドルレンジからハイエンドのテストにおいて、ライバルに 1.7 倍の差をつけました。
- システム: Intel E5-1660 3.30GHz, 16GB RAM, Win7 64-bit SP1
- グラフィックスドライバ AMD 13.25.18.1、Nvidia 331.82
【法人様向け貸し出しサービス】
エーキューブでは、導入をご検討されている法人様向けに貸出サービスを実施しております。
今回リリースしました、AMD FireProTM S10000 12GB Editionにつきましても、販売開始後、貸出を実施いたします。
詳細については弊社WEBをご覧ください。 http://www.acube-corp.com/support/support/trial.html
株式会社エーキューブについて
米国 AMD Inc.との協業により、FireProTMシリーズの販売及びマーケティング・サポート、技術サポートなどの 事業活動を行っております。
〒102-0076 東京都千代田区五番町二番地カサ・ド・タク 30C
詳細は www.acube-corp.com をご参照ください。
SAPPHIRE PGSグループについて
SAPPHIRE PGS (プロフェッショナル・グラフィクス・ソリューション) は、プロフェッショナル・グラフィクスに関する SAPPHIRE Technologyのビジネスユニットの一つです。ワークステーションおよびプロフェッショナ ルクライアント向けに各種プロ用グラフィックディスプレイソリューションを提供しています。SAPPHIRE PGSは、あらゆる種類の3D プロフェッショナル・アプリケーションをプロユーザー向けにサポートしています。 産業分野のお客様に対して SAPPHIRE PGSは、放送、デジタルサイネージ、医療、監視、ATC (航空交通管制)、 およびその他の市場向けにディスプレイ関連のグラフィクスアプリケーションソリューションを統合していま す。SAPPHIRE PGS は、お客様に最適なソリューション、および他社にはないご購入前のコンサルティングとご 購入後のサービスの提供を大切にしています。
詳細はwww.SapphirePGS.サポートレベルの描写 comをご参照ください。
株式会社エーキューブ サポートレベルの描写 マーケティング担当: 遠藤 e-mail: このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。
SPECviewperf®12 について
SPECviewperf®12 は新世代の標準テストで、プロフェッショナルグラフィックスパフォーマンスの業界標準ベン チマークになるでしょう。レビュアーやパフォーマンス・アナリストのための無料で信頼できる公平なベンチマークツールです。そしてIT部門やワークステーション選定のためにより良い情報を必要とするエンドユーザ ーにとって非常に価値のあるものになるでしょう。
SPECviewperf®12 は全8つのテストから成っています。CATIA、CREO、MAYA、SNX そして Solidworksは全てOpenGLを使用しており、ShowcaseはDirectX を使用しています。追加のenergyとmedicalテストは立体視アプリケー ションのワークロードをエミュレートしています。全く新しくなった SPECviewperf®12 ベンチマークテストはリアルライフにより近いアプリケーションで、そのうちいくつかのテストシナリオは 6000 万を超える固定小数点 データを含んでおり、ワークステーションのプロフェッショナルパフォーマンスを十分にテストすることができます。
コメント