Управление питанием и теплом

Когда HoloLens 2 работает в теплых средах или с большими требованиями к производительности (загрузка ЦП или GPU, использование периферийных устройств и т. д.), он может стать достаточно горячим, чтобы автоматически выполнять действия для защиты от перегрева. Эти действия включают в себя следующее:

  • Настройка производительности зарядки
  • Предоставление отзывов пользователей
  • Закрытие приложений

... и в наихудших сценариях:

  • Завершение работы HoloLens 2

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

Примечание

Поддержка пакета SDK Microsoft.MixedReality.PowerThermalNotification включена в выпуск 22H1.

В этой статье описывается пакет SDK Для PowerThermalNotification и его основные способы использования для начала работы.

Где получить пакет SDK?

Пакет SDK PowerThermalNotification можно скачать через средство Смешанная реальность Feature Tool.

Пакет SDK PowerThermalNotification поддерживает языковые проекции для C# и C++, позволяя разработчикам разрабатывать приложения для платформ Win32 или UWP.

Общие сведения

Мощность, потребляемая HoloLens 2, рассеивается в тепле. Традиционное устройство ПК будет иметь вентилятор для решения этой проблемы, но носимое устройство должно быть легким. Из-за этого решение охлаждения является более сложным. HoloLens 2 имеет встроенные аппаратные и программные функции безопасности, чтобы гарантировать, что гарнитура не станет слишком горячей для пользователя, но эти функции также должны быть сбалансированы с пользовательским интерфейсом. Например, если мы знаем, какая часть HoloLens 2 нагревается, мы можем выбрать регулирование периферийных устройств, ответственных за это тепло. В крайнем случае мы можем закрыть приложение, которое, как полагают, отвечает за мощность, которая привела к этой жаре.

HoloLens 2 справляется с проблемами тепла с помощью датчиков температуры. Тепловая платформа связывает группы датчиков с различными периферийными устройствами. Датчики группируются, так как определить, какое периферийное устройство в физической области отвечает за питание, которое нагревает HoloLens 2.

Пакет SDK PowerThermalNotification предоставляет API, необходимые для мониторинга этих групп датчиков. События пакета SDK возникают, когда периферийное устройство, используемое приложением, показывает признаки того, что может потребоваться устранение рисков. Затем приложение может адаптировать взаимодействие с клиентами, чтобы уменьшить тепловое воздействие. Снижение влияния означает снижение риска действий системы, таких как завершение работы приложения или устройства.

Простым примером может быть приложение, которое использует ЦП для обработки большого объема видеоданных. Приложение может подписаться на уведомление о производительности для компонента ЦП. Когда приложение получает уведомление, это может уменьшить рабочую нагрузку ЦП. Если получено другое событие, указывающее, что дальнейшее устранение рисков не требуется, можно восстановить рабочую нагрузку ЦП.

Ответ платформы

В следующей таблице представлена разбивка системных действий по периферийным устройствам. Описанные ниже действия можно подавлять с помощью пакета SDK. См . раздел Подавление устранения рисков системы по умолчанию.

Периферийные устройства MinimumUserImpact MediumUserImpact MaximumUserImpact Последнее средство Завершение работы программного обеспечения Отказоустойчивый
Графический процессор Регулирование mrc quality
adjust интервал VSYNC
Отображение Уменьшение глубины FPS
Любое периферийное устройство Отображение предупреждения
Закрытие приложения
остановить запись MRC
Завершение работы ОС Завершение работы оборудования

Примечание

Действия в столбцах "Последнее средство", "Завершение работы программного обеспечения" и "Отказоустойчивые" не могут быть подавлены.

Предложения для ответа приложения

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

Предлагаемые способы устранения рисков для периферийных устройств

ЦП

Графический процессор

DRAM

Сеть

Аккумулятор

Отображение

  • Увеличение количества черных пикселей в сцене
  • Используйте маломощные цвета (например, зеленый)
  • Затемнение дисплея

Фото/видеокамера

  • Обзор
  • Уменьшение разрешения камеры
  • Уменьшение частоты кадров камеры
  • Сокращение постобработки изображений камеры в приложении
  • Прекращение использования фото- и видеокамеры

Варианты использования реализации

