UPRの紹介 - Unityにおける最適化について

こんにちは、KLab株式会社 技術統括部EMグループのKyoです。

今回はUnityPerformanceReporting(以下UPR)について紹介します。

この文章で想定している対象読者

  • Unityを用いてアプリを開発するエンジニア
  • QA(品質保証)作業に関わる方
  • アプリのパフォーマンスを大まかに把握したい方
  • 最適化に興味がある方

UPRとは?

UPRはUnite2019Shanghai(2019.05.10〜2019.05.12)で初公開された、ChinaUnityが開発しているプロファイラーです。
UnityIDを持っていれば、誰でも簡単に使えますし、計測結果のレポートを手軽にWebで確認したり共有できます。

UPR_HP

セッションを受講した当初から筆者はとても興味があり、その後もずっと動向に注目していました。 そして2019年末頃にリリースされた初期のバージョンから開発チームとコンタクトを取って、様々なやり取りをしながら検証をしてきました。

ここでは、中国以外ではあまり知られていないが非常に強力なツールであるUPRについて、使い方や基本機能などについて簡単に紹介したいと思います。

なんでUPR?

ゲームアプリの開発者であれば、誰でも「動くアプリ」だけではなく「さくさく動くアプリ」を目指していると思います。

最適化していないアプリは一部の負荷が高い処理によって重くなることがほとんどです。 それらを解決するためには、まず負荷が高くなっている状況を正しく把握する必要があります。
どこでなぜ重いのかがわかれば、最適化の半分以上が終わる」が筆者の持論です。 (似たような話として「意図的にバグを再現できれば、デバッグの90%が終わる」)

負荷計測に関するよくある思い込みとして、「高度な知識を持つエンジニアの専門家でしかできない」、 「負荷計測のためにコードを書くなどものすごく手間がかかる」、「固まっていない仕様にコストを払ってもしょうがない」などが挙げられます。

その結果、負荷の計測と最適化は開発のイテレーションの一環としてではなく、開発の終盤にならないと着手できないケースが多いのが現実です。

「塵も積もれば山となる」というわけで、長い間積み重なった小さな負荷問題を短時間で全部解決するのは困難です。 また、開発の初期段階に実装した根幹部分に負荷問題があれば、それが解消できずにリリースされてしまうことにもなりかねません。

UPRを使えば、次のようなメリットがあります。

簡単に使える便利さ

  • 使用するのに手間が掛からない
    • 必要なのは「DevelopmentBuildしたアプリ」だけ
    • 計測するためにコードを書く必要なし
    • 基本計測ならSDKなどを導入する必要なし
  • 実行手順がわかりやすくて、エンジニアではない職種でも問題なく操作できる
    • UPRApp(Android専用)とUPRDesktopがあって、様々な場面に対応できる
  • 多種多様なプラットフォームをサポート
    • 筆者が試したことがあるプラットフォーム:iOS、Android、Windows
  • Unity5.0以上の全てをサポート
  • 一定の時間間隔で自動的にスクリーンショットを取ってくれる
    • 時間間隔やオン/オフ可能
  • 計測が終わった直後にレポートが見れる


環境構築(初回のみ)を含めて15分時間を割くだけで、誰でも簡単に負荷計測できます。

補助ツールの充実

  • UPRDesktop
    • コマンドラインで計測の開始/終了ができる
  • UPRHelper
    • コマンドラインで計測の新規作成やレポートの生成ができる
  • AssetChecker
    • Assetsの設定が適切かどうかチェックし、結果をUPRのDashboardで見れる


UPRHelperとUPRDesktopのセットをビルドマシンに入れれば、アプリのパッケージを作るたびに負荷計測を自動的に実行することも可能です。 UPRApp自体の負荷もありますし、iOSの場合はUPRDesktopが必須なので、筆者の経験から言うと全部まとめてUPRDesktopで自動化したほうがおすすめです。

このような仕組みで、負荷計測を開発イテレーションの一部に組み込むことで、日々の開発でアプリのパフォーマンスを監視し、負荷問題の早期発見と解決が期待できます。

オープンなデータ形式で拡張しやすい

開発チームによると、収集したデータはすべてREST APIインターフェイスとJson形式で提供されるので、自社製ツール(ビュアーなど)の二次開発もできます。

REST APIからデータを取得し、閾値を超えた処理負荷を検出した場合速やかにSlackやメールに通知する運用もとても便利だと思います。

少人数のプロジェクトやスタジオの場合、手軽にプロファイラーを導入して、しっかりした計測と分析ができます。 一方、多人数で大規模開発案件の場合、大量のテストプレイでパフォーマンス劣化を引き起こすシーケンスを拾い上げて性能の改善に繋げることができると考えられます。

UPRができることは?

開発チームによると、「UPRはUnityProfilerベースで作ったツールですが、UnityProfilerがいままで見せていないデータを提示することもあります」だそうです。
つまり、UnityProfiler相当もしくはそれ以上の機能が揃っています。

また、目的によって、注目すべき部分も違うと思います。
例えば、具体的な機能を実装するエンジニアであれば、まずこのようなスパイクを注目し、原因究明から着手するでしょう。

直接チャートに対してZoomIn/ZoomOutなどの操作が可能で、とても便利です。

また、アプリ全体のパフォーマンスを把握したい方であれば、各レポートの概覧を確認すれば大雑把な状況がわかるでしょう。

他にも注目すべき点が幾つかあります。

レポートの共有

UPRのレポートのURLは、以下のように「https://upr.unity.com」+「プロジェクト名」+ 「report」+ 「計測の識別子(UUID)」になっています。

https://upr.unity.com/sample/report/bde215d0-6fa4-40be-b91d-1460dae599bc

また、計測時間が長くなってチャートが複雑になった場合、以下のようにチャートの一部を切り取った状態のURLを作ってくれる便利なUIもあります。

https://upr.unity.com/sample/report/bde215d0-6fa4-40be-b91d-1460dae599bc?&startFrame=1847&endFrame=4081#cpuUsage

この文章の冒頭に記述した通り、基本UnityIDを持っていれば、誰でも計測結果を確認できます。
※セキュリティ面に関しては、UPRチームが責任を持って管理するそうです。(当然社内からUUIDを外部に漏らさない前提)

また、各レポートにコメント機能があり、ラベルをつけることもできます。

計測レポートの区間レポート作成機能

区間レポートは生存時間が短いオブジェクトや短い間に発生した負荷問題を特定するためにとても有効な機能です。  
目盛りからFrameを調整したあと区間レポートを生成できます。


レポート内の区間レポートを確認するだけではなく、異なるレポートの区間レポートを比較することもできます。
これによって対応前後の負荷がより明確になります。

メモリスナップショット

任意フレームのメモリ状況を取得するとても便利な機能です。
この機能によって、シーンの中のAssetsのロード、キャッシュ、開放などの管理が適切かどうか簡単に検証できます。

おまけ

筆者はUPRがリリースした直後からずっと見守ってきて、UPRの進化を実体験できました。
その中では、当社のエンジニアが筆者を通してUPRの開発リーダーに提案した仕様も多数採用されました。

当初開発リーダーが宣言した機能も着実に実現でき、UPRの今後についてもたくさん熱く語ってくれました。
これからのロードマップとして、次のような内容が期待できます。

  • より良いメモリ分析のサポート
    • MemoryProfilerの集約
  • GPU分析サポート
  • 業界標準となるスタンダードパフォーマンスデータベースの構築
    • ゲームのジャンルによって一番適切なパフォーマンスデータを提供
  • ボトルネックについてUnityエンジニアエキスパートからの直接アドバイス


最後に、ChinaUnityのUPR開発チームと約半年の付き合いで、いつも活気が溢れる良いチームだと感じました。

バグレポートはもちろん、仕様改善の提案などにも耳を傾けてくれましたし、操作方法に関する質問などのレスポンスも速いです。

また、新機能の実装だけではなく、定期的に既存機能のメンテナンスや最適化もしっかり対応しています。 例えば、長時間計測(1時間以上)の安定化とそのレポートの処理速度の最適化などを行いました。

何よりUPRのイテレーションが早すぎて、「このバグを修正したバージョンは明日渡す!」と言われたのに、大抵その日の夕方に「できたので、試してね」というメッセージがきます。 (時差の関係で、そろそろ仕事を切り上げようとする筆者がよく苦笑いをしながらUPRを更新します。)

ここまで読んで気付かれた方もいるかと思いますが、UPRはChinaUnityが開発したサービスですが、グローバル向けの英語版も完璧に整備されています。 また、先日東京サーバーも用意してくれました。日本国内でも普通に使えますので、ぜひ皆さんのゲーム開発に活用してください。

というわけで、これまでの手厚い対応に感謝するとともに、これからのUPRの発展を心から期待しております。

このブログについて

KLabのゲーム開発・運用で培われた技術や挑戦とそのノウハウを発信します。

関連記事

このブログについて

KLabのゲーム開発・運用で培われた技術や挑戦とそのノウハウを発信します。