Güç ve termalleri yönetme

HoloLens 2 sıcak ortamlarda veya ağır performans gereksinimleriyle (CPU/GPU kullanımı, çevresel kullanım vb.) çalışırken aşırı ısınmasını engelleyebilecek eylemleri otomatik olarak gerçekleştirecek kadar ısınabilir. Bu eylemler şunları içerir:

  • Şarj performansını ayarlama
  • Kullanıcı geri bildirimi sağlama
  • Uygulamaları kapatma

... ve en kötü senaryolarda:

  • HoloLens 2 kapatılıyor

Uygulamanız yüksek çevresel performans gerektiriyorsa bildirim olaylarına abone olmak ve kendi özel eylemlerinizi uygulamak için PowerThermalNotification Yazılım Geliştirme Seti'ni (SDK) kullanmayı göz önünde bulundurun. Bunu yapmak, bir uygulamanın sistem tarafından sonlandırılabildiği durumlarda cihazın daha uzun süre çalışmasına izin verebilir.

Not

Microsoft.MixedReality.PowerThermalNotification SDK desteği 22H1 sürümüne dahildir.

Bu makalede PowerThermalNotification SDK'sı ve başlangıç yapmak için temel kullanımı açıklanmaktadır.

SDK'yi nereden edinebilirim?

PowerThermalNotification SDK'sı Karma Gerçeklik Özellik Aracı aracılığıyla indirilebilir.

PowerThermalNotification SDK'sı, C# ve C++ için dil projeksiyonlarını destekleyerek geliştiricilerin Win32 veya UWP platformları için uygulama geliştirmesine olanak tanır.

Kavramsal genel bakış

HoloLens 2 tarafından tüketilen güç ısıda dağılır. Geleneksel bir bilgisayar cihazının bunu ele alacak bir fanı olabilir, ancak giyilebilir bir cihazın hafif olması gerekir. Bu nedenle, soğutma çözümü daha karmaşıktır. HoloLens 2, mikrofonlu kulaklığın kullanıcı için çok sıcak olmamasını sağlamak için yerleşik donanım ve yazılım güvenliği özelliklerine sahiptir, ancak bu özelliklerin kullanıcı deneyimiyle de dengelenmiş olması gerekir. Örneğin, HoloLens 2 hangi bölümünün ısınıyor olduğunu biliyorsak, bu ısıdan sorumlu çevre birimlerini kısıtlamayı seçebiliriz. Son çare olarak, bu sıcaktan sorumlu olduğu düşünülen bir uygulamayı kapatabiliriz.

HoloLens 2 sıcaklık algılayıcılarını kullanarak ısı sorunlarını çözer. Termal çerçeve, algılayıcı gruplarını cihazdaki farklı çevre birimleriyle bağlar. Algılayıcılar gruplandırılır, çünkü fiziksel alandaki hangi çevre biriminin HoloLens 2 ısıtan güç çekmeden sorumlu olduğunu belirlemek mümkün olmayabilir.

PowerThermalNotification SDK'sı, bu algılayıcı gruplarını izlemek için gereken API'leri kullanıma sunar. SDK olayları, uygulama tarafından kullanılan bir çevre birimi bir azaltma gerekebileceğini belirten işaretler gösterdiğinde tetiklenir. Uygulama daha sonra termal etkiyi azaltmak için müşteri deneyimini uyarlayabilir. Etkiyi azaltmak, uygulama veya cihaz kapatma gibi daha az sistem eylemi riski anlamına gelir.

Basit bir örnek, büyük miktarda video verilerini işlemek için CPU kullanan bir uygulama olabilir. Uygulama, CPU bileşeni için bir performans bildirimine abone olabilir. Uygulama bir bildirim aldığında CPU iş yükünü azaltabilir. Başka bir azaltma gerekmediğini belirten başka bir olay alınırsa, CPU iş yükü geri yüklenebilir.

Platform yanıtı

Aşağıdaki tabloda çevre birimine göre sistem eylemlerinin dökümü yer alır. Aşağıda açıklanan eylemler SDK kullanılarak gizlenebilir. Bkz . Varsayılan Sistem Risk Azaltmalarını Engelleme

Peri -ferik MinimumUserImpact MediumUserImpact MaximumUserImpact Son Çare Yazılım Kapatma Failsafe
GPU AZALTMA MRC Kalite
Ayarlama VSYNC Aralığı
Göster Derinlik FPS Azaltma
Herhangi bir Çevre Birimi Görüntü Uyarısı
Uygulama
Durdur MRC Yakalamayı Durdur
İşletim Sistemi Kapatma Donanım Kapatma

