Compute Pressure API

از فشار محاسباتی سیستم خود مطلع شوید.

کنت کریستینسن
Kenneth Christiansen
Arnaud (Arno) Mandy

Compute Pressure API حالت های سطح بالایی را ارائه می دهد که نشان دهنده فشار روی سیستم است. این به پیاده‌سازی اجازه می‌دهد تا از معیارهای سخت‌افزاری زیربنایی درست استفاده کند تا اطمینان حاصل شود که کاربران می‌توانند تا زمانی که سیستم تحت فشار غیرقابل مدیریتی قرار نگیرد، از تمام قدرت پردازشی در دسترس خود استفاده کنند.

وضعیت فعلی

مرحله وضعیت
1. توضیح دهنده ایجاد کنید کامل
2. پیش نویس اولیه مشخصات را ایجاد کنید کامل
3. جمع آوری بازخورد و تکرار در طراحی در حال انجام است
4. آزمایش مبدا کامل
5. راه اندازی کنید کامل (Chrome 125)

Compute Pressure API را امتحان کنید

برای آزمایش با Compute Pressure API به صورت محلی، این صفحه را بخوانید.

برای آزمایش اولیه ثبت نام کنید

از Chrome 115، Compute Pressure API به صورت آزمایشی اصلی در دسترس است. انتظار می رود در کروم 123 (29 مه 2024) به پایان برسد. برای آزمایش اصلی ثبت نام کنید .

موارد استفاده

موارد استفاده اولیه افزایش یافته توسط Compute Pressure API فعلی کنفرانس ویدیویی و بازی های ویدیویی است.

این برنامه‌های محبوب بلادرنگ به عنوان نرم‌افزار طبقه‌بندی می‌شوند. به این معنا که اگر سیستم فراتر از حالت‌های خاص اعمال شود، کیفیت خدمات کاهش می‌یابد، اما منجر به خرابی کامل سیستم نمی‌شود. این برنامه‌های نرم‌افزار بلادرنگ از اینکه می‌توانند بار کاری خود را بر اساس مصرف یا فشار CPU تطبیق دهند، بسیار سود می‌برند.

به طور خاص، اولین نسخه از این API با هدف فعال کردن تصمیمات سازگاری زیر است.

ویدئو کنفرانس

  • تعداد فیدهای ویدیویی را که در طول تماس با بسیاری از شرکت کنندگان به طور همزمان نشان داده می شوند، تنظیم کنید.
  • کاهش کیفیت پردازش ویدیو (رزولوشن ویدیو، فریم در ثانیه).
  • از پردازش غیرضروری ویدیو، مانند برخی از فیلترهای دوربین صرفنظر کنید.
  • پردازش غیرضروری صدا، مانند سرکوب نویز WebRTC را غیرفعال کنید.
  • دکمه‌های کیفیت در مقابل سرعت و اندازه در مقابل سرعت را به سمت «سرعت» در رمزگذاری ویدیو و صدا (در WebRTC، WebCodecs یا رمزگذاری نرم‌افزار) بچرخانید.

بازی های ویدیویی

  • برای ساختن ویدیوی بازی (مدل های سه بعدی، بافت ها، سایه بان ها) و صدا (صداها، جلوه های صوتی) از دارایی های با کیفیت پایین تر استفاده کنید.
  • افکت‌هایی را که منجر به جزئیات غیر ضروری کمتر واقعی می‌شوند (آب، پارچه، انیمیشن‌های آتش، درخشندگی پوست، جلوه‌های خیره کننده یا شبیه‌سازی‌های فیزیکی که بر گیم‌پلی تأثیر نمی‌گذارند) غیرفعال کنید.
  • دکمه های کیفیت در مقابل سرعت را در موتور رندر بازی (کیفیت سایه ها، فیلتر بافت، فاصله مشاهده) تغییر دهید.

