Řízení výkonu a teplot

Pokud HoloLens 2 běží v teplých prostředích nebo s velkými požadavky na výkon (využití procesoru/GPU, periferních zařízení atd.), může být dostatečně horký, aby automaticky podnikl akce, aby se nepřehřál. Mezi tyto akce patří například:

  • Úprava výkonu nabíjení
  • Poskytování zpětné vazby uživatelů
  • Zavírání aplikací

... a v nejhorších případech:

  • Vypnutí HoloLens 2

Pokud vaše aplikace vyžaduje vysoký výkon periferních zařízení, zvažte použití sady PowerThermalNotification Software Development Kit (SDK) k přihlášení k odběru událostí oznámení a implementaci vlastních akcí. Tím umožníte, aby zařízení fungovalo déle v situacích, kdy v opačném případě může systém ukončit aplikaci.

Poznámka

Podpora sady Microsoft.MixedReality.PowerThermalNotification SDK je součástí verze 22H1.

Tento článek popisuje sadu PowerThermalNotification SDK a její základní použití, abyste mohli začít.

Kde získám sadu SDK?

PowerThermalNotification SDK je možné stáhnout prostřednictvím nástroje Mixed Reality Feature Tool.

Sada PowerThermalNotification SDK podporuje jazykové projekce pro C# a C++, což vývojářům umožňuje vyvíjet aplikace pro platformy Win32 nebo UPW.

Základní přehled

Energie spotřebovaná HoloLens 2 se rozptyluje v teple. Tradiční počítačové zařízení by mělo ventilátor, který by to vyřešil, ale nositelné zařízení musí být lehké. Z tohoto důvodu je řešení chlazení složitější. HoloLens 2 má integrované hardwarové a softwarové bezpečnostní funkce, aby se zajistilo, že náhlavní souprava nebude pro uživatele příliš horká, ale tyto funkce musí být také vyváženy uživatelským prostředím. Pokud například víme, která část HoloLens 2 se zahřívá, můžeme se rozhodnout, že omezíme periferie zodpovědné za toto teplo. Jako poslední možnost bychom mohli zavřít aplikaci, o které se předpokládá, že je zodpovědná za energii, která vedla k tomuto teplu.

HoloLens 2 řeší problémy s teplem pomocí snímačů teploty. Tepelná architektura spojuje skupiny senzorů s různými periferiemi na zařízení. Senzory jsou seskupené, protože může být nemožné určit, které periferní zařízení ve fyzické oblasti je zodpovědné za odběr energie, který zahřívá HoloLens 2.

Sada PowerThermalNotification SDK zveřejňuje rozhraní API potřebná k monitorování těchto skupin senzorů. Události sady SDK se aktivují, když periferní zařízení používané aplikací zobrazuje známky, že může být vyžadováno zmírnění rizik. Aplikace pak může přizpůsobit své zákaznické prostředí, aby snížila teplotní dopad. Snížení dopadu znamená menší riziko akcí systému, jako je vypnutí aplikace nebo zařízení.

Jednoduchým příkladem může být aplikace, která využívá procesor ke zpracování velkého množství video dat. Aplikace by se mohla přihlásit k odběru oznámení o výkonu pro komponentu procesoru. Když aplikace obdrží oznámení, může snížit zatížení procesoru. Pokud je přijata jiná událost, která indikuje, že není nutné další zmírnění rizik, je možné obnovit úlohu procesoru.

Odpověď platformy

Následující tabulka obsahuje rozpis systémových akcí podle periferních zařízení. Akce popsané níže je možné potlačit pomocí sady SDK. Viz Potlačení výchozích omezení rizik systému.

Periferní MinimumUserImpact MediumUserImpact MaximumUserImpact Poslední možnost Vypnutí softwaru Failsafe
GPU Omezení kvality
MRC – Úprava intervalu VSYNC
Zobrazení Hloubková redukce FPS
Všechna periferní zařízení Zobrazení upozornění
Zavřít aplikaci
Zastavit MRC Capture
Vypnutí operačního systému Vypnutí hardwaru