Not

"Last Resort", "Software Shutdown" ve "Failsafe" sütunlarındaki eylemler gizlenemez.

Uygulama yanıtı için öneriler

Aşağıda, bir uygulamanın hangi çevre birimlerinin azaltmaya ihtiyaç duyduğuna bağlı olarak alabildiği önerilen azaltmaların dökümü yer alır. Her uygulama farklı olduğundan bu eylemlerden hangisinin her çevre birimi üzerinde daha önemli bir etkiye sahip olabileceğini belirlemek uygulama geliştiricisine bağlıdır. Geliştiriciler, son kullanıcı üzerindeki etkisine bağlı olarak gerçekleştirdikleri eylemlere öncelik vermelidir.

Çevre birimine göre önerilen azaltmalar

CPU

GPU

DRAMI

Pil

Göster

  • Sahnedeki siyah piksel sayısını artırma
  • Düşük güçlü renkler kullanın (örneğin, yeşil)
  • Ekranı karart

Fotoğraf/video kamera

  • Genel bakış
  • Kamera çözünürlüğünü azaltma
  • Kamera kare hızını azaltma
  • Kamera görüntülerinin uygulama sonrası işlenmesini azaltma
  • Fotoğraf/video kamerayı kullanmayı durdurma

Uygulama kullanım örnekleri

SDK, bilgi almak için iki standart kullanım örneği destekleyecek şekilde tasarlanmıştır:

  • Olay tabanlı
  • Yoklama tabanlı

Olay tabanlı bildirim, eylem gerçekleştirmesi gerektiğinde uygulamaya en hızlı geri bildirim yolunu sağlar. Ancak bazı durumlarda geliştiricinin yoklamayı kullanması daha uygun olabilir.

Not

Durum bilgileri her çevre birimi için en fazla birkaç saniyede bir güncelleştirilir, bu nedenle yoklama işlemi CPU döngülerini boşa harcayabilir.

Olay tabanlı API kullanımı

Olaylara kaydolma

Bildirimleri almak için üç gereksinim vardır:

Uygulamanız bu gereksinimleri karşılamıyorsa olay almazsınız.

İlk öğe , IsSupported işlevi kullanılarak denetlenebilir. Sistem maskedeki çevre birimlerinden en az biri için bildirimleri destekliyorsa işlev true değerini döndürür. Uygulamanız Açıkça PowerThermalNotification SDK olaylarına bağımlı olmadığı sürece bu işlevi kullanarak desteği denetlememeyi seçebilirsiniz.

Yukarıdaki üç gereksinimi karşıladıktan sonra desteklenen tüm PeripheralsOfInterest için ilk bildirimleri alırsınız. Daha sonra PeripheralsOfInterest veya olay işleyicilerinden birini değiştirirseniz, geçerli duruma göre başka bir bildirim kümesi alırsınız.

PowerThermalNotification sınıf örneğini almak ve hem PowerThermalPeripheralFlags.Cpu hem de PowerThermalPeripheralFlags.PhotoVideoCamera için bildirimler için yapılandırmak için bir kod parçacığı aşağıdadır:

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

Olayları işleme

PowerThermalMitigationLevelChanged olayı tetiklendiğinde PowerThermalEventArgs ile birlikte gelir. Bunlar olayı anlamak için kullanılmalıdır.

Benzer şekilde, PowerThermalThermalScoreChanged olayı tetiklendiğinde PowerThermalScoreArgs ile birlikte gelir.

Bir olay alındığında, olay işleyicisi birleştirmeleri incelemelidir . Etkilenen çevre birimlerini tanımlayan ImpactedPeripherals (birden fazla olabilir).

PowerThermalMitigationLevelChanged olayları için args. MitigationLevel, belirtilen çevre birimleri için bir azaltmanın ne kadar ciddi önerilmesi önerildiğini gösterir. Eğer birleşiyorsa. MitigationLevel, PowerThermalMitigationLevel.NoUserImpact olduğunda, belirtilen çevre birimleriyle ilişkili tüm azaltmalar kaldırılmalıdır.

PowerThermalThermalScoreChanged olayları için args. ThermalScore, uygulama kapatma olayına (sıfır) yaklaşan doğrusal ölçeği yansıtan 100 ile 0 arasında bir puanı gösterir. Termal Puan aralığı, risk azaltma gereksinimine yaklaşıldığında uygulamaya daha erken bildirim sağlamak için risk azaltma raporlama aralığının dışında başlar.