از نظر فنی، اینها را می‌توان با دانستن وضعیت‌های حرارتی (مثلاً آیا سیستم به صورت غیرفعال خنک می‌شود) و فشار CPU برای رشته اصلی و کارگرانی که سایت استفاده می‌کند، انجام داد. وضعیت حرارتی سیستم یک حالت جهانی است و می تواند توسط برنامه ها و سایت هایی غیر از سایت مشاهده کننده تحت تأثیر قرار گیرد.

رابط ها

Compute Pressure API را می توان در زمینه های زیر اجرا کرد:

  • پنجره یا موضوع اصلی
  • کارگر فداکار
  • کارگر مشترک

Compute Pressure API دو رابط جدید را تعریف می کند.

PressureObserver : شیئی برای مشاهده فشار محاسباتی هر تعداد منبع در یک بازه نمونه از پیش تعریف شده. اولین تکرار در Chromium "cpu" را به عنوان source نمایش می دهد. برای جزئیات بیشتر به بخش مربوط به پارامترها مراجعه کنید. هر ناظر می تواند به طور ناهمزمان روند تغییرات فشار را در یک سیستم مشاهده کند.

PressureRecord : روند فشار را در یک لحظه خاص از انتقال توصیف می کند. اشیاء از این نوع را فقط می توان به دو روش به دست آورد: به عنوان ورودی برای پاسخ به تماس PressureObserver شما، یا با فراخوانی متد takeRecords() در نمونه PressureObserver .

PressureObserver

هنگامی که یک شی PressureObserver ایجاد می شود، پیکربندی می شود تا فشار منابع پشتیبانی شده را در یک بازه زمانی مشخص مشاهده کند. منابع پشتیبانی شده را می توان در هر زمانی در طول عمر شی PressureObserver به صورت جداگانه مشاهده یا مشاهده نکرد. فاصله نمونه پس از ایجاد شی قابل تغییر نیست.

سازنده

PressureObserver(callback) : یک شیء PressureObserver جدید ایجاد می کند که وقتی تشخیص می دهد که تغییری در مقادیر منبع مشاهده شده اتفاق افتاده است، یک تابع بازخوانی مشخص را فراخوانی می کند.

سازنده یک تابع فراخوانی اجباری می گیرد.

پاسخ به تماس

callback() : callback با آرایه ای از اشیاء خوانده نشده PressureRecord فراخوانی می شود.

روش ها

PressureObserver.observe(source, options) : به "PressureObserver" می گوید که کدام منبع را مشاهده کند و options اختیاری را به عنوان پارامتر.

گزینه ها

PressureObserverOptions : شامل فاصله زمانی نمونه، sampleInterval بر حسب میلی ثانیه، که در آن کاربر درخواست به روز رسانی می کند.

PressureObserver.unobserve(source) : به «PressureObserver» می‌گوید که مشاهده یک منبع را متوقف کند.

PressureObserver.disconnect() : به 'PressureObserver' می گوید که مشاهده همه منابع را متوقف کند.

PressureObserver.takeRecords() : دنباله ای از رکوردها را از زمان آخرین فراخوانی برگشتی برمی گرداند.

static PressureObserver.knownSources() (فقط خواندنی): انواع منبع شناخته شده عامل کاربر را به ترتیب حروف الفبا برگردانید.

پارامترها

source : منبعی که باید مشاهده شود، به عنوان مثال "cpu" . این باید یکی از انواع منبع پشتیبانی شده باشد.

در نسخه فعلی Compute Pressure، فقط "cpu" پشتیبانی می شود.

ثبت فشار

رابط PressureRecord از Compute Pressure API روند فشار یک منبع را در یک لحظه خاص از انتقال توصیف می کند.

ویژگی های نمونه

PressureRecord.source (فقط خواندنی): رشته ای را نشان می دهد که منبع مبدا را که رکورد از آن می آید، نشان می دهد.

PressureRecord.state (فقط خواندنی): رشته ای را نشان می دهد که وضعیت فشار ثبت شده را نشان می دهد.