Пакет SDK предназначен для поддержки двух стандартных вариантов использования для получения сведений:

  • На основе событий
  • Опрос на основе

Уведомление на основе событий обеспечит самый быстрый путь обратной связи для приложения на случай, если ему нужно принять меры. Однако в некоторых случаях для разработчика может быть удобнее использовать опрос.

Примечание

Сведения о состоянии обновляются не более чем каждые несколько секунд для каждого периферийного устройства, поэтому опрос быстрее, чем это может привести к трате циклов ЦП.

Использование API на основе событий

Регистрация для событий

Для получения уведомлений существует три требования:

Вы не будете получать события, если приложение не соответствует этим требованиям.

Первый элемент можно проверить с помощью функции IsSupported . Если система поддерживает уведомления хотя бы для одного из периферийных устройств в маске, функция возвращает значение true. Вы можете не проверка поддержку с помощью этой функции, если приложение не зависит явным образом от событий пакета SDK PowerThermalNotification.

После выполнения трех указанных выше требований вы получите начальные уведомления для всех поддерживаемых PeripheralsOfInterest. Если позже вы измените Значение PeripheralsOfInterest или любой из обработчиков событий, вы получите другой набор уведомлений в зависимости от текущего состояния.

Ниже приведен фрагмент кода для захвата экземпляра класса PowerThermalNotification и его настройки для уведомлений для PowerThermalPeripheralFlags.Cpu и PowerThermalPeripheralFlags.PhotoVideoCamera:

using Microsoft.MixedReality.PowerThermalNotification;

private void NotificationHandler(object sender, PowerThermalEventArgs args)
{
    //  Notification handling can be done here using information contained in args
}

private void InitializeThermalNotifications()
{
    PowerThermalNotification p = PowerThermalNotification.GetForCurrentProcess();
    
    PowerThermalPeripheralFlags requestedFlags = PowerThermalPeripheralFlags.Cpu | PowerThermalPeripheralFlags.PhotoVideoCamera;
     if (PowerThermalNotification.IsSupported(requestedFlags))
    {
        //At least one of these peripherals is supported by the system
        p.PeripheralsOfInterest = requestedFlags;
        p.PowerThermalMitigationLevelChanged += NotificationHandler;
    }  
}

Обработка событий

При возникновении события PowerThermalMitigationLevelChanged оно поставляется с PowerThermalEventArgs. Они должны использоваться для понимания события.

Аналогичным образом, когда срабатывает событие PowerThermalThermalScoreChanged , оно поставляется с PowerThermalScoreArgs.

При получении события обработчик событий должен проверить аргументы. ImpactedPeripherals, который определяет, какие периферийные устройства затронуты (их может быть несколько).

Для событий PowerThermalMitigationLevelChangedаргументы . MitigationLevel указывает, насколько серьезное устранение рисков рекомендуется для указанных периферийных устройств. Если аргументы. MitigationLevelЭто PowerThermalMitigationLevel.NoUserImpact , после чего все меры по устранению рисков, связанные с указанными периферийными устройствами, должны быть удалены.

Для событий PowerThermalThermalScoreChanged— аргументы. ThermalScore указывает на оценку от 100 до 0, отражающую линейную шкалу, приближающуюся к событию завершения работы приложения (ноль). Диапазон тепловой оценки начинается за пределами диапазона отчетов по устранению рисков, чтобы обеспечить более раннее уведомление для приложения при приближении к необходимости устранения рисков.

Ниже приведен пример обработчика:

bool doCpuThrottle = false;

private void NotificationHandler(object sender, PowerThermalEventArgs args)
{
    if (args.ImpactedPeripherals.HasFlag(PowerThermalPeripheralFlags.Cpu))
    {
        if(args.MitigationLevel = PowerThermalMitigationLevel.NoUserImpact)
        {
            doCpuThrottle = false;
        }
        else if(args.MitigationLevel >= PowerThermalMitigationLevel.MinimumUserImpact)
        {
            // Note that this only kicks in at MinimumUserImpact and does not get released until NoUserImpact
            doCpuThrottle = true;
        }
    }

    if (args.ImpactedPeripherals.HasFlag(PowerThermalPeripheralFlags.PhotoVideoCamera))
    {
        SetMitigationStatus(PhotoVideoCameraStatusText, PhotoVideoRectangle, args.MitigationLevel);
    }
}