Poznámka

Akce ve sloupcích Poslední možnost, Vypnutí softwaru a Failsafe nelze potlačit.

Návrhy pro odpověď aplikace

Následuje rozpis navrhovaných zmírnění rizik, která může aplikace přijmout na základě toho, která periferní zařízení potřebují zmírnění rizik. Je na vývojáři aplikace, aby určil, které z těchto akcí můžou mít významnější vliv na jednotlivá periferní zařízení, protože každá aplikace je jiná. Vývojáři by měli upřednostnit akce, které provádějí, na základě dopadu na koncového uživatele.

Navrhovaná omezení rizik podle periferních zařízení

Procesor

GPU

ARMÉNSKÝ

Síť

Baterie

Zobrazení

  • Zvýšení počtu černých pixelů ve scéně
  • Používejte barvy s nízkou spotřebou energie (například zelené)
  • Ztlumení displeje

Fotokamera nebo videokamera

  • Přehled
  • Snížení rozlišení kamery
  • Snížení snímkové frekvence fotoaparátu
  • Omezení následného zpracování obrázků z fotoaparátu v aplikaci
  • Ukončení používání fotoaparátu nebo videokamery

Případy použití implementace

Sada SDK je navržená tak, aby podporovala dva standardní případy použití pro získání informací:

  • Na základě událostí
  • Založené na dotazování

Oznámení založená na událostech poskytují nejrychlejší cestu pro zpětnou vazbu k aplikaci pro případ, že by potřebovala provést akci. V některých případech ale může být pro vývojáře vhodnější používat dotazování.

Poznámka

Informace o stavu se pro každé periferní zařízení aktualizují maximálně každých několik sekund, takže rychlejší dotazování může plýtt cykly procesoru.

Využití rozhraní API na základě událostí

Registrace událostí

Pro získání oznámení platí tři požadavky:

Pokud vaše aplikace tyto požadavky nesplňuje, nebudete dostávat události.

První položku je možné zkontrolovat pomocí funkce IsSupported . Pokud systém podporuje oznámení alespoň pro jedno periferní zařízení v masce, funkce vrátí hodnotu true. Pokud vaše aplikace není explicitně závislá na událostech sady PowerThermalNotification SDK, můžete se rozhodnout, že pomocí této funkce nebudete kontrolovat podporu.

Jakmile splníte tři výše uvedené požadavky, obdržíte počáteční oznámení pro všechna podporovaná periferní zařízeníOfInterest. Pokud později změníte PeripheralsOfInterest nebo některou z obslužných rutin událostí, obdržíte další sadu oznámení na základě aktuálního stavu.

Tady je fragment kódu pro získání instance třídy PowerThermalNotification a její konfiguraci pro oznámení pro PowerThermalPeripheralFlags.Cpu i 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;
    }  
}

Zpracování událostí

Když se událost PowerThermalMitigationLevelChanged aktivuje, je součástí powerThermalEventArgs. Ty by se měly použít k pochopení události.

Podobně platí, že když se událost PowerThermalThermalScoreChanged aktivuje, přichází s událostí PowerThermalScoreArgs.

Při přijetí události by obslužná rutina události měla zkontrolovat argumenty. ImpactedPeripherals, která identifikují ovlivněná periferní zařízení (může jich být více než jedno).

Pro události PowerThermalMitigationLevelChangedargs. MitigationLevel označuje, jak závažné omezení rizik se doporučuje pro určená periferní zařízení. Pokud args. MitigationLevel je PowerThermalMitigationLevel.NoUserImpact . Pak by se měla odebrat všechna zmírnění rizik spojená se zadanými periferními zařízeními.

Pro události PowerThermalThermalScoreChangedargs. ThermalScore udává skóre od 100 do 0, které odráží lineární škálování blížící se události vypnutí aplikace (nula). Rozsah tepelného skóre začíná mimo rozsah generování sestav zmírnění rizik, aby bylo možné aplikaci dříve oznamovat, když se blíží potřeba zmírnění rizik.