Aşağıda örnek bir işleyici verilmişti:

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

Not

args'nin ImpactedPeripherals parametresi yalnızca hem etkilenen hem de PeripheralsOfInterest'in bir parçası olan çevre birimlerini tanımlar. PeripheralsOfInterest içinde bulunmayan diğer etkilenen çevre birimleri tanımlanmaz.

Not

Çevre birimleri için risk azaltma düzeylerinde histerizi vardır. Düzey arttığında, serbest bırakılıncaya kadar azalmaz. Yayın, args içeren bir olaydır. MitigationLevel, PowerThermalMitigationLevel.NoUserImpact olarak ayarlanır.

Bir araya getirirken (olay tabanlı model)

Bu işlevi etkinleştirmek için Unity'de kullanılabilecek basit bir betik kümesi örneği aşağıda verilmiştır. NotificationComponent sınıfı herhangi bir oyun nesnesine eklenebilir ve bu oyun nesnesi atanan çevre biriminin azaltma düzeyini izleyebilir. NotificationManager sınıfı, PowerThermalNotification sınıfının tek örneği aracılığıyla abonelikleri yöneten SDK ile ilgilenir.

NotificationManager sınıfı aşağıdadır:

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 sınıfı aşağıdadır:

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

}

Yoklama tabanlı API kullanımı

İlgilenen çevre birimlerini güncelleştirme

Olay tabanlı kullanıma benzer şekilde, belirli bir çevre biriminin yoklanması için PeripheralsOfInterest özelliğinin ayarlanması gerekir.

Uyarı

İlk olarak PeripheralsOfInterest'te bu bayrağı ayarlamadan belirli bir çevre birimi için GetLastPeripheralState'i çağırmaya çalışırsanız, bir özel durum oluşturulur. Benzer şekilde, geçersiz bir değerle (birden çok bayrak biti ayarlanmış veya desteklenmeyen bir bit) GetLastPeripheralState kullanmayı denerseniz, bir özel durum oluşturulur.

Yoklama API'lerini çağırma

PeripheralsOfInterest yoklama yapmak istediğiniz çevre birimi bitlerini ayarladıktan sonra GetLastPeripheralState'i çağırabilirsiniz.

Döndürülen PowerThermalPeripheralState , verilen çevre birimi için Termal Puan ve Azaltma Düzeyi için en son değerleri içerir.

Not

Gelecek platformlarda belirli çevre birimleri desteklenmeyebilir. Bu durumlarda API 100 Termal Puan ve NoUserImpact Azaltma Düzeyi döndürür. Uygulama, belirli bir çevre biriminin böyle olup olmadığını denetlemek için yapının IsSupportedPeripheral alanını denetleyebiliyor.

PowerThermalPeripheralState tarafından döndürülen Termal Puanın ve MitigationLevel'in işlenmesiyle ilgili ayrıntılar için bkz. İşleme Olayları.

Yoklamayı gösteren küçük bir kod parçacığı aşağıdadır:

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

Varsayılan sistem risk azaltmalarını gizleme

Sistemin belirli çevre birimlerini azaltmaya çalışmasını istemiyorsanız, bunları gizleyebilirsiniz. Bunu yapmak için SuppressedPlatformMitigationForPeripherals özelliğini güncelleştirin veya SuppressPlatformMitigation işlevini çağırın.

İşte küçük bir kod parçacığı:

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

Not

Gizleme API'leri yalnızca PowerThermalNotification sınıfını kullanan işlem ön planda olduğunda çalışır. Arka plan işlemleri yine olaylara abone olabilir ancak HoloLens 2 eylemleri devre dışı bırakamayabilir.

Test Etme

SDK'yı uygulamanıza tümleştirdikten sonra test etmek isteyeceksiniz. SDK'yı destekleyen HoloLens 2 işletim sistemleri için, Cihaz Portalı'nda bir geliştirici sayfası sağlanacaktır. Bu sayfadan, her çevre birimi için risk azaltma düzeylerini ve termal puanları denetleyebilirsiniz. Ayrıca hangi çevre birimlerinin etkin olarak gizlenmekte olan risk azaltmalarını izleyebilirsiniz.

Başka bir cihazdan risk azaltma düzeylerini ve termal puanları izlemek/test etmek için REST API'lerinden de yararlanabilirsiniz. Cihaz Portalı API Başvurusu'nda daha fazla bilgi bulunabilir