Примечание

Параметр ImpactedPeripherals аргумента args определяет только те периферийные устройства, которые были затронуты и частью PeripheralsOfInterest. Другие затронутые периферийные устройства, которые не были включены в PeripheralsOfInterest, не будут идентифицированы.

Примечание

Уровни устранения рисков для периферийных устройств имеют гистерезис. После увеличения уровня он не уменьшается, пока не будет освобожден. Выпуск — это событие с аргументами. MitigationLevel имеет значение PowerThermalMitigationLevel.NoUserImpact.

Объединение (модель на основе событий)

Ниже приведен простой пример набора скриптов, которые можно использовать в Unity для включения этой функции. Класс NotificationComponent можно добавить в любой игровой объект, и этот игровой объект может отслеживать уровень устранения рисков назначенного периферийного устройства. Класс NotificationManager обрабатывает пакет SDK для управления подписками через один экземпляр класса PowerThermalNotification .

Вот класс NotificationManager:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

using Microsoft.MixedReality.PowerThermalNotification;

public class NotificationManager
{
    private static readonly object listLock = new object();
    private static List<NotificationComponent> components = new List<NotificationComponent>();
    private static PowerThermalNotification p = PowerThermalNotification.GetForCurrentProcess();
    private static bool FirstTime = true;

    private static void NotificationHandler(object sender, PowerThermalEventArgs args)
    {
        lock (listLock)
        {
            foreach (NotificationComponent c in components)
            {
                UnityEngine.WSA.Application.InvokeOnAppThread(() =>
                {
                    c.SetMitigationLevel(args.ImpactedPeripherals, args.MitigationLevel);
                }, false);
            }
        } 
    }

    public static void ChangeSuppression(PowerThermalPeripheralFlags peripherals, bool suppress)
    {
        p.SuppressPlatformMitigation(peripherals, suppress);
    }

    public static void AddNotification(NotificationComponent component, PowerThermalPeripheralFlags peripheralsOfInterest)
    {
        if (FirstTime)
        {
            p.PowerThermalMitigationLevelChanged += NotificationHandler;
            FirstTime = false;
        }
        
        if (PowerThermalNotification.IsSupported(peripheralsOfInterest))
        {
            lock (listLock)
            {
                component.SetMitigationLevel(peripheralsOfInterest, (PowerThermalMitigationLevel)0);
                components.Add(component);
            }
            p.PeripheralsOfInterest |= peripheralsOfInterest;
        }
    }
}

Ниже приведен класс NotificationComponent:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using Microsoft.MixedReality.PowerThermalNotification;

public class NotificationComponent : MonoBehaviour
{
    //Note that this could be multiple peripherals, just need to make sure to look at impactedPeripherals in the handler
    public PowerThermalPeripheralFlags monitoredPeripheral = (PowerThermalPeripheralFlags) 0;
    public bool isSuppressed = false;

    public void SetMitigationLevel(PowerThermalMitigationLevel level)
    {
        Color newColor = Color.white;

        if (level == PowerThermalMitigationLevel.NoUserImpact)
        {
            newColor = Color.green;
        }
        else if (level == PowerThermalMitigationLevel.MinimumUserImpact)
        {
            newColor = Color.yellow;
        }
        else if (level == PowerThermalMitigationLevel.MediumUserImpact)
        {
            newColor = new Color32(255, 127, 37, 255);//Orange
        }
        else
        {
            newColor = Color.red;
        }

        MaterialPropertyBlock props = new MaterialPropertyBlock();
        props.SetColor("_Color", newColor);
        GetComponent<Renderer>().SetPropertyBlock(props);
    }

    public void SetMitigationLevel(PowerThermalPeripheralFlags impactedPeripherals, PowerThermalMitigationLevel level)
    {
        if (impactedPeripherals.HasFlag(monitoredPeripheral))
        {
            SetMitigationLevel(level);
        }
    }

    void Start()
    {
        NotificationManager.AddNotification(this, monitoredPeripheral);
        NotificationManager.ChangeSuppression(monitoredPeripheral, isSuppressed);
    }

}