PressureRecord.time (فقط خواندنی): عددی را برمی‌گرداند که نشان‌دهنده یک مهر زمانی با وضوح بالا است.

نمونه ها

بخش‌های زیر نمونه‌هایی از کاربرد را فهرست می‌کنند.

پشتیبانی API را تعیین کنید

if ('PressureObserver' in globalThis) {
  // The Compute Pressure API is supported.
}

یک ناظر فشار ایجاد کنید

مشاهده‌گر فشار را با فراخوانی سازنده آن با یک تابع تماس ایجاد کنید تا هر زمان که یک به‌روزرسانی فشار وجود دارد اجرا شود:

const observer = new PressureObserver((records) => {
  /* ... */
});

استفاده از ناظر فشار

تنها یک راه برای راه اندازی ناظر فشار وجود دارد. برای هر منبع، observer.observe(source) را فراخوانی کنید.

observer.observe("cpu" { sampleInterval: 2_000 });

در این مثال "cpu" منبع فشاری است که ما به آن علاقه مندیم. در حال حاضر، تنها منبع موجود است. در آینده، ممکن است منابع دیگری مانند "gpu" ، "power" یا "thermals" وجود داشته باشد.

فاصله زمانی نمونه، sampleInterval ، 2000 میلی‌ثانیه، به این معنی است که حداکثر هر دو ثانیه یک بار به‌روزرسانی می‌شود.

اگر بازه نمونه درخواستی توسط سیستم قابل ارائه نباشد، سیستم نمونه ها را در بهترین فاصله زمانی مناسب ارائه می دهد. به عنوان مثال، اگر فاصله 2000 میلی ثانیه درخواست شود، اما سیستم فقط بتواند نمونه هایی را در حداکثر 1000 میلی ثانیه ارائه دهد، 1000 میلی ثانیه انتخاب می شود.

برای توقف مشاهده منبع، از متد unobserve() مانند مثال زیر استفاده کنید:

observer.unobserve('cpu');

برای اینکه همه منابع را به یکباره مشاهده نکنید، از متد disconnect() مانند مثال زیر استفاده کنید:

observer.disconnect();

سوابق فشار را بازیابی کنید

رکوردهای فشار را می توان با یک تابع فراخوانی بازیابی کرد، که هر بار که تغییری در وضعیت فشار اتفاق می افتد فراخوانی می شود.

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

کاربر همچنین می تواند با فراخوانی متد takeRecords() خواندن PressureRecord مجبور کند.

متد takeRecords() واسط PressureObserver آرایه ای از اشیاء PressureRecords ذخیره شده در ناظر فشار را برمی گرداند و آن را خالی می کند.

متداول‌ترین مورد استفاده برای این کار این است که بلافاصله تمام رکوردهای فشار معلق را که هنوز توسط عملکرد برگشت تماس ناظر پردازش نشده‌اند، قبل از قطع ارتباط مشاهده‌گر، واکشی می‌کنیم، به طوری که هنگام خاموش کردن ناظر، می‌توان تمام رکوردهای معلق را پردازش کرد.

با فراخوانی این روش، فهرست سوابق معلق پاک می‌شود، بنابراین تماس برگشتی اجرا نمی‌شود.

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

بازخورد خود را به اشتراک بگذارید

آیا چیزی در مورد API وجود دارد که آنطور که انتظار داشتید کار نمی کند؟ آیا روش یا ویژگی گم شده ای برای استفاده خود از API می بینید؟ در مخزن GitHub مربوطه، یک مشکل مشخصات یا نظر در مورد یک موجود را ثبت کنید.

گزارش مشکل در اجرا

آیا با اجرای Chromium اشکالی پیدا کردید؟ یا اجرا با مشخصات متفاوت است؟ یک اشکال را در new.crbug.com ثبت کنید. اطمینان حاصل کنید که تا جایی که می توانید جزئیات، دستورالعمل های بازتولید را وارد کنید و Blink>PerformanceAPIs>ComputePressure را در کادر Components وارد کنید.

منابع