ממשק API של Compute Pressure

קבלת מידע לגבי לחץ המחשוב של המערכת.

Kenneth Christiansen
Kenneth Christiansen
Arnaud (Arno) Mandy

ה-Compute Pressure API מציע מצבים ברמה גבוהה שמייצגים את הלחץ על המערכת. היא מאפשרת ליישום להשתמש במדדי החומרה הבסיסיים כדי להבטיח שהמשתמשים יוכלו לנצל את כל כוח העיבוד הזמין להם, כל עוד המערכת לא נמצאת בלחץ שלא ניתן לנהל.

הסטטוס הנוכחי

שלב סטטוס
1. יצירת הסבר הושלם
2. יצירת טיוטה ראשונית של מפרט הושלם
3. אוספים משוב וחוזרים על העיצוב בתהליך
4. גרסת מקור לניסיון התשובה מלאה
5. הפעלה הושלם (Chrome 125)

אני רוצה לנסות את Compute Pressure API

כדי להתנסות באופן מקומי ב-Compute Pressure API, יש לקרוא את הדף הזה.

הרשמה לגרסת המקור לניסיון

החל מגרסה 115 של Chrome, Compute Pressure API זמין כגרסת מקור לניסיון. הוא צפוי להסתיים בגרסה 123 של Chrome (29 במאי 2024). להרשמה

תרחישים לדוגמה

התרחישים לדוגמה העיקריים שמשופרים על ידי ה-Compute Pressure API הנוכחי הם שיחות ועידה בווידאו ומשחקי וידאו.

האפליקציות הפופולריות האלה בזמן אמת מסווגות כרכות. כלומר, איכות השירות תיפגע אם המערכת תפעל מחוץ למצבים מסוימים, אבל לא תגרום לכשל מוחלט של המערכת. האפליקציות הרכות האלה בזמן אמת מפיקות תועלת רבה מהיכולת להתאים את עומסי העבודה שלהן לצריכה או ללחץ של המעבד (CPU).

בפרט, המטרה של הגרסה הראשונה של ה-API הזה היא לאפשר את ההחלטות הבאות לגבי התאמות.

שיחת ועידה בווידאו

  • שינוי המספר של שידורי הווידאו שמוצגים בו-זמנית במהלך שיחות עם הרבה משתתפים.
  • הפחתת האיכות של עיבוד הווידאו (רזולוציית הסרטון, פריימים לשנייה).
  • מדלגים על עיבוד וידאו לא חיוני, כמו פילטרים מסוימים במצלמה.
  • השבתת עיבוד אודיו לא חיוני, כמו ביטול רעשים ב-WebRTC.
  • אפשר לשנות את מהירות החיבור בין מהירות ביחס למהירות או ביחס לגודל מהירות בקידוד וידאו ואודיו (ב-WebRTC, ב-WebCodec או בקידוד התוכנה).

משחקי וידאו

  • כדאי להשתמש בנכסים באיכות נמוכה יותר כדי להרכיב סרטון של המשחק (דגמים תלת-ממדיים, טקסטורות, תוכנות הצללה) ואודיו (קולות, אפקטים קוליים).
  • השבתת אפקטים שגורמים לפרטים פחות מציאותיים לא חיוניים (כמו מים, בד, אנימציות של אש, ברק העור, אפקטים של ברק או סימולציות פיזיות שלא משפיעים על מהלך המשחק).
  • יש לשנות את הלחצנים של איכות לעומת מהירות במנוע הרינדור של המשחק (איכות הצלליות, סינון המרקם, הצגת המרחק).

מבחינה טכנית אפשר לדעת את הטמפרטורות התרמיות (למשל, אם המערכת מקררת באופן פסיבי) ומצבי הלחץ של המעבד (CPU) ב-thread הראשי ובעובדים באתר. המצב התרמי של המערכת הוא מצב גלובלי שיכול להיות מושפע מאפליקציות ומאתרים שהם לא האתר הגלוי.

ממשקים

אפשר להריץ את Compute Pressure API בהקשרים הבאים:

  • חלון או thread ראשי
  • עובד ייעודי
  • עובד משותף

Compute Pressure API מגדיר שני ממשקים חדשים.

PressureObserver: אובייקט לבדיקת לחץ המחשוב של מספר מקורות כלשהו במרווח דגימה מוגדר מראש. איטרציה ראשונה ב-Chromium חושפת את "cpu" בתור source. בקטע על פרמטרים תוכלו לקרוא פרטים נוספים. כל צופה יכול לראות באופן אסינכרוני מגמות של שינויי לחץ במערכת.

PressureRecord: תיאור מגמת הלחץ ברגע ספציפי של מעבר. ניתן לקבל אובייקטים מהסוג הזה רק בשתי דרכים: כקלט להתקשרות חזרה של לחץureObserver, או על ידי קריאה לשיטה takeRecords() במכונה PressureObserver.

PressureObserver

כשיוצרים אובייקט PressureObserver, הוא מוגדר לעקוב אחר הלחץ של מקורות נתמכים במרווח דגימה נתון. בכל שלב במהלך משך החיים של האובייקט PressureObserver אפשר לראות את המקורות הנתמכים בנפרד, או לא לשמור אותם. לא ניתן לשנות את מרווח הדגימה לאחר יצירת האובייקט.

יצרן