Использование API на основе опроса

Обновление интересующих периферийных устройств

Как и при использовании на основе событий, для опроса данного периферийного устройства необходимо задать свойство PeripheralsOfInterest .

Предупреждение

Если вы попытаетесь вызвать GetLastPeripheralState для данного периферийного устройства без предварительного задания этого флага в PeripheralsOfInterest, будет выдано исключение. Аналогичным образом, при попытке использовать GetLastPeripheralState с недопустимым значением (задано несколько битов флага или неподдерживаемый бит), будет создано исключение.

Вызов опрашивающего API

После того как в PeripheralsOfInterest будет заданы периферийные биты, которые вы хотите опрашивать, можно вызвать Метод GetLastPeripheralState.

Возвращенный объект PowerThermalPeripheralState содержит последние значения для тепловой оценки и уровня устранения рисков для заданного периферийного устройства.

Примечание

Возможно, что в будущих платформах некоторые периферийные устройства могут не поддерживаться. В таких случаях API возвращает оценку температуры 100 и уровень устранения рисков NoUserImpact. Приложение может проверка поле IsSupportedPeripheral структуры, чтобы проверка, так ли это для данного периферийного устройства.

Дополнительные сведения об обработке тепловой оценки и mitigationLevel, возвращаемых PowerThermalPeripheralState, см. в разделе Обработка событий.

Вот небольшой фрагмент, показывающий опрос:

private async void timerCallback(object state)
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        PowerThermalNotification p = PowerThermalNotification.GetForCurrentProcess();

        PowerThermalPeripheralState CpuState = p.GetLatestPeripheralState(PowerThermalPeripheralFlags.Cpu);
        PowerThermalPeripheralState PhotoVideoCameraState = p.GetLatestPeripheralState(PowerThermalPeripheralFlags.PhotoVideoCamera);
        
        CpuScoreText.Text = CpuState.ThermalScore.ToString();
        PhotoVideoScoreText.Text = PhotoVideoCameraState.ThermalScore.ToString();
    });
}

private void InitializeThermalNotifications()
{
    PowerThermalNotification p = PowerThermalNotification.GetForCurrentProcess();

    PowerThermalPeripheralFlags requestedFlags = PowerThermalPeripheralFlags.Cpu | PowerThermalPeripheralFlags.PhotoVideoCamera;
    p.SuppressedPlatformMitigationForPeripherals = requestedFlags;//Suppress any platform mitigation on CPU or PhotoVideoCamera

    if (PowerThermalNotification.IsSupported(requestedFlags))
    {
        p.PeripheralsOfInterest = requestedFlags;

        Timer timer = new Timer(timerCallback, null, 0, 3000);
    }
    else
    {
        TitleLabel.Text = "Not Supported";
    }
}

Подавление системных мер по умолчанию

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

Вот небольшой фрагмент кода:

PowerThermalNotification p = PowerThermalNotification.GetForCurrentProcess();
PowerThermalPeripheralFlags requestedFlags = PowerThermalPeripheralFlags.Cpu | PowerThermalPeripheralFlags.PhotoVideoCamera;

//You can do this to set the property explicitly
p.SuppressedPlatformMitigationForPeripherals = requestedFlags;

//Or you can do this to manipulate the property mask. 
//This specific example clears the CPU, leaving the PhotoVideoCamera suppressed
p.SuppressPlatformMitigation(PowerThermalPeripheralFlags.Cpu, false);

Примечание

API подавления будут работать только в том случае, если процесс, использующий класс PowerThermalNotification, находится на переднем плане. Фоновые процессы по-прежнему могут подписываться на события, но не могут отключать действия HoloLens 2.

Тестирование

После интеграции пакета SDK в приложение его необходимо протестировать. Для HoloLens 2 операционных систем, поддерживающих пакет SDK, на портале устройств будет доступна страница разработчика. На этой странице можно управлять уровнями устранения рисков и показателями температуры для каждого периферийного устройства. Вы также можете отслеживать, какие периферийные устройства активно подавляются.

Вы также можете использовать REST API для мониторинга и тестирования уровней устранения рисков и оценок температуры с другого устройства. Дополнительные сведения см. в справочнике по API портала устройств.