Dapatkan informasi tentang tekanan komputasi sistem Anda.
Compute Pressure API menawarkan status level tinggi yang mewakili tekanan pada sistem. Solusi ini memungkinkan implementasi untuk menggunakan metrik hardware dasar yang tepat untuk memastikan pengguna dapat memanfaatkan semua daya pemrosesan yang tersedia selama sistem tidak berada dalam tekanan yang tidak terkendali.
Status saat ini
Langkah | Status |
---|---|
1. Buat pesan penjelasan | Selesai |
2. Membuat draf awal spesifikasi | Selesai |
3. Mengumpulkan masukan & mengulangi desain | Dalam proses |
4. Uji coba origin | Selesai |
5. Peluncuran | Selesai (Chrome 125) |
Mencoba Compute Pressure API
Untuk bereksperimen dengan Compute Pressure API secara lokal, baca halaman ini.
Mendaftar ke uji coba origin
Mulai Chrome 115, Compute Pressure API tersedia sebagai uji coba origin. Update ini diperkirakan akan berakhir di Chrome 123 (29 Mei 2024). Daftar ke uji coba origin.
Kasus penggunaan
Kasus penggunaan utama yang ditingkatkan oleh Compute Pressure API saat ini adalah konferensi video dan video game.
Aplikasi real-time populer ini diklasifikasikan sebagai soft. Artinya, kualitas layanan akan menurun jika sistem dijalankan di luar status tertentu, tetapi tidak menyebabkan kegagalan sistem total. Aplikasi soft real-time ini sangat diuntungkan karena dapat menyesuaikan workload berdasarkan konsumsi atau tekanan CPU.
Secara khusus, versi pertama API ini bertujuan untuk memungkinkan keputusan adaptasi berikut.
Konferensi video
- Sesuaikan jumlah feed video yang ditampilkan secara bersamaan selama panggilan dengan banyak peserta.
- Mengurangi kualitas pemrosesan video (resolusi video, frame per detik).
- Lewati pemrosesan video yang tidak penting, seperti beberapa filter kamera.
- Nonaktifkan pemrosesan audio yang tidak penting, seperti peredam bising WebRTC.
- Ubah tombol kualitas, kecepatan, dan kecepatan ke arah "kecepatan" dalam encoding video dan audio (di WebRTC, WebCodecs, atau encoding software).
Game video
- Gunakan aset berkualitas lebih rendah untuk menyusun video game (model 3D, tekstur, shader) dan audio (suara, efek suara).
- Nonaktifkan efek yang menghasilkan detail yang kurang realistis (air, kain, animasi api, luminans kulit, efek silau, atau simulasi fisik yang tidak memengaruhi gameplay).
- Sesuaikan tombol kecepatan dengan kualitas vs. kecepatan di mesin rendering game (kualitas bayangan, pemfilteran tekstur, jarak tampilan).
Secara teknis, hal ini dapat dicapai dengan mengetahui termal (misalnya, apakah sistem didinginkan secara pasif) dan status tekanan CPU untuk thread utama dan pekerja yang digunakan situs. Status termal sistem adalah status global dan dapat dipengaruhi oleh aplikasi dan situs selain situs yang mengamati.
Antarmuka
Compute Pressure API dapat dijalankan dalam konteks berikut:
- Jendela atau thread utama
- Pekerja Khusus
- Pekerja Bersama
Compute Pressure API menentukan dua antarmuka baru.
PressureObserver
: Objek untuk mengamati tekanan komputasi sejumlah
sumber pada interval sampel yang telah ditentukan. Iterasi pertama di Chromium mengekspos
"cpu"
sebagai source
. Lihat bagian tentang parameter untuk mengetahui detail selengkapnya. Setiap observer dapat secara asinkron mengamati tren perubahan tekanan dalam
sistem.
PressureRecord
: Menjelaskan tren tekanan pada momen transisi tertentu. Objek jenis ini hanya dapat diperoleh dengan dua cara: sebagai input
untuk callback PressureObserver Anda, atau dengan memanggil metode takeRecords()
pada
instance PressureObserver
.
PressureObserver
Saat dibuat, objek PressureObserver
akan dikonfigurasi untuk mengamati
tekanan sumber yang didukung, pada interval sampel tertentu. Sumber yang didukung
dapat diamati satu per satu atau tidak diamati kapan saja selama masa aktif
objek PressureObserver
. Interval sampel tidak dapat diubah setelah objek dibuat.
Konstruktor
PressureObserver(callback)
: Membuat objek PressureObserver
baru yang akan
memanggil fungsi callback yang ditentukan saat mendeteksi bahwa perubahan nilai
sumber yang diamati telah terjadi.
Konstruktor menggunakan fungsi callback wajib.
Telepon Balik
callback()
: Callback dipanggil dengan array objek PressureRecord
yang belum dibaca.
Metode
PressureObserver.observe(source, options)
: Memberi tahu 'PressureObserver' sumber
mana yang akan diamati dan options
opsional, sebagai parameter.
Opsi
PressureObserverOptions
: Berisi interval sampel, sampleInterval
dalam
milidetik, saat pengguna meminta update.
PressureObserver.unobserve(source)
: Memberi tahu 'PressureObserver' untuk berhenti
mengamati sebuah sumber.
PressureObserver.disconnect()
: Memberi tahu 'PressureObserver' untuk berhenti mengamati
semua sumber.
PressureObserver.takeRecords()
: Menampilkan urutan data, sejak pemanggilan callback terakhir.
static PressureObserver.knownSources()
(hanya baca): Menampilkan jenis sumber yang diketahui milik agen pengguna dalam urutan abjad.
Parameter
source
: Sumber yang akan diamati, misalnya "cpu"
. Ini harus berupa salah satu
jenis sumber yang didukung.
Dalam versi Compute Pressure saat ini, hanya "cpu"
yang didukung.
PressureRecord
Antarmuka PressureRecord
Compute Pressure API menjelaskan tren tekanan sumber pada momen transisi tertentu.
Properti Instance
PressureRecord.source
(Hanya baca): Menampilkan string yang mewakili sumber asal tempat data berasal.
PressureRecord.state
(Hanya baca): Menampilkan string yang mewakili status tekanan yang direkam.
PressureRecord.time
(Hanya baca): Menampilkan angka yang mewakili stempel waktu resolusi tinggi.
Contoh
Bagian berikut mencantumkan contoh penggunaan contoh.
Menentukan dukungan API
if ('PressureObserver' in globalThis) {
// The Compute Pressure API is supported.
}
Membuat observer tekanan
Buat observer tekanan dengan memanggil konstruktornya beserta fungsi callback yang akan dijalankan setiap kali ada pembaruan tekanan:
const observer = new PressureObserver((records) => {
/* ... */
});
Penggunaan observer tekanan
Hanya ada satu cara untuk memulai pengamat tekanan. Untuk setiap sumber, panggil
observer.observe(source)
.
observer.observe("cpu" { sampleInterval: 2_000 });
Dalam contoh ini, "cpu"
adalah sumber tekanan yang kita minati. Untuk
sekarang, ini adalah satu-satunya sumber yang tersedia. Pada masa mendatang, mungkin ada sumber lain
seperti "gpu"
, "power"
, atau "thermals"
.
Interval sampel, sampleInterval
, sebesar 2000 md, berarti akan ada
pembaruan maksimal setiap dua detik.
Jika interval sampel yang diminta tidak dapat dilayani oleh sistem, sistem akan memberikan sampel pada interval yang paling sesuai yang ada. Misalnya, jika interval 2.000 md diminta, tetapi sistem hanya dapat memberikan sampel pada waktu maksimum 1.000 md, maka 1.000 md akan dipilih.
Untuk berhenti mengamati sumber, gunakan metode unobserve()
, seperti pada contoh
berikut:
observer.unobserve('cpu');
Untuk tidak mengamati semua sumber sekaligus, gunakan metode disconnect()
, seperti dalam
contoh berikut:
observer.disconnect();
Mengambil catatan tekanan
Catatan tekanan dapat diambil dengan fungsi callback, yang akan dipanggil setiap kali perubahan terjadi dalam status tekanan.
function callback(records) {
const lastRecord = records[records.length - 1];
console.log(`Current pressure ${lastRecord.state}`);
if (lastRecord.state === 'critical') {
// Reduce workers load by 4.
} else if (lastRecord.state === 'serious') {
// Reduce workers load by 2.
} else {
// Do not reduce.
}
}
const observer = new PressureObserver(callback);
await observer.observe('cpu', { sampleInterval: 1_000 });
Pengguna juga dapat memaksa pembacaan PressureRecord
dengan memanggil metode takeRecords()
.
Metode takeRecords()
dari antarmuka PressureObserver
menampilkan array objek PressureRecords
yang disimpan dalam observer tekanan, yang mengosongkannya.
Kasus penggunaan yang paling umum untuk hal ini adalah segera mengambil semua rekaman tekanan yang tertunda, yang belum diproses oleh fungsi callback observer, sebelum memutuskan hubungan observer, sehingga setiap kumpulan data yang tertunda dapat diproses saat mematikan observer.
Memanggil metode ini akan menghapus daftar data yang tertunda, sehingga callback tidak akan dijalankan.
const observer = new PressureObserver((records) => {
/* Do something with records. */
});
await observer.observe('cpu', { sampleInterval: 1_000 });
setTimeout(() => {
// Forced records reading.
const records = observer.takeRecords();
observer.disconnect();
// Do something with last records if any.
}, 2000);
Bagikan masukan
Apakah ada sesuatu pada API yang tidak berfungsi seperti yang Anda harapkan? Apakah Anda melihat metode atau properti yang hilang untuk penggunaan API? Laporkan masalah spesifikasi atau komentari yang sudah ada di repo GitHub yang sesuai.
Melaporkan masalah terkait penerapan
Apakah Anda menemukan bug pada implementasi Chromium? Atau apakah implementasinya berbeda dengan spesifikasi? Laporkan bug di new.crbug.com. Pastikan Anda menyertakan detail sebanyak mungkin, petunjuk untuk mereproduksi, dan masukkan Blink>PerformanceAPIs>ComputePressure di kotak Components.