Zarządzanie energią i temperaturą
Gdy HoloLens 2 działa w ciepłych środowiskach lub z dużymi wymaganiami dotyczącymi wydajności (użycie procesora CPU/procesora GPU, użycie urządzeń peryferyjnych itp.), może to być wystarczająco gorące, że podejmuje działania automatycznie, aby utrzymać się przed przegrzaniem. Te akcje obejmują takie elementy jak:
- Dostosowywanie wydajności ładowania
- Przekazywanie opinii użytkowników
- Zamykanie aplikacji
... i w najgorszych scenariuszach:
- Zamykanie HoloLens 2
Jeśli aplikacja wymaga wysokiej wydajności urządzeń peryferyjnych, rozważ użycie zestawu PowerThermalNotification Software Development Kit (SDK) w celu zasubskrybowania zdarzeń powiadomień i zaimplementowania własnych akcji niestandardowych. Dzięki temu urządzenie może działać dłużej w sytuacjach, gdy w przeciwnym razie aplikacja może zostać zakończona przez system.
Uwaga
Obsługa zestawu MICROSOFT.MixedReality.PowerThermalNotification SDK jest uwzględniona w wersji 22H1.
W tym artykule opisano zestaw POWERThermalNotification SDK i jego podstawowe użycie, aby rozpocząć pracę.
Gdzie mogę uzyskać zestaw SDK?
Zestaw POWERThermalNotification SDK można pobrać za pośrednictwem narzędzia Mixed Reality Feature Tool.
Zestaw POWERThermalNotification SDK obsługuje projekcje językowe dla języków C# i C++, umożliwiając deweloperom tworzenie aplikacji dla platform Win32 lub UWP.
Omówienie pojęć
Moc zużywana przez HoloLens 2 jest rozpraszana w ogniu. Tradycyjne urządzenie pc będzie mieć wentylator, aby rozwiązać ten problem, ale urządzenie do noszenia musi być lekkie. W związku z tym rozwiązanie chłodzące jest bardziej złożone. HoloLens 2 ma wbudowane funkcje bezpieczeństwa sprzętu i oprogramowania, aby upewnić się, że zestaw słuchawkowy nie jest zbyt gorący dla użytkownika, ale te funkcje muszą być również zrównoważone z obsługą użytkownika. Jeśli na przykład wiemy, która część HoloLens 2 się nagrzewa, możemy wybrać ograniczenie urządzeń peryferyjnych odpowiedzialnych za to ciepło. W ostateczności możemy zamknąć aplikację, która jest uważana za odpowiedzialną za moc, która doprowadziła do tego ciepła.
HoloLens 2 obsługuje problemy z temperaturą przy użyciu czujników temperatury. Struktura cieplna łączy grupy czujników z różnymi urządzeniami peryferyjnymi. Czujniki są zgrupowane, ponieważ może być niemożliwe ustalenie, które urządzenie peryferyjne w obszarze fizycznym jest odpowiedzialne za zużycie energii, które ogrzewa HoloLens 2.
Zestaw POWERThermalNotification SDK uwidacznia interfejsy API niezbędne do monitorowania tych grup czujników. Zdarzenia zestawu SDK są uruchamiane, gdy urządzenie peryferyjne używane przez aplikację pokazuje oznaki, że może być wymagane ograniczenie ryzyka. Aplikacja może następnie dostosować swoje środowisko klienta, aby zmniejszyć wpływ cieplny. Zmniejszenie wpływu oznacza mniejsze ryzyko działania systemu, takiego jak zamknięcie aplikacji lub urządzenia.
Prostym przykładem może być aplikacja, która używa procesora CPU do przetwarzania dużej ilości danych wideo. Aplikacja może subskrybować powiadomienie o wydajności składnika procesora CPU. Gdy aplikacja otrzyma powiadomienie, może zmniejszyć obciążenie procesora CPU. Jeśli zostanie odebrane inne zdarzenie, które wskazuje, że żadne dalsze środki zaradcze nie są konieczne, można przywrócić obciążenie procesora CPU.
Odpowiedź na platformę
Poniższa tabela zawiera podział akcji systemowych według urządzeń peryferyjnych. Akcje opisane poniżej można pominąć przy użyciu zestawu SDK. Zobacz Pomijanie domyślnych środków zaradcze systemu
Obwodowych | MinimumUserImpact | ŚredniuserImpact | Maksymalna wartośćUserImpact | Ostatnia resort | Zamykanie oprogramowania | Failsafe |
---|---|---|---|---|---|---|
Procesory GPU | Ograniczanie jakości MRC Dostosowywanie interwału VSYNC |
|||||
Wyświetl | Redukcja głębokości na sekundę | |||||
Dowolne urządzenie peryferyjne | Wyświetlanie ostrzeżenia Zamknij przechwytywanie mrC zatrzymania aplikacji |
Zamykanie systemu operacyjnego | Zamykanie sprzętu |
Uwaga
Akcje w kolumnach "Last Resort", "Software Shutdown" i "Failsafe" nie mogą być pomijane.
Sugestie dotyczące odpowiedzi aplikacji
Poniżej przedstawiono podział sugerowanych środków zaradczych, które aplikacja może podjąć w oparciu o to, które urządzenia peryferyjne wymagają ograniczenia ryzyka. Do dewelopera aplikacji należy określenie, które z tych akcji może mieć bardziej znaczący wpływ na każde urządzenie peryferyjne, ponieważ każda aplikacja jest inna. Deweloperzy powinni określić priorytety akcji, które podejmują na podstawie wpływu na użytkownika końcowego.
Sugerowane środki zaradcze według urządzeń peryferyjnych
Procesor CPU
- Dostosowywanie obciążenia na ramkę
Procesory GPU
- Zmniejsz rozdzielczość renderowania
- Aplikacja może następnie zmniejszyć pole widoku (FOV), aby zrównoważyć rozmycie zawartości
- Zmniejszanie złożoności sceny (liczba trójkątów i tekstury)
- Zmniejszanie przetwarzania aparatu fotograficznego/wideo
- Zmniejsz rozdzielczość aparatu
- Zmniejsz szybkość ramki aparatu
- Zmniejszanie przetwarzania po przetwarzaniu obrazów aparatu przez aplikację
- Przestań używać aparatu fotograficznego/wideo
DRAM
Sieć
- Zmniejszanie przepustowości
- Zmniejsz szybkość ramki wywołań wideo
- Zatrzymaj działanie sieci w tle (na przykład dane telemetryczne aplikacji)
Akumulator
- Przechodzenie do chłodniejszego środowiska
- Korzystanie z urządzenia bez ładowarki
- Unikaj uruchamiania na ładowarki z poniżej 50% opłaty
Wyświetl
- Zwiększanie liczby czarnych pikseli w scenie
- Użyj kolorów o niskiej mocy (na przykład zielonych)
- Przyciemnianie ekranu
Zdjęcie/aparat wideo
- Omówienie
- Zmniejsz rozdzielczość aparatu
- Zmniejsz szybkość ramki aparatu
- Zmniejszanie przetwarzania po przetwarzaniu obrazów aparatu przez aplikację
- Przestań używać aparatu fotograficznego/wideo
Przypadki użycia implementacji
Zestaw SDK jest przeznaczony do obsługi dwóch standardowych przypadków użycia w celu uzyskania informacji:
- Oparte na zdarzeniach
- Oparte na sondowaniu
Powiadomienie oparte na zdarzeniach zapewni najszybszą ścieżkę opinii do aplikacji na wypadek potrzeby podjęcia działań. Jednak w niektórych przypadkach deweloper może łatwiej korzystać z sondowania.
Uwaga
Informacje o stanie są aktualizowane co najwyżej kilka sekund dla każdego urządzenia peryferyjnego, więc sondowanie szybciej niż może to spowodować marnowanie cykli procesora CPU.
Użycie interfejsu API opartego na zdarzeniach
Rejestrowanie pod kątem zdarzeń
Aby otrzymywać powiadomienia, istnieją trzy wymagania:
- Obsługa systemu dla interfejsu API, w tym określonego urządzenia peryferyjnego
- Niepusta właściwość PeripheralsOfInterest
- Niepusta procedura obsługi zdarzeń PowerThermalMitigationLevelChanged lub niepusta procedura obsługi zdarzeń PowerThermalThermalScoreChanged
Nie będziesz otrzymywać zdarzeń, jeśli aplikacja nie spełnia tych wymagań.
Pierwszy element można sprawdzić za pomocą funkcji IsSupported . Jeśli system obsługuje powiadomienia dla co najmniej jednego z urządzeń peryferyjnych w masce, funkcja zwróci wartość true. Możesz zrezygnować z sprawdzania obsługi przy użyciu tej funkcji, o ile aplikacja nie zależy jawnie od zdarzeń zestawu POWERThermalNotification SDK.
Po spełnieniu powyższych trzech wymagań otrzymasz początkowe powiadomienia dotyczące wszystkich obsługiwanych urządzeń peryferyjnychOfInterest. Jeśli później zmienisz element PeripheralsOfInterest lub którykolwiek z programów obsługi zdarzeń, otrzymasz kolejny zestaw powiadomień na podstawie bieżącego stanu.
Oto fragment kodu umożliwiający pobranie wystąpienia klasy PowerThermalNotification i skonfigurowanie go na potrzeby powiadomień dla zarówno powerthermalPeripheralFlags.Cpu , jak 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;
}
}
Obsługa zdarzeń
Gdy jest uruchamiane zdarzenie PowerThermalMitigationLevelChanged , jest ono dostarczane z elementem PowerThermalEventArgs. Powinny one służyć do zrozumienia zdarzenia.
Podobnie, gdy zdarzenie PowerThermalThermalScoreChanged jest uruchamiane , pochodzi z powerThermalScoreArgs.
Po odebraniu zdarzenia program obsługi zdarzeń powinien sprawdzić args. ImpactedPeripherals, który określa, które urządzenia peryferyjne są dotknięte (może być więcej niż jeden).
W przypadku zdarzeń PowerThermalMitigationLevelChangedargs. MitigationLevel wskazuje, jak poważne ograniczenie ryzyka jest zalecane dla określonych urządzeń peryferyjnych. Jeśli args. MitigationLevel to PowerThermalMitigationLevel.NoUserImpact , a następnie należy usunąć wszelkie środki zaradcze skojarzone z określonymi urządzeniami peryferyjnymi.
W przypadku zdarzeń PowerThermalThermalScoreChangedargs. ThermalScore wskazuje wynik od 100 do 0 odzwierciedlający skalę liniową zbliżającą się do zdarzenia zamknięcia aplikacji (zero). Zakres oceny cieplnej rozpoczyna się poza zakresem raportowania ograniczania ryzyka, aby umożliwić wcześniejsze powiadomienie aplikacji podczas zbliżania się do potrzeby ograniczania ryzyka.
Oto przykładowa procedura obsługi:
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);
}
}
Uwaga
Parametr ImpactedPeripherals args identyfikuje tylko te urządzenia peryferyjne, których dotyczyło zarówno wpływ, jak i część PeripheralsOfInterest. Inne urządzenia peryferyjne, których nie dotyczy problem, nie zostały uwzględnione w urządzeniach peryferyjnychOfInterest, nie zostaną zidentyfikowane.
Uwaga
Poziomy ograniczania ryzyka dla urządzeń peryferyjnych mają histerezę. Gdy poziom zostanie zwiększony, nie zostanie zmniejszony, dopóki nie zostanie on wypuszczany. Wydanie jest zdarzeniem z elementami args. MitigationLevel ustaw wartość PowerThermalMitigationLevel.NoUserImpact.
Łączenie go (model oparty na zdarzeniach)
Oto prosty przykład zestawu skryptów, których można użyć w a unity w celu włączenia tej funkcji. Klasę NotificationComponent można dodać do dowolnego obiektu gry, a obiekt gry może śledzić poziom ograniczania ryzyka przypisanego urządzenia peryferyjnego. Klasa NotificationManager zajmuje się zestawem SDK zarządzającym subskrypcjami za pomocą pojedynczego wystąpienia klasy PowerThermalNotification .
Oto klasa 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;
}
}
}
Oto klasa 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);
}
}
Użycie interfejsu API opartego na sondowaniu
Aktualizowanie interesujących urządzeń peryferyjnych
Podobnie jak w przypadku użycia opartego na zdarzeniach, ustawienie właściwości PeripheralsOfInterest jest wymagane do sondowania danego urządzenia peryferyjnego.
Ostrzeżenie
Jeśli spróbujesz wywołać metodę GetLastPeripheralState dla danego urządzenia peryferyjnego bez uprzedniego ustawienia tej flagi w elementu PeripheralsOfInterest, zostanie zgłoszony wyjątek. Podobnie, jeśli spróbujesz użyć metody GetLastPeripheralState z nieprawidłową wartością (zestaw bitów z wieloma flagami lub nieobsługiwanym bitem), zostanie zgłoszony wyjątek.
Wywoływanie interfejsów API sondowania
Gdy urządzenia peryferyjneOfInterest ma zestaw bitów peryferyjnych, które chcesz sondować, możesz wywołać metodę GetLastPeripheralState.
Zwrócony parametr PowerThermalPeripheralState zawiera najnowsze wartości dla parametru Thermal Score i Mitigation Level dla danego urządzenia peryferyjnego.
Uwaga
Istnieje możliwość, że w przyszłych platformach niektóre urządzenia peryferyjne mogą nie być obsługiwane. W takich przypadkach interfejs API zwróci wynik termiczny 100 i poziom ograniczania ryzyka noUserImpact. Aplikacja może sprawdzić pole IsSupportedPeripheral struktury, aby sprawdzić, czy tak jest w przypadku danego urządzenia peryferyjnego.
Zobacz Handling Events (Obsługa zdarzeń ), aby uzyskać szczegółowe informacje na temat obsługi współczynnika cieplnego i ograniczenia ryzyka zwróconego przez parametr PowerThermalPeripheralState.
Oto mały fragment kodu przedstawiający sondowanie:
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";
}
}
Pomijanie domyślnych środków zaradczych dotyczących systemu
Jeśli nie chcesz, aby system próbował złagodzić niektóre urządzenia peryferyjne, możesz je pominąć. Aby to zrobić, wystarczy zaktualizować właściwość SuppressedPlatformMitigationForPeripherals lub wywołać funkcję SuppressPlatformMitigation .
Oto mały fragment kodu:
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);
Uwaga
Interfejsy API pomijania będą działać tylko wtedy, gdy proces korzystający z klasy PowerThermalNotification znajduje się na pierwszym planie. Procesy w tle mogą nadal subskrybować zdarzenia, ale mogą nie wyłączać HoloLens 2 akcji.
Testowanie
Po zintegrowaniu zestawu SDK z aplikacją należy go przetestować. W przypadku HoloLens 2 systemów operacyjnych, które obsługują zestaw SDK, strona dewelopera będzie dostępna w portalu urządzeń. Na tej stronie można kontrolować poziomy ograniczania ryzyka i wyniki cieplne dla każdego urządzenia peryferyjnego. Można również monitorować, które urządzenia peryferyjne mają aktywnie pomijane środki zaradcze.
Interfejsy API REST można również wykorzystać do monitorowania/testowania poziomów ograniczania ryzyka i wyników cieplnych z innego urządzenia. Więcej informacji można znaleźć w dokumentacji interfejsu API portalu urządzeń