Technology

Wie On-Demand-Rendering die mobile Leistung verbessern kann

DAVID ROGERS / UNITY TECHNOLOGIESContributor
Feb 7, 2020|4 Min.
Wie On-Demand-Rendering die mobile Leistung verbessern kann
Diese Website wurde aus praktischen Gründen für Sie maschinell übersetzt. Die Richtigkeit und Zuverlässigkeit des übersetzten Inhalts kann von uns nicht gewährleistet werden. Sollten Sie Zweifel an der Richtigkeit des übersetzten Inhalts haben, schauen Sie sich bitte die offizielle englische Version der Website an.

Aus verschiedenen Gründen ist es nicht immer wünschenswert, ein Projekt mit der höchstmöglichen Bildrate zu rendern, insbesondere auf mobilen Plattformen. In der Vergangenheit haben Unity-Entwickler Application.targetFrameRate oder Vsync count verwendet, um die Rendering-Geschwindigkeit von Unity zu drosseln. Dieser Ansatz hat nicht nur Auswirkungen auf das Rendering, sondern auch auf die Häufigkeit, mit der jeder Teil von Unity läuft. Die neue On-Demand-Rendering-API ermöglicht es Ihnen, die Rendering-Frequenz von der Player-Loop-Frequenz zu entkoppeln.

Was ist On-Demand-Rendering?

Mit On-Demand-Rendering können Sie Rendering-Frames überspringen, während der Rest der Player-Schleife weiterhin mit hoher Frequenz läuft. Dies kann besonders auf mobilen Geräten nützlich sein. Das Umgehen des Renderings kann erhebliche Leistungs- und Energieeinsparungen mit sich bringen, während die Anwendung weiterhin auf Berührungsereignisse reagieren kann.

Warum sollte ich On-Demand-Rendering verwenden?

Im Folgenden finden Sie einige Beispiele für Situationen, in denen Sie die Bildrate verringern sollten:

Menüs (z.B. der Einstiegspunkt der Anwendung oder ein Pausenmenü): Menüs sind in der Regel relativ einfache Szenen und müssen daher nicht mit voller Geschwindigkeit gerendert werden. Wenn Sie Menüs mit einer niedrigeren Bildrate rendern, erhalten Sie auch während eines nicht gerenderten Bildes Eingaben. So können Sie den Stromverbrauch senken und verhindern, dass die Gerätetemperatur so weit ansteigt, dass die CPU-Frequenz gedrosselt wird, und gleichzeitig eine reibungslose Interaktion mit der Benutzeroberfläche gewährleisten.

Rundenbasierte Spiele (z.B. Schach): Bei rundenbasierten Spielen gibt es Phasen geringer Aktivität, in denen die Spieler über ihren nächsten Zug nachdenken oder darauf warten, dass andere Spieler ihren Zug machen. In solchen Zeiten können Sie die Bildrate verringern, um unnötigen Stromverbrauch zu vermeiden und die Lebensdauer der Batterie zu verlängern.

Statischer Inhalt: Sie können die Bildrate in Anwendungen senken, bei denen der Inhalt die meiste Zeit statisch ist, wie z.B. bei der Benutzeroberfläche von Fahrzeugen.

Leistungsmanagement: Wenn Sie den Stromverbrauch und die Thermik des Geräts verwalten möchten, um die Akkulaufzeit zu maximieren und die CPU-Drosselung zu verhindern, insbesondere wenn Sie das Adaptive Performance-Paket verwenden, können Sie die Rendering-Geschwindigkeit anpassen.

Maschinelles Lernen oder KI-Anwendungen: Wenn Sie den Arbeitsaufwand der CPU für das Rendering reduzieren, können Sie einen kleinen Leistungsschub für die umfangreiche Verarbeitung erzielen, die im Mittelpunkt Ihrer Anwendung steht.

Wo wird es unterstützt?

Überall! On-Demand-Rendering funktioniert auf Unity 2019.3 mit jeder unterstützten Plattform (siehe Systemanforderungen) und Rendering-API (integrierte Render-Pipeline, Universal Render Pipeline und High Definition Render Pipeline).

Wie verwende ich On-Demand-Rendering?

Die On-Demand-Rendering-API besteht aus nur drei Eigenschaften im Namespace UnityEngine.Rendering.

1. OnDemandRendering.renderFrameInterval
Dies ist der wichtigste Teil. Mit dieser Funktion können Sie das Intervall für Rendering-Frames abrufen oder festlegen, das ein Teilungsfaktor von Application.targetFrameRate oder QualitySettings.vSyncCount ist, um die neue Framerate zu definieren. Wenn Sie zum Beispiel Application.targetFrameRate auf 60 und OnDemandRendering.renderFrameInterval auf 2 setzen, wird nur jedes zweite Bild gerendert, was eine Bildrate von 30 FPS ergibt.

2. OnDemandRendering.effectiveFrameRate
Diese Eigenschaft gibt Ihnen eine Schätzung der Bildrate, mit der Ihre Anwendung gerendert wird. Die Schätzung wird anhand der Werte von OnDemandRendering.renderFrameInterval, Application.targetFrameRate, QualitySettings.vSyncCount und der Bildwiederholrate ermittelt. Denken Sie jedoch daran, dass dies eine Schätzung und keine Garantie ist. Ihre Anwendung kann langsamer rendern, wenn die CPU durch andere Aufgaben wie Skripte, Physik, Netzwerke usw. belastet wird.

3. OnDemandRendering.willThisFrameRender
Hier erfahren Sie einfach, ob das aktuelle Bild auf dem Bildschirm gerendert werden soll. Sie können nicht gerenderte Frames verwenden, um zusätzliche rechenintensive Aufgaben wie schwere mathematische Operationen, das Laden von Assets oder das Spawnen von Prefabs auszuführen.

Was muss ich sonst noch wissen?
  • Auch wenn die Bilder nicht mehr so oft gerendert werden, werden die Ereignisse in einem normalen Tempo an die Skripte gesendet. Das bedeutet, dass Sie während eines Frames, der nicht gerendert wird, Eingaben erhalten können. Um das Auftreten von Eingabeverzögerungen zu vermeiden, empfehlen wir Ihnen, OnDemandRendering.renderFrameInterval = 1 für die Dauer der Eingabe aufzurufen, damit Schaltflächen, Bewegungen usw. reaktionsschnell bleiben.
  • Situationen, in denen Skripte, Physik, Animationen usw. eine große Rolle spielen, aber nicht gerendert werden, profitieren nicht von der Verwendung von On-Demand-Rendering. Die Ergebnisse erscheinen möglicherweise abgehackt und mit einer vernachlässigbaren Reduzierung des CPU- und Stromverbrauchs.
Beispiel

Hier ist ein einfaches Beispiel, das zeigt, wie On-Demand-Rendering in einem Menü verwendet werden kann, um mit 20 FPS zu rendern, wenn keine Eingabe erfolgt.

using UnityEngine;
using UnityEngine.Rendering;

public class Menu : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        QualitySettings.vSyncCount = 0;
        Application.targetFrameRate = 60;
	   // When the Menu starts, set the rendering to target 20fps
        OnDemandRendering.renderFrameInterval = 3;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButton(0) || (Input.touchCount > 0))
        {
            // If the mouse button or touch detected render at 60 FPS (every frame).
            OnDemandRendering.renderFrameInterval = 1;
        }
        else
        {
            // If there is no mouse and no touch input then we can go back to 20 FPS (every 3 frames).
            OnDemandRendering.renderFrameInterval = 3;
        }
    }
}
Bild

Hier ist ein Beispielprojekt, das zeigt, wie On-Demand-Rendering in einer Vielzahl von Situationen eingesetzt werden kann.

Verwenden Sie On-Demand-Rendering?

Lassen Sie uns in den Foren wissen, wie das On-Demand-Rendering bei Ihnen funktioniert. Wir haben es auf Windows, macOS, WebGL, iOS und Android getestet, sowohl im Unity Editor als auch mit Standalone-Playern, aber wir sind immer offen für weiteres Feedback.