Arm Mobile StudioでAndroidのパフォーマンス測定をDeepなレベルでしよう!

概要

Arm社から提供されている 「Arm Mobile Studio」このツールを利用する事で、Androidデバイスのパフォーマンス測定をもっとDeepなレベルで行う事が出来ます。今回は Arm Mobile Studio の無償版を実際に使ってみてどのような事が出来るのかをお見せしたいと思います。

Arm Mobile Studioとは?

Arm Mobile StudioはArm社が提供しているモバイルゲーム(Android向けアプリ)制作者のためのツール群になっています。
以下の4つのツールをまとめたパッケージになっています。

Streamline CPUやGPUのカウンター情報などを閲覧できるツール
PerformanceAdvisor Streamlineで取得したデータから、わかりやすいレポート(HTML等)を作成してくれるツール
Graphics Analyzer Graphicsの深いレベルを調査できるツール
Mali Offline Compiler Shaderを渡すと、どの位の負荷があるか等が事前に確認できるツール

どのツールもパフォーマンス計測に関連したツールになっています。
ツールによっては Arm社のGPU「Mali」が搭載されたAndroid端末がないと利用できないものもあります。

Arm Mobile Studioで動作確認が出来ている端末はコチラをご覧ください。
Arm Mobile Studio supported devices

Mali GPU?

Mali GPUはArm社から提供されているモバイル向けのGPUになります。

日本ではQualcomm社のSoC「Snapdragon」がシェアも大きく有名だと思います。
SnapdragonにはQualcomm社のGPU「Adreno」を積んでいます。ですので、日本ではQualcomm社のGPUシェアが大きい形になっています。

Mali GPU を採用しているSoCだとSamusung社の「Exynos」、他にもSoC「Kirin」等で採用されています。
世界的なシェアを見ると Mali GPUのシェアはとても大きなものになっています。

Samusung社の場合、「Galaxy S10」と同じ名前でも出荷している地域によってSoCが異なり、MaliGPUモデルもあればAdrenoGPUモデルと分かれていたりします。

日本の場合ですと、Galaxy A20等のミドルクラスのAndroidデバイスでMaliGPUが積んであることが多いです。

Arm Mobile Studioの無償版とPro版について

Arm Mobile Studioはアカウントを登録することで、無償版を利用できます。
ほとんどの機能は無償版で利用が出来るのですが、一部機能が制限されます。

大きい所ですと、Pro版ではバッチでの起動などのCIでの自動テスト等に関する機能が解放されるようになっています。
例えば「アプリケーションのapkファイルを置いておくと、自動でPerformanceAdvisorでレポートまで出来ている」と言ったことがPro版では実現可能になるそうです。

未検証ですが ドキュメント を読む限り可能に見えます

Pro版は値段は結構なお値段になります。
日本ではXLSOFTさんという会社さんが代理店として販売されていますので、コチラもご参考ください。
Arm Mobile Studio – Android ゲームおよびアプリ向けパフォーマンスを解析ツール

Streamlineで処理開始などのAnnotateを埋め込む

画像のような形でStreamlineに対してAnnnotationという形で好きな文字列を埋め込むことが出来ます。

マニュアルはコチラになります。
Arm Streamline User Guide Version 7.6

この機能を使えばロードの開始と終了に埋め込んでより深いレベルで状況が確認できるかと思います。
ただこのC言語ソースを呼び出すネイティブプラグインによって実現されます。

Graphics Analyzerが 64bitアプリを求めるという事について

Android 32bitアプリでGrapics Analyzerを起動してもデータが全然取得できませんでした。
原因を調べるため adb logcatしていたところ下記のようなエラーに遭遇しておりました。

I libEGL : Searching /data/user/0/com.DefaultCompany.URPNewProj for GLES layers
I libEGL : GLES layer found: /data/data/com.DefaultCompany.URPNewProj/libGLES_layer_aga.so
E libEGL : Failed to load layer /data/data/com.DefaultCompany.URPNewProj/libGLES_layer_aga.so with error: dlopen failed: 
"/data/data/com.DefaultCompany.URPNewProj/libGLES_layer_aga.so" is 64-bit instead of 32-bit

これを見る限り 64bit 用の GLESのレイヤーに一枚噛ませることでAnalyzerが実現しているのですが、64bit用の soファイルしかなくエラーが出てしまっているようでした。

Vulkanよりも、OpenGLESの方が良いという話について

Youtube放送中に「Vulkanだとオーバーヘッドも大きく、取れる項目が少なかったので OpenGLESアプリでしていた」という話をさせてもらいました。ユニティちゃんを置いただけのアプリをPerformanceAdvisorで実行してみたところ、下記のような差が出てしまいました。

OpenGLES 3.x
Vulkan

これはおそらくですが lwi_me.py の引数で渡す .so ファイルが原因だったのだと思います。
–lwi-vk-layer-lib-path ../target/android/arm/rooted/arm64-v8a/libVkLayerLWI64.so
のような形にしていたためです。rooted としていたのは Vulkan用のsofファイルがそちらにしかなかったためです。

またGraphics Analyzerでは、Traceする情報を選択することが出来るのですが

Vulkanでは取得できる情報が少なくなってしまっています。

Mali Offline Compiler向けプラグイン

放送中にお見せしたMali Offline CompilerをUnityから呼び出す拡張をコチラに作ってみました。
GitHub – wotakuro/UnityMaliocPlugin

しかし、Unityで「Compile and Show code」を行うと、Variantが多いShaderについては生のコードを書き出すのにとても時間が掛かってしまう…等々色々と悩みがあって、紹介を中途半端になってしまいました。この辺は何か良いものが無いかは検討していってバージョンアップしたい所ですね。
Stripping scriptable shader variantsではうまく行きませんでした。

Mali Offline Compilerの出てくる結果について

Mali Offline CompilerにVertex Shaderを掛けるとPositionとVaryingの二つが出てくる下記の資料を読むと「どうしてわかれているのか?」という事について何となく察せるようになっております。またターゲットにするハードウェアによって出てくる結果が違うという話も触れさせていただきました。

下記のような形で、Cycleの情報で出てくるUnitの種類が異なっているのがお分かりかと思います。

Mali-G71の結果
Mali-G78についての結果

これはGPUによってArchitectureが異なり、積んであるUnitが異なっているからです。
Mali-G71はBifrostと呼ばれるアーキテクチャ、Mali-G78はValhallと呼ばれるアーキテクチャとなっています。

GPUのアーキテクチャーは下記の資料を見ていただくのが良いと思います。
Arm Mali Offline Compiler User Guide Version 7.3

その他情報集

UnityとArmのコラボレーションに関してのポータルです
Arm で 1 秒あたりのフレーム数を最適化 | Android ゲーム開発 | Unity

Arm MobileStudioのチュートリアルページです。
Arm 提供のチュートリアルで、3D アートのモバイル向け最適化について学ぼう – Unity Technologies Blog

Arm Mobile Studioの見るべき項目などを別途詳細で書いてあるマテリアルになります。
Tackling profiling for mobile games with Unity and Arm