理由はさまざまですが、特にモバイルプラットフォームでは、プロジェクトを可能な限り高いフレームレートでレンダリングすることが必ずしも望ましいとは限りません。これまで Unity 開発者は、Unity のレンダリングスピードを抑えるために Application.targetFrameRate や Vsync Count を利用してきました。このアプローチは、レンダリングだけでなく Unity のさまざまな要素が実行される頻度にも影響します。新しいオンデマンドレンダリング API を使用すれば、レンダリングの頻度をプレイヤーループの頻度から切り離すことができます。
オンデマンドレンダリングでは、フレームのレンダリングをスキップしながらも、引き続きプレイヤーループの残りの部分を高い頻度で実行することができます。これは特にモバイルで強みを発揮します。レンダリングを回避することで、タッチイベントに対するアプリケーションの応答性を維持しつつ、パフォーマンスと省電力性を大幅に向上できます。
フレームレートを下げる余地がある例をいくつか紹介します。
オンデマンドレンダリングは、サポートされているすべてのプラットフォーム(システム要件を参照)とレンダリング API(組み込みのレンダーパイプライン、ユニバーサルレンダーパイプライン、HD レンダーパイプライン)を備えた Unity 2019.3 で機能します。
オンデマンドレンダリング API は、名前空間 UnityEngine.Rendering のたった 3 つのプロパティーで構成されます。
OnDemandRendering.renderFrameInterval
これがもっとも重要なプロパティーです。これにより、レンダーフレーム間隔を取得または設定できます。これは、新しいフレームレートを定義するための Application.targetFrameRate または QualitySettings.vSyncCount の分割係数です。たとえば、Application.targetFrameRate を 60、OnDemandRendering.renderFrameInterval を 2 に設定すると、1 つおきのフレームだけがレンダリングされ、フレームレートは 30fps になります。
OnDemandRendering.effectiveFrameRate
このプロパティーを使うと、アプリケーションがレンダリングする際のフレームレートの概算値を得られます。この概算値は、OnDemandRendering.renderFrameInterval、Application.targetFrameRate、QualitySettings.vSyncCount の値とディスプレイのリフレッシュレートを使用して決定されます。ただし、あくまでも概算値であって、保証された値ではないことを忘れないでください。CPU がスクリプト、物理演算、ネットワークなどの他の処理に使用されてしまうと、アプリケーションのレンダリングスピードが低下する可能性があります。
OnDemandRendering.willThisFrameRender
このプロパティーでは、現在のフレームを画面にレンダリングされるかどうかを指定するだけです。レンダリングされないフレームは、高負荷の演算処理、アセットのロード、プレハブのスポーンなど、CPU 負荷の高いその他の処理に使用できます。
オンデマンドレンダリングをメニューで使用して、入力がない間は 20fps でレンダリングされるようにする簡単な例を次に示します。
using UnityEngine; using UnityEngine.Rendering; public class Menu : MonoBehaviour { // 最初のフレームが更新される前に Start を呼び出します void Start() { QualitySettings.vSyncCount = 0; Application.targetFrameRate = 60; // メニューが起動したら、レンダリングのターゲットを 20fps に設定します OnDemandRendering.renderFrameInterval = 3; } // 1 フレームに 1 回 Update が呼び出される void Update() { if (Input.GetMouseButton(0) || (Input.touchCount > 0)) { // マウスクリックやタッチ操作が検出されたら、(フレームごとに)60fps でレンダリングします OnDemandRendering.renderFrameInterval = 1; } else { // マウスやタッチによる入力がない場合は(3 フレームごとに)20fps に戻します OnDemandRendering.renderFrameInterval = 3; } } }
オンデマンドレンダリングをさまざまなシチュエーションで活用できることを紹介したサンプルプロジェクトは、こちらから入手できます。
オンデマンドレンダリングを使用したご感想を、ぜひフォーラムでお聞かせください。Windows、macOS、WebGL、iOS、Android については、Unity Editor とスタンドアロンプレイヤーの両方でテスト済みですが、皆さまからのフィードバックをいつでもお待ちしております。
Is this article helpful for you?
Thank you for your feedback!