Tady je příklad obslužné rutiny:

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);
    }
}

Poznámka

ImpactedPeripherals Parametr args identifikuje pouze ta periferní zařízení, která byla ovlivněna A součástí PeripheralsOfInterest. Ostatní ovlivněná periferní zařízení, která nebyla zahrnuta do funkce PeripheralsOfInterest, nebudou identifikována.

Poznámka

Zmírňující úrovně periferních prostředků mají hysterézu. Jakmile se úroveň zvýší, neklesá, dokud se neuvolní. Vydání je událost s args. MitigationLevel nastavená na PowerThermalMitigationLevel.NoUserImpact.

Sestavení (model založený na událostech)

Tady je jednoduchý příklad sady skriptů, které se dají použít v Unity k povolení této funkce. Třídu NotificationComponent lze přidat do libovolného herního objektu a tento herní objekt může sledovat úroveň zmírnění přiřazeného periferního zařízení. Třída NotificationManager se zabývá sadou SDK, která spravuje odběry prostřednictvím jedné instance třídy PowerThermalNotification .

Tady je třída 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;
        }
    }
}

Tady je třída 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);
    }

}

Využití rozhraní API založeného na dotazování

Aktualizace zajímavých periferních zařízení

Podobně jako u použití na základě událostí se k dotazování daného periferního zařízení vyžaduje nastavení vlastnosti PeripheralsOfInterest .

Upozornění

Pokud se pokusíte volat GetLastPeripheralState pro dané periferní zařízení bez prvního nastavení příznaku v PeripheralsOfInterest, vyvolá se výjimka. Podobně pokud se pokusíte použít GetLastPeripheralState s neplatnou hodnotou (více bitů příznaku nebo nepodporovaný bit), vyvolá se výjimka.

Volání rozhraní API pro dotazování

Jakmile má PeripheralsOfInterest periferní bity nastavené, které chcete dotazovat, můžete volat GetLastPeripheralState.

Vrácená hodnota PowerThermalPeripheralState obsahuje nejnovější hodnoty pro skóre teploty a úroveň zmírnění rizik pro dané periferní zařízení.

Poznámka

V budoucích platformách se může stát, že některá periferní zařízení nebudou podporovaná. V těchto případech rozhraní API vrátí tepelné skóre 100 a úroveň zmírnění noUserImpact. Aplikace může zkontrolovat IsSupportedPeripheral pole struktury a zkontrolovat, zda je to případ daného periferního zařízení.

Podrobnosti o zpracování teplotního skóre a úrovně mitigationlevel vrácené hodnotou PowerThermalPeripheralState najdete v tématu Zpracování událostí.

Tady je malý fragment kódu znázorňující dotazování:

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";
    }
}

Potlačení výchozích systémových omezení rizik

Pokud nechcete, aby se systém pokusil zmírnit určitá periferní zařízení, můžete je potlačit. Chcete-li to provést, stačí aktualizovat SuppressedPlatformMitigationForPeripherals vlastnost nebo volat SuppressPlatformMitigation funkce.

Tady je malý fragment kódu:

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);

Poznámka

Rozhraní API potlačení budou fungovat pouze v případě, že se proces, který používá třídu PowerThermalNotification, nachází v popředí. Procesy na pozadí se stále můžou přihlásit k odběru událostí, ale nemusí zakázat HoloLens 2 akce.

Testování

Po integraci sady SDK do aplikace ji budete chtít otestovat. V případě HoloLens 2 operačních systémů, které podporují sadu SDK, bude na portálu zařízení k dispozici stránka pro vývojáře. Na této stránce můžete řídit úrovně zmírnění rizik a skóre teploty pro každé periferní zařízení. Můžete také monitorovat, u kterých periferních zařízení se aktivně potlačují zmírnění rizik.

Rozhraní REST API můžete také využít k monitorování/testování úrovní zmírnění rizik a skóre teploty z jiného zařízení. Další informace najdete v referenčních informacích k rozhraní API portálu zařízení.