PressureObserver(callback, options): הפונקציה יוצרת אובייקט PressureObserver חדש שיפעיל פונקציית קריאה חוזרת שצוינה, כשהיא מזהה שהתרחש שינוי בערכים של המקור שגלוי.

ה-constructor מקבל פונקציית callback חיונית ואפשרויות אופציונליות, כפרמטרים.

התקשרות חזרה

callback(): הקריאה החוזרת מתבצעת עם מערך של אובייקטים מסוג PressureRecord שלא נקראו.

אפשרויות

PressureObserverOptions: מכיל את המרווח לדוגמה,sampleInterval באלפיות השנייה, שבו המשתמש מבקש עדכונים.

שיטות

PressureObserver.observe(source): מורה ל-'pressureObserver' איזה מקור לצפות.

PressureObserver.unobserve(source): מורה ל-' pressureObserver' להפסיק לצפות במקור.

PressureObserver.disconnect(): מורה ל-'pressureObserver' להפסיק לצפות בכל המקורות.

PressureObserver.takeRecords(): מחזירה רצף של רשומות, מאז הקריאה האחרונה של הקריאה החוזרת (callback).

static PressureObserver.supportedSources() (לקריאה בלבד): הצגת סוגי מקור נתמכים לפי החומרה.

פרמטרים

source: המקור שיש לבדוק, לדוגמה "cpu". המקור חייב להיות אחד מסוגי המקורות הנתמכים.

בגרסה הנוכחית של לחץ Compute, יש תמיכה רק ב-"cpu".

PressureRecord

בממשק PressureRecord של Compute Pressure API מתוארת מגמת הלחץ על מקור ברגע ספציפי של מעבר.

מאפייני המכונה

PressureRecord.source (לקריאה בלבד): מחזירה מחרוזת שמייצגת את מקור המקור שממנו הרשומה מגיעה.

PressureRecord.state (לקריאה בלבד): מחזירה מחרוזת שמייצגת את מצב הלחץ שתועד.

PressureRecord.time (לקריאה בלבד): מחזירה מספר שמייצג חותמת זמן ברזולוציה גבוהה.

דוגמאות

האם יש תמיכה ב-Compute Pressure API?

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

יצירת צופה בלחץ

כדי ליצור את צופה הלחץ, קוראים לבנאי שלו עם פונקציית קריאה חוזרת כך שתרוץ בכל פעם שיש עדכון לחץ:

const observer = new PressureObserver(
  (records) => { /* ... */ },
  { sampleInterval: 2000 }
);

המשמעות של מרווח דגימה, sampleInterval, של 2,000 אלפיות שנייה, תתבצע עדכונים לכל היותר כל שתי שניות.

אם המערכת לא יכולה להציג את מרווח הדגימה המבוקש. המערכת תספק דוגמאות במרווח הזמן המתאים ביותר שקיים. לדוגמה, במקרה שהתבקש המרווח של 2,000 אלפיות השנייה, אבל המערכת יכולה לספק רק דגימות של 1,000 אלפיות שנייה לכל היותר, ייבחר 1,000 אלפיות שנייה.

שימוש בצופה לחץ

יש רק דרך אחת להפעיל צופה בלחץ. לכל קריאה למקור observer.observe(source).

observer.observe("cpu");

בדוגמה הזו, "cpu" הוא מקור הלחץ שמעניין אותנו. כרגע זה המקור היחיד שזמין. בעתיד ייתכן שמקורות אחרים כמו "gpu", "power" או "thermals".

כדי להפסיק לעקוב אחר מקור, צריך להשתמש בשיטה 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, { sampleInterval: 1000 });
await observer.observe("cpu");

המשתמש יכול גם לאלץ את הקריאה של PressureRecord על ידי קריאה לשיטה takeRecords().

השיטה takeRecords() בממשק PressureObserver מחזירה מערך של PressureRecords אובייקטים המאוחסנים בצופה הלחץ, ומתרוקנת אותו.

התרחיש לדוגמה הנפוץ ביותר הוא אחזור מיידי של כל רשומות הלחץ הממתינות, שעדיין לא עובדו על ידי פונקציית הקריאה החוזרת של הצופה, לפני ניתוק הצופה, כדי שניתן יהיה לעבד רשומות בהמתנה בכיבוי הצופה.

קריאה לשיטה הזו מוחקת את רשימת הרשומות שבהמתנה, ולכן הקריאה החוזרת לא תתבצע.

const observer = new PressureObserver(
  (records) => { /* Do something with records. */ },
  { sampleInterval: 1000 }
);

await observer.observe("cpu");

setTimeout(() => {
  // Forced records reading.
  const records = observer.takeRecords();
  observer.disconnect();
  // Do something with last records if any.
}, 2000);

לספר לנו על עיצוב ה-API

האם יש משהו ב-API שלא פועל כצפוי? האם חסרים שיטה או מאפיין לשימוש ב-API? שלחו בעיה במפרט או הגיבו על בעיה קיימת במאגר GitHub המתאים.

דיווח על בעיה בהטמעה

האם מצאת באג בהטמעה של Chromium? או שההטמעה שונה מהמפרט? אפשר לדווח על באג בכתובת new.crbug.com. חשוב לכלול כמה שיותר פרטים, הוראות פשוטות לשחזור, ולהזין Blink>PerformanceAPIs>Compute Pressure בתיבה Components.

קישורים שימושיים