Bagikan melalui


Mengelola daya dan termal

Ketika HoloLens 2 berjalan di lingkungan yang hangat atau dengan persyaratan performa yang berat (penggunaan CPU/GPU, penggunaan periferal, dll.), mungkin cukup panas sehingga mengambil tindakan secara otomatis untuk menjaga dirinya dari panas berlebih. Tindakan ini akan mencakup hal-hal seperti:

  • Menyesuaikan performa pengisian daya
  • Memberikan umpan balik pengguna
  • Menutup aplikasi

... dan dalam skenario terburuk:

  • Mematikan HoloLens 2

Jika aplikasi Anda menuntut performa periferal yang tinggi, pertimbangkan untuk menggunakan PowerThermalNotification Software Development Kit (SDK) untuk berlangganan peristiwa pemberitahuan dan menerapkan tindakan kustom Anda sendiri. Melakukannya dapat memungkinkan perangkat untuk beroperasi lebih lama dalam situasi ketika jika tidak, aplikasi dapat dihentikan oleh sistem.

Catatan

Dukungan untuk Microsoft.MixedReality.PowerThermalNotification SDK disertakan dalam rilis 22H1.

Artikel ini menjelaskan PowerThermalNotification SDK dan penggunaan dasarnya untuk memulai.

Di mana saya bisa mendapatkan SDK?

PowerThermalNotification SDK dapat diunduh melalui Mixed Reality Feature Tool.

PowerThermalNotification SDK mendukung proyeksi bahasa untuk C# dan C++, memungkinkan pengembang mengembangkan aplikasi untuk platform Win32 atau UWP.

Ringkasan konseptual

Daya yang dikonsumsi oleh HoloLens 2 hilang dalam panas. Perangkat PC tradisional akan memiliki kipas untuk mengatasinya, tetapi perangkat yang dapat dipakai harus ringan. Karena itu, solusi pendinginan lebih kompleks. HoloLens 2 memiliki fitur keamanan perangkat keras dan perangkat lunak bawaan untuk memastikan bahwa headset tidak terlalu panas bagi pengguna, tetapi fitur-fitur ini juga harus seimbang dengan pengalaman pengguna. Misalnya, jika kita tahu bagian mana dari HoloLens 2 yang sedang dipanaskan, kita dapat memilih untuk membatasi periferal yang bertanggung jawab atas panas ini. Sebagai upaya terakhir, kita mungkin menutup aplikasi yang dianggap bertanggung jawab atas kekuatan yang menyebabkan panas ini.

HoloLens 2 menangani masalah panas dengan menggunakan sensor suhu. Kerangka kerja termal mengikat grup sensor ke periferal yang berbeda pada perangkat. Sensor dikelompokkan karena mungkin tidak mungkin untuk menentukan periferal mana di area fisik yang bertanggung jawab atas daya yang memanaskan HoloLens 2.

PowerThermalNotification SDK memaparkan API yang diperlukan untuk memantau grup sensor ini. Peristiwa SDK diaktifkan ketika periferal yang digunakan oleh aplikasi menunjukkan tanda-tanda bahwa mitigasi mungkin diperlukan. Aplikasi kemudian dapat menyesuaikan pengalaman pelanggannya untuk mengurangi dampak termal. Mengurangi dampak berarti lebih sedikit risiko tindakan sistem seperti pematian aplikasi atau perangkat.

Contoh sederhana adalah aplikasi yang menggunakan CPU untuk memproses sejumlah besar data video. Aplikasi dapat berlangganan pemberitahuan performa untuk komponen CPU. Ketika aplikasi menerima pemberitahuan, aplikasi dapat mengurangi beban kerja CPU. Jika peristiwa lain diterima yang menunjukkan tidak ada mitigasi lebih lanjut yang diperlukan, beban kerja CPU dapat dipulihkan.

Respons platform

Tabel berikut adalah perincian tindakan sistem berdasarkan periferal. Tindakan yang dijelaskan di bawah ini dapat ditekan menggunakan SDK. Lihat Menekan Mitigasi Sistem Default

Periferal MinimumUserImpact MediumUserImpact MaximumUserImpact Resor Terakhir Pematian Perangkat Lunak Failsafe
GPU Batasi Kualitas
MRC Sesuaikan Interval VSYNC
Tampilan Pengurangan FPS Kedalaman
Periferal apa pun Tampilkan Peringatan
Tutup Aplikasi
Hentikan Pengambilan MRC
Pematian OS Pematian Perangkat Keras

Catatan

Tindakan di kolom "Upaya Terakhir", "Matikan Perangkat Lunak", dan "Failsafe" tidak dapat ditekan.

Saran untuk respons aplikasi

Berikut ini adalah perincian mitigasi yang disarankan yang dapat diambil aplikasi berdasarkan periferal mana yang memerlukan mitigasi. Terserah pengembang aplikasi untuk menentukan tindakan mana yang mungkin memiliki efek yang lebih signifikan pada setiap periferal karena setiap aplikasi berbeda. Pengembang harus memprioritaskan tindakan yang mereka ambil berdasarkan dampaknya kepada pengguna akhir.

Mitigasi yang disarankan oleh periferal

CPU

GPU

DRAM

Jaringan

Baterai

Tampilan

  • Menambah jumlah piksel hitam dalam adegan
  • Gunakan warna berdaya rendah (misalnya, hijau)
  • Redupkan tampilan

Kamera foto/video

  • Gambaran Umum
  • Kurangi resolusi kamera
  • Kurangi kecepatan bingkai kamera
  • Mengurangi aplikasi pasca-pemrosesan gambar kamera
  • Berhenti menggunakan kamera foto/video

Kasus penggunaan implementasi

SDK dirancang untuk mendukung dua kasus penggunaan standar untuk mendapatkan informasi:

  • Berbasis peristiwa
  • Berbasis polling

Pemberitahuan berbasis peristiwa akan memberikan jalur umpan balik tercepat ke aplikasi jika perlu mengambil tindakan. Namun, dalam beberapa kasus mungkin lebih nyaman bagi pengembang untuk menggunakan polling.

Catatan

Informasi status diperbarui, paling banyak, setiap beberapa detik untuk setiap periferal, sehingga polling lebih cepat daripada yang mungkin membuang siklus CPU.

Penggunaan API berbasis peristiwa

Mendaftar untuk acara

Untuk mendapatkan pemberitahuan, ada tiga persyaratan:

Anda tidak akan menerima peristiwa jika aplikasi Anda tidak memenuhi persyaratan ini.

Item pertama dapat diperiksa menggunakan fungsi IsSupported . Jika sistem mendukung pemberitahuan untuk setidaknya salah satu periferal dalam masker, fungsi akan mengembalikan true. Anda dapat memilih untuk tidak memeriksa dukungan menggunakan fungsi ini selama aplikasi Anda tidak secara eksplisit bergantung pada peristiwa PowerThermalNotification SDK.

Setelah memenuhi tiga persyaratan di atas, Anda akan menerima pemberitahuan awal untuk semua PeripheralsOfInterest yang didukung. Jika nanti Anda mengubah PeripheralsOfInterest atau salah satu penanganan aktivitas, Anda akan menerima serangkaian pemberitahuan lain berdasarkan status saat ini.

Berikut adalah cuplikan kode untuk mengambil instans kelas PowerThermalNotification dan mengonfigurasinya untuk pemberitahuan untuk PowerThermalPeripheralFlags.Cpu dan 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;
    }  
}

Menangani peristiwa

Ketika peristiwa PowerThermalMitigationLevelChanged diaktifkan, itu datang dengan PowerThermalEventArgs. Ini harus digunakan untuk memahami peristiwa.

Demikian pula, ketika peristiwa PowerThermalThermalScoreChanged diaktifkan, itu dilengkapi dengan PowerThermalScoreArgs.

Ketika peristiwa diterima, penanganan aktivitas harus memeriksa argumen. ImpactedPeripherals, yang mengidentifikasi periferal mana yang terkena dampak (mungkin ada lebih dari satu).

Untuk peristiwa PowerThermalMitigationLevelChanged , argumen. MitigationLevel menunjukkan seberapa parah mitigasi direkomendasikan untuk periferal yang ditentukan. Jika args. MitigationLevel adalah PowerThermalMitigationLevel.NoUserImpact maka setiap mitigasi yang terkait dengan periferal yang ditentukan harus dihapus.

Untuk peristiwa PowerThermalThermalScoreChanged , argumen. ThermalScore menunjukkan skor dari 100 hingga 0 yang mencerminkan skala linier mendekati peristiwa pematian aplikasi (nol). Rentang Skor Termal dimulai di luar rentang pelaporan mitigasi untuk memungkinkan pemberitahuan sebelumnya ke aplikasi saat mendekati kebutuhan mitigasi.

Berikut adalah contoh handler:

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

Catatan

Parameter Args ImpactedPeripherals hanya mengidentifikasi periferal yang terkena dampak dan bagian dari PeripheralsOfInterest. Periferal lain yang terkena dampak yang tidak termasuk dalam PeripheralsOfInterest tidak akan diidentifikasi.

Catatan

Tingkat mitigasi untuk periferal memiliki histeresis. Setelah level meningkat, level tidak berkurang sampai dirilis. Rilis adalah peristiwa dengan argumen. MitigationLevel diatur ke PowerThermalMitigationLevel.NoUserImpact.

Menggabungkannya (model berbasis peristiwa)

Berikut adalah contoh sederhana dari sekumpulan skrip yang dapat digunakan di Unity untuk mengaktifkan fungsionalitas ini. Kelas NotificationComponent dapat ditambahkan ke objek game apa pun dan objek game tersebut dapat melacak tingkat mitigasi periferal yang ditetapkan. Kelas NotificationManager berkaitan dengan SDK yang mengelola langganan melalui instans tunggal kelas PowerThermalNotification .

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

Berikut adalah kelas 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);
    }

}

Penggunaan API berbasis polling

Memperbarui periferal yang menarik

Mirip dengan penggunaan berbasis peristiwa, mengatur properti PeripheralsOfInterest diperlukan untuk melakukan polling periferal tertentu.

Peringatan

Jika Anda mencoba memanggil GetLastPeripheralState untuk periferal tertentu tanpa terlebih dahulu mengatur bendera tersebut di PeripheralsOfInterest, pengecualian akan dilemparkan. Demikian pula, jika Anda mencoba menggunakan GetLastPeripheralState dengan nilai yang tidak valid (beberapa bit bendera ditetapkan, atau bit yang tidak didukung), pengecualian akan dilemparkan.

Memanggil API polling

Setelah PeripheralsOfInterest memiliki set bit periferal yang ingin Anda jajaki, Anda dapat memanggil GetLastPeripheralState.

PowerThermalPeripheralState yang dikembalikan berisi nilai terbaru untuk Skor Termal dan Tingkat Mitigasi untuk periferal yang diberikan.

Catatan

Ada kemungkinan bahwa di platform mendatang, periferal tertentu mungkin tidak didukung. Dalam kasus ini API akan mengembalikan Skor Termal 100 dan Tingkat Mitigasi NoUserImpact. Aplikasi dapat memeriksa bidang struktur IsSupportedPeripheral untuk memeriksa apakah ini adalah kasus untuk periferal tertentu atau tidak.

Lihat Menangani Peristiwa untuk detail tentang penanganan Skor Termal dan MitigationLevel yang dikembalikan oleh PowerThermalPeripheralState.

Berikut adalah cuplikan kecil yang menunjukkan polling:

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

Menekan mitigasi sistem default

Jika Anda tidak ingin sistem mencoba mengurangi periferal tertentu, Anda dapat menekannya. Untuk melakukan ini, cukup perbarui properti SuppressedPlatformMitigationForPeripherals , atau panggil fungsi SuppressPlatformMitigation .

Berikut cuplikan kecilnya:

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

Catatan

API supresi hanya akan berfungsi jika proses menggunakan kelas PowerThermalNotification berada di latar depan. Proses latar belakang masih dapat berlangganan peristiwa tetapi mungkin tidak menonaktifkan tindakan HoloLens 2.

Pengujian

Setelah mengintegrasikan SDK ke dalam aplikasi, Anda harus mengujinya. Untuk HoloLens 2 sistem operasi yang mendukung SDK, halaman pengembang akan tersedia di Portal Perangkat. Dari halaman ini, Anda dapat mengontrol tingkat mitigasi dan skor termal untuk setiap periferal. Anda juga dapat memantau periferal mana yang memiliki mitigasi yang ditekan secara aktif.

Anda juga dapat memanfaatkan REST API untuk memantau/menguji tingkat mitigasi dan skor termal dari perangkat lain. Informasi selengkapnya dapat ditemukan di Referensi API Portal Perangkat