Unity 6.3
0 онлайн 85 гостей 3 в системе
Вход

Данные о времени и температуре на трассе

Получение информации о устройстве в реальном времени с помощью адаптивной производительности API, включая время кадра, узкие места производительности, конфигурацию ядра CPU и предупреждения о температуре.

Время кадра трека

Адаптивная производительность отслеживает среднее время GPU, CPU и общее время кадра и обновляет их каждый кадр.

Для доступа к последним данным времени используйте свойство IPerformanceStatus.FrameTiming, которое содержит следующие сведения:

  • Общее время кадра: Разница во времени между кадрами. Используйте это значение для расчета текущей частоты кадров приложения.

  • CPU time: Время, в которое CPU фактически выполняет главный поток Unity и поток рендеринга. Время CPU не включает время, когда операционная система может блокировать Unity, или когда Unity должен ждать, пока GPU наверстает упущенное.

  • GPU time: Время, в течение которого GPU активно обрабатывает данные для рендеринга кадра. Время GPU не включает время, когда GPU должен ждать, пока Unity предоставит данные для рендеринга.

Выявление узких мест в работе

Адаптивная производительность использует целевую частоту кадров, настроенную в Application.targetFrameRate и QualitySettings, вместе с информацией, предоставляемой FrameTiming, для расчета того, что ограничивает частоту кадров приложения. Если приложение не работает с желаемой целевой частотой кадров, оно может быть ограничено либо обработкой CPU, либо GPU.

Чтобы получать уведомление при изменении текущего узкого места в производительности приложения, подпишитесь с помощью делегированной функции на событие IPerformanceStatus.PerformanceBottleneckChangeEvent.

Используйте информацию о текущем узком месте производительности для целенаправленного изменения игрового контента во время выполнения. Например, в приложении, связанном с GPU, снижение разрешения рендеринга часто значительно повышает частоту кадров, но такое же изменение может оказаться незначительным для приложения, связанного с CPU.

Получение сведений о кластере

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

Используйте clusterInfo структуру, чтобы получить сведения о количестве ядер. Например:

  var clusterInfo = Holder.Instance.PerformanceStatus.PerformanceMetrics.ClusterInfo;
  Debug.Log($"Cluster Info = Big Cores: {clusterInfo.BigCore} Medium Cores: {clusterInfo.MediumCore} Little Cores: {clusterInfo.LittleCore}");

Кластер вряд ли изменится во время выполнения, поэтому можно кэшировать данные.

Для практического примера использования clusterInfo, см. Образцы адаптивной производительности.

Режим мониторинга производительности

Адаптивная производительность отслеживает выбранный пользователем режим производительности для приложения, если он доступен.

Для доступа к текущему режиму производительности используйте свойство IPerformanceModeStatus.PerformanceMode.

Чтобы получать уведомление при изменении текущего режима работы приложения, подписывайтесь с помощью делегированной функции на событие IPerformanceModeStatus.PerformanceModeEvent. Например:

using UnityEngine;
using UnityEngine.AdaptivePerformance;
public class PerformanceModeAttacher : MonoBehaviour
{
    void Start()
    {
        Holder.Instance.PerformanceModeStatus.PerformanceModeEvent+= (PerformanceMode performanceMode) =>
        {
            Debug.Log("Performance Mode Changed: " + performanceMode);
        };
    }
}

Отслеживание состояний тепла и питания

Адаптивная производительность API дает вам доступ к текущему уровню термического предупреждения устройства через ThermalMetrics.WarningLevel и более подробный уровень температуры через ThermalMetrics.TemperatureLevel. Приложение может вносить изменения на основе этих значений, чтобы остановить операционную систему от дросселирования.

В следующем примере показана реализация компонента Unity, который использует обратную связь адаптивной производительности для корректировки глобального отклонения LOD:

using UnityEngine;
using UnityEngine.AdaptivePerformance;

public class AdaptiveLOD : MonoBehaviour
{
    // Declare 'ap' as a private class-level field to hold the IAdaptivePerformance instance.
    private IAdaptivePerformance ap = null;

    void Start() {
        // Get the Adaptive Performance instance.
        ap = Holder.Instance;
        if (!ap.Active)
            return;

        QualitySettings.lodBias = 1.0f;
        ap.ThermalStatus.ThermalEvent += OnThermalEvent;
    }

    void OnThermalEvent(ThermalMetrics ev) {
        // Adjust LOD bias based on the current thermal warning level.
        switch (ev.WarningLevel) {
            case WarningLevel.NoWarning:
                QualitySettings.lodBias = 1;
                break;
            case WarningLevel.ThrottlingImminent:
                if (ev.temperatureLevel > 0.8f)
                    QualitySettings.lodBias = 0.75f;
                else
                    QualitySettings.lodBias = 1.0f;
                break;
            case WarningLevel.Throttling:
                QualitySettings.lodBias = 0.5f;
                break;
        }
    }
}

Дополнительные ресурсы