Search Unity

Adaptive Performance で高い忠実度と安定したフレームレートを実現

, 4月 1, 2019

Unity は、先日閉幕した GDC 2019 における基調講演の中で、Adaptive Performance についての紹介を行いました。この機能のプレビュー版と『Megacity』のモバイルサンプルがリリースされ、実際にお試しいただけるようになりました。本記事では Adaptive Performance について、プロジェクトへの適用方法も含め、さらにご紹介して行きます。

PC 向けやコンソール向けゲームの場合とは異なり、モバイルハードウェアの力を最大限に活用するゲームを開発すためには、美しいビジュアルとスムーズなゲームプレイとの間で絶妙なバランスが実現されなければなりません。デバイス性能の限界まで使い切れば、ハードウェアに過大な負荷が掛かってゲームの実行性能が犠牲となり、スロットリングやバッテリー寿命の短縮、不安定なパフォーマンスに繋がり易くなります。これは特に、ローエンド・ハイエンドの各種ターゲットデバイスを幅広く考慮しなければならないデベロッパーにとっては、ことさらに頭の痛い問題となります。

今日デベロッパーは様々な戦略でこの問題を解決しています。そのうち私達が目にした主要なアプローチは 2 つあります。ひとつ目は全てのターゲットハードウェアで出来る限り高いパフォーマンスを実現しようとするもので、これはグラフィックスの忠実度とフレームレートを犠牲にすることになります。もうひとつはハードウェアの挙動の予測を試みるアプローチですが、ハードウェアの傾向を正確に測定するための手段が限られているため、これを行うのは非常に困難です。

Adaptive Performance の仕組み

Adaptive Performance を使用すると、デバイスにおける温度とゲームのパフォーマンスを、リアルタイムでより効率的に管理することができます。ゲームのパフォーマンスと品質設定の予測的な調整がリアルタイムで行え、デバイスに過大な負荷を掛けることなくハードウェアを活用することが可能となります。この結果フレームレートが安定して熱の蓄積が抑制され、バッテリー寿命を保護しながら、より長いプレイ時間・より快適なプレイヤー体験が実現されます。

Adaptive Performance によってデベロッパーは、従来なかった形でハードウェアをより深く理解し、よりダイナミックで柔軟なゲームを作るための新しいツールを手に入れました ― これにより、モバイルデバイスで最高にスムーズでパフォーマンスの高いプレイ体験をプレイヤーに提供することが可能となります。通常は OS によって決定される事柄(高いクロック周波数で実行するタイミングや、スロットリング回避のために何を調整するかなど)を、デベロッパー自身で決定することができます。

GDC 2019 で、この機能に関するいくつかの講演を行いました。そのスライド集をこちらでご覧いただけます。また、GDC の Unity ブースでの講演「Megacity on mobile: How we optimized it with Adaptive Performance」(英語)を以下でご視聴いただけます。

 

Samsung との提携で Adaptive Performance を実現

Unity は、このソリューションを結実させるために世界最大の Android モバイルデバイスメーカーである Samsung と提携しました。Samsung の GameSDK を基盤に構築された Adaptive Performance は、まず Samsung Galaxy S10 や Galaxy Fold などの Samsung Galaxy デバイス向けに公開され、今年中にはさらに多くの Samsung Galaxy デバイスに対応していく予定です。

早期における成果

GDC 2019 の Unity 基調講演で使用された以下のグラフをご覧ください。Adaptive Performance によって、最新の Samsung Galaxy S10 で実行した『Megacity』で、安定した高フレームレートが実現されていることがわかります。

赤いグラフは Adaptive Performance を追加する前の『Megacity』のフレームレートです。青いグラフは Adaptive Performance を追加した結果です。Adaptive Performance によって、デモが 30 FPS で実行される時間が大幅に長くなり、更に大幅に安定しています。

『Megacity』が選ばれた理由

『Megacity』は無数のエンティティを内包する未来的なインタラクティブ都市で、Unity ならどんなに複雑なプロジェクトでも現世代モバイルハードウェアで実行できることを証明したものです。このデモでは Data-Oriented Technology Stack(DOTS)の最新の進化がご覧いただけるようになっています。DOTS とは「苦労せずにハイパフォーマンスを実現」(Performance by Default)を謳った全てのプロジェクト(Entity Component System (ECS)、Native Collections、C# Job System、Burst Compiler など)の総称です。『Megacity』は Unite Los Angeles 2018 で発表され、GDC 2019 開催期間中にデスクトップ向けに公開されました。

『Megacity』は Adaptive Performance のサンプル実装の実演にうってつけのプロジェクトです。なぜならこの機能は、ハードウェアを最大活用するために動的に先を見越してゲームを適応させる柔軟な対応を可能にするものだからです。Adaptive Performance はスケーラビリティを考慮して設計されているため、『Megacity』 の基盤の構築に使用されている DOTS の原理にも良く適合します。

本プロジェクトのモバイル版には、450 万のメッシュレンダラー、20 万の建物構成要素、10 万のオーディオソース、600 万を超えるエンティティが含まれています ― つまり、Adaptive Performance の性能を実演するのに理想的なプロジェクトなのです。

『Megacity』における Adaptive Performance の機能

Unity パッケージマネージャーから Adaptive Performance をインストールすると、デバイス向けにビルドを行った際に Unity が自動的に Samsung GameSDK サブシステムをプロジェクトに追加します。Unity がランタイム中に対応デバイス上で Adaptive Performance Manager を作成・起動します。これがモバイルデバイスの熱状態に関するフィードバックを提供します。ランタイム中に Adaptive Performance Manager からイベントにサブスクライブしたり情報のクエリを行えば、リアルタイムでそれに対応することができます。これを行わない場合は、データはコンソールにのみレポートされます。

例えば、提供されている API を使用して、デバイスの温度の変化やイベントに対応するアプリケーションを作成できます。これにより、サーマルスロットリングを(発生前から)回避しつつ、固定フレームレートをより長時間維持することができます。『Megacity』 における Adaptive Performance のサンプル実装では、以下の 3 つの方法でフレームレートを平滑化しています。

  • 適度な CPU・GPU の実行速度で開始し、それらを次第に増加させてボトルネックを取り除くことで、エネルギー消費を低く抑えることができました。
  • デバイスがスロットリングが起こりそうな状態になってきたことを確認した時点で品質設定の調整を行うことで、熱負荷を削減することができました。これを踏まえ、LOD のレベルを低くすることにしました。
  • また、スロットリングが起こりそうになったらターゲットのフレームレートを低くしました。
  • ターゲットのフレームレートに達して温度が低下し始めたら、LOD のレベルとターゲットのフレームレートを上げ、CPU および GPU の実行速度を再度下げます。

これらの機能によって、徐々にゲームのパフォーマンスがスムーズになります。デバイスの温度の変化をトラッキングすることで、その場でパフォーマンス設定を調整してスロットリングを完全に回避することが可能となります。

『Megacity』 モバイルサンプルプロジェクトをこちらからダウンロードして、上記がどのように行われたかを実際にご覧ください。『Megacity』に関するフィードバックやご質問はフォーラムの関連スレッド にご投稿ください。

Adaptive Performance Manager

本パッケージの中核を成すのは Adaptive Performance Manager です。これは Unity によって起動時に作成され、これにより温度やパフォーマンスに関するイベント通知への簡単なアクセスとサブスクライブが可能になります。以下の例では、MonoBehaviour の Start 関数内で IAdaptivePerformance インターフェース を使って Adaptive Performance Manager にアクセスする方法をご確認いただけます。

熱に関するイベント

デバイスの熱状態が変わるたびに、熱に関するイベントが Unity によって送られます。重要な状態は、スロットリングの発生が差し迫った状態およびスロットリングが発生した状態です。下の例では ThermalEvents にサブスクライブすることで lodBias を削減したり増加させたりしており、これが GPU 負荷の抑制に貢献しています。

lodBias の値を 1 より低くすると、しばしばビジュアルに影響し、LOD に関連してオブジェクトのポッピングが発生する可能性がありますが、これは、ゲーム体験を維持する上で問題ない場合にグラフィック負荷を簡単に削減できる方法のひとつです。これより更に精密な制御でゲームのグラフィックスと挙動の処理を微調整したい場合は、ボトルネックイベントが非常に役立ちます。

CPU および GPU のパフォーマンスレベル

モバイルデバイスにおいては、(特にゲームの実行時においては)CPU と GPU がその電力消費の大部分を占めます。通常は OS が、どのクロック周波数を CPU と GPU に使用するかを決定します。

CPU コアと GPU は、最大クロック周波数で実行中は効率性が低くなります。高いクロック周波数での実行はモバイルデバイスを容易にオーバーヒートさせ、OS が CPU と GPU の周波数を抑制(スロットリング)してデバイスを冷却します。

このような状況は、以下のプロパティで最大クロック周波数を制限すれば回避できます。

  • IAdaptivePerformance.cpuLevel

  • IAdaptivePerformance.gpuLevel

アプリケーションは、現在のパフォーマンス要件に関する特定の情報に基づいてこれらのプロパティを設定し、状況に応じて、実行速度を低くするか高くするか決定することができます。

  • アプリケーションは直前のフレームでターゲットのフレームレートに達したか?

  • アプリケーションは、ゲーム内シーンとメニューのどちらを開いているか?

  • 次に重いシーンが来るか?

  • CPU 負荷あるいは GPU 負荷の高いイベントが目前に迫っているか?

  • 高い CPU・GPU の実行速度を必要としない広告を表示するか?

パフォーマンスボトルネックの早期警告システム

Adaptive Performance Manager では、GPU、CPU、あるいは「フレームレートバウンド」のどれであるかを通知するパフォーマンスボトルネックイベントにサブスクライブして受け取ることができます。フレームレートバウンドとは、ゲームが Application.targetFrameRate によって制限されていることを意味し、この場合アプリケーションはそのパフォーマンス要件の緩和を検討する必要があります。

バックグラウンドで実行されてボトルネックの決定を行っているのは(Manager からクエリ可能な)GPU フレーム時間ドライバーで、これが直前のフレームで GPU が消費したハードウェア時間をモニタリングします。現時点では、CPU 時間は Unity の内部的なサブシステムの総計の計算によって求められています。ゲームや状況に合わせ、熱状態の変化に応じてゲームが CPU バウンドになった時と GPU バウンドになった時で異なる処理が行われるようにすることができます。

ゲームを最適化する方法は様々あり、上の例や『Megacity』 の例はそのうちの一部に過ぎません。最終的には、何が最も適しているかはそれぞれのゲームによって変わります。詳細は本パッケージに関するドキュメンテーション(英語)をご覧ください。

Adaptive Performance に関する今後の展開

これは、ほんの始まりに過ぎません!私達は今後も Adaptive Performance の進化に向けた取り組みを続け、機能と対応デバイスをさらに追加してまいります。現在のパッケージには低水準 API が含まれていますが、DOTS と互換性のあるコンポーネントベースの高水準 API の開発がすでに進んでいます。これにより、Unity プロジェクトにおけるパフォーマンスの適応がさらに行いやすくなるはずです。今後の関連情報をお届けしてまいりますので、どうぞお見逃しなく。

今すぐお試しください

Adaptive Performance のプレビュー版は、パッケージマネージャーから Unity 2019.1 向けにこちらから今すぐご入手いただけます。Adaptive Performance に関する最新情報や他のデベロッパーによる使用事例をご覧になりたい場合、また、ご質問やコメントは、フォーラムをご利用ください。

22 コメント

コメントの配信登録

コメント受付を終了しました。

  1. While this is predominantely a mobile concern, I think it is something you should be looking at in the PC world as well. Thermals play a huge role in the performance of gaming laptops thin and otherwise, as well as tablets.

  2. This is some kind of click bait “better performance” “we use a samsung s10” xD what´s the point of this if is only for high-end devices and a specific samsung device, developers want better performance on low-end devices, not in a powerful phone that only a few portion of the market will have. What´s next? “we have an incredible performance on PC, the optimization is the best ever done, your games can run smoothly at 60 fps, 8k resolution, this new feature only works in nvidia RTX” xD

  3. It’s a welcome addition, but it’s a shame that it’s coming to the extremely highend devices first – the devices that need it the least.

  4. I get an error when i click the link to download the Megacity pack

    1. David Berger

      4月 2, 2019 10:46 pm

      Hey Anthony,
      is there an error message? What browser are you using?

  5. Stefan Hollekamp

    4月 2, 2019 8:46 am

    is it limited to Android only?
    what’s about iOS and Metal ?
    also like some mention before…
    this would be great for all Platforms Unity supports…
    thx

    1. David Berger

      4月 2, 2019 7:18 pm

      Hi Stefan,
      the preview package currently supports Galaxy S10 devices at this moment, more to follow. iOS is not supported.

  6. This is pretty neat. I hope it expands to other devices pretty quick, but I especially hope it expands to PC one day because that would be a real game changer. I understand the problems with getting that to work, especially for Windows Store releases, but I can dream.

    1. David Berger

      4月 2, 2019 10:51 pm

      Hey Liz,
      thanks for your feedback. On Desktop it’s more common to have Settings Menus to offer more control to the user, so it’s gonna be an interesting task to offer the right functionality.

      1. I’m aware of that, but at the same time it’s important to understand that not all users are technically minded. One of the reasons things like GeForce Experience have systems in place to apply settings is because many users simply run at default, which is a less than ideal experience.

    2. Monitoring frames and adjusting quality settings/LODbias would not be hard to implement yourself on PC.

  7. Wendelin Reich

    4月 1, 2019 3:27 pm

    I was excited about the APM at first, but am disappointed that you chose to build it “on top of Samsung’s GameSDK”. Instead of making devs’ lives easier, you add another level of hardware dependency on a platform that is already riddled with fragmentation issues.

    Any dev who who is serious about adaptive performance must put effort in the design and implementation of issues such as reducing scene complexity, switching out materials or even switching functionality on and off. No one wants to build that and then discover that the whole system only works on “supported devices”. So why not choose a more general approach? (At a minimum, tracking FPS is possible on any device and could be used as a fallback on those that don’t provide thermal information. And there are other measures that could be used as heuristics, like framerate consistency.)

    1. David Berger

      4月 1, 2019 3:53 pm

      Thanks for your feedback Wendelin,
      as mentioned in the blog post, this project is just at the very beginning of our work on Adaptive Performance and there is much more to come over the upcoming years. Using the Samsung GameSDK gives us the flexibility to implement and create an APIs for Unity which can deal with any underlying data provider and enables us to design functionality and APIs across platforms which are not available otherwise. As an example, it is not trivial nor reliable across platforms to use FPS as an indicator of throttling state, while it’s impossible to preemptive take actions as the framerate might not change leading up to throttling on every device. With Adaptive Performance, you get the thermal trend and events e.g. for throttling imminent states, which requires platform-specific hooks as those depend on OEM specific implementations and are not exposed on most OS.

      Having a fallback scenario is important and part of the future R&D as it should be reliable across platforms. We have many more things planned so please stay tuned.

      1. What about iOS? (they have an API for that: https://developer.apple.com/documentation/foundation/nsprocessinfo/1417480-thermalstate?language=objc)

        It’s nice to have such an API for Samsung devices, however I think iOS would make a lot of sense, as it is a single API for a broad range of devices, while in case of Samsung it’s just a fraction of the Android landscape.

        1. David Berger

          4月 3, 2019 2:41 am

          Thank you for the reference Patrick. Currently, iOS is not supported. However, as mentioned in the blog post, this is a first peek into what our vision is. Also, the Adaptive Performance package is open source, and extending it with a new provider is possible. One of the great things the Samsung GameSDK offers, is the functionality, such as temperature trends and setting CPU and GPU levels to save power. Those calls have minimal impact on the runtime performance which makes an easy integration possible.

      2. Hey David. Do you have any idea of when this will be available for iOS? (near future, not even started working on it yet, 2019, 2020, next month… :) ) It would be a huge improvement to the project I’m currently working on now.

        1. David Berger

          4月 30, 2019 5:21 am

          In iOS 11+, there is a thermal event API available on iOS, but no temperature (trends) or control over CPU/GPU, so those features would be missing if we offer the packages on iOS at this moment, but if you’d like to use it on Samsung, you can do that now and easily extend it with an additional provider providing data from other sources if you like.

    2. Agreed.

      My response was basically “That looks neat. Maybe I’ll use it in 1 or 2 years after the Samsung exclusivity period ends, but only if it works on most of Android and iOS devices”

  8. Alejandro Castan

    4月 1, 2019 3:08 pm

    Hi. Great Job Unity I am very interested in using Adaptive Performance for VR projects, for it, Is it VR Ready? Thanks

    1. David Berger

      4月 1, 2019 3:23 pm

      Thank you, Alejandro,
      The current preview targets Samsung Galaxy devices and is optimized for the Samsung S10 with more devices of the Samsung Galaxy family to follow. Our goal is to enable as many devices as possible to use Adaptive Performance in the future. The package is open source and you can take a look at the implementation at any time.

  9. AFD Dectector

    4月 1, 2019 2:35 pm

    Happy AFD Unity!
    Good job!

    It barely to run and compile that megacity project on any pc.

    1. David Berger

      4月 1, 2019 3:15 pm

      The Megacity sample implementation of Adaptive Performance uses a different Render Pipeline and settings optimized for the Samsung S10. You might wanna give it a go as it is different than the Desktop version. If you have issues building it on your machine please make sure to let us know the specs of your development machine in our Megacity thread (https://forum.unity.com/threads/megacity-feedback-discussion.647248/ ) and the issues you are seeing.