Technology

Как рендеринг по требованию может повысить производительность мобильных устройств

DAVID ROGERS / UNITY TECHNOLOGIESContributor
Feb 7, 2020|4 Мин
Как рендеринг по требованию может повысить производительность мобильных устройств
Эта веб-страница была переведена с помощью машинного перевода для вашего удобства. Мы не можем гарантировать точность или надежность переведенного контента. Если у вас есть вопросы о точности переведенного контента, обращайтесь к официальной английской версии веб-страницы.

По разным причинам не всегда желательно рендерить проект с максимально возможной частотой кадров, особенно на мобильных платформах. Исторически сложилось так, что разработчики Unity использовали Application.targetFrameRate или Vsync count, чтобы регулировать скорость рендеринга Unity. Такой подход влияет не только на рендеринг, но и на частоту работы каждой части Unity. Новый API рендеринга по требованию позволяет Вам отделить частоту рендеринга от частоты циклов проигрывателя.

Что такое рендеринг по требованию?

Рендеринг по требованию позволяет Вам пропускать кадры рендеринга, сохраняя при этом высокую частоту выполнения оставшейся части цикла плеера. Это может быть особенно полезно на мобильных устройствах; обход рендеринга может дать значительную экономию производительности и энергии, при этом приложение будет реагировать на прикосновения.

Зачем мне использовать рендеринг по требованию?

Вот несколько примеров сценариев, когда Вам может понадобиться снизить частоту кадров:

Меню (например, пункт входа в приложение или меню паузы): Меню, как правило, представляют собой относительно простые Сцены, и поэтому им не нужно рендериться на полной скорости. Если Вы рендерите меню с более низкой частотой кадров, Вы все равно будете получать ввод во время кадра, который не рендерится, что позволит Вам снизить энергопотребление и не допустить повышения температуры устройства до такой степени, что частота процессора может быть снижена, сохраняя плавность взаимодействия с пользовательским интерфейсом.

Пошаговые игры (например, шахматы): В пошаговых играх бывают периоды низкой активности, когда пользователи обдумывают свой следующий ход или ждут, пока другие пользователи сделают свой ход. В такие моменты Вы можете снизить частоту кадров, чтобы предотвратить излишнее потребление энергии и продлить срок службы батареи.

Статический контент: Вы можете снизить частоту кадров в приложениях, где содержимое большую часть времени статично, например, в автомобильном пользовательском интерфейсе (UI).

Управление эффективностью: Если Вы хотите управлять энергопотреблением и температурой устройства, чтобы максимально продлить срок службы батареи и предотвратить дросселирование процессора, особенно если Вы используете пакет Adaptive Performance, Вы можете настроить скорость рендеринга.

Машинное обучение или приложения искусственного интеллекта: Сокращение объема работы, выполняемой процессором для рендеринга, может дать Вам небольшой прирост производительности для тяжелой обработки, которая является центральным элементом Вашего приложения.

Где он поддерживается?

Повсюду! Рендеринг по требованию работает в Unity 2019.3 с любой поддерживаемой платформой (см. системные требования) и API рендеринга (встроенный конвейер рендеринга, Universal Render Pipeline и High Definition Render Pipeline).

Как использовать рендеринг по требованию?

API рендеринга по требованию состоит всего из трех свойств в пространстве имен UnityEngine.Rendering.

1. OnDemandRendering.renderFrameInterval
Это самая важная часть. Она позволяет Вам получить или установить интервал между кадрами рендеринга, который является коэффициентом деления Application.targetFrameRate или QualitySettings.vSyncCount, чтобы определить новую частоту кадров. Например, если Вы установите Application.targetFrameRate на 60, а OnDemandRendering.renderFrameInterval на 2, то рендеринг будет осуществляться только через каждый второй кадр, что даст частоту кадров 30 fps.

2. OnDemandRendering.effectiveFrameRate
Это свойство дает Вам оценку частоты кадров, с которой будет работать Ваше приложение. Оценка определяется с помощью значений OnDemandRendering.renderFrameInterval, Application.targetFrameRate, QualitySettings.vSyncCount и частоты обновления дисплея. Но имейте в виду, что это приблизительная оценка, а не гарантия; Ваше приложение может работать медленнее, если процессор загружен другой работой, например, скриптами, физикой, сетью и т.д.

3. OnDemandRendering.willThisFrameRender
Это просто говорит Вам, будет ли текущий кадр выводиться на экран. Вы можете использовать нерендеренные кадры для выполнения дополнительной работы, требующей большого количества процессора, например, тяжелых математических операций, загрузки активов или порождения префабов.

Что еще мне нужно знать?
  • Несмотря на то, что кадры будут отображаться не так часто, события будут посылаться скриптам в обычном темпе. Это означает, что Вы можете получать ввод во время кадра, который не отображается. Чтобы предотвратить появление задержки ввода, мы рекомендуем Вам вызывать OnDemandRendering.renderFrameInterval = 1 на время ввода, чтобы кнопки, движение и т.д. были отзывчивыми.
  • Ситуации, в которых очень много скриптов, физики, анимации и т.д., но нет рендеринга, не выиграют от использования рендеринга по требованию. Результаты могут выглядеть нечеткими и с незначительным снижением потребления процессора и энергии.
Пример

Вот простой пример, показывающий, как рендеринг по требованию может быть использован в меню для рендеринга со скоростью 20 кадров в секунду, если нет входного сигнала.

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;
        }
    }
}
Изображение

Вот пример проекта, демонстрирующего, как рендеринг по требованию может быть использован в различных ситуациях.

Используете ли Вы рендеринг по требованию?

Сообщите нам на форумах, как рендеринг по требованию работает для Вас. Мы протестировали его на Windows, macOS, WebGL, iOS и Android, как в редакторе Unity, так и с автономными игроками, но мы всегда открыты для новых отзывов.