ניהול עיבוד

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

מתי צריך לטפל בזה

צריך לתקשר עם המערכת אם:

  • הוספת שיטות ל-Blockly שמשנות את צורת הבלוק.
  • הוספת שיטות ל-Blockly שמבוססות על נתוני גודל מעודכן או מיקום לגבי הבלוק.

איך זה עובד

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

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

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

  4. לעבד את הקבוצה (כעץ). כשמפעילים את הקריאה החוזרת (callback) של requestAnimationFrame, מערכת ניהול העיבוד מעבדת את כל הבלוקים בקבוצה, מבלוקים עלים ועד בלוקים של ערכי root. כך אפשר לוודא שלבלוקים הצאצאים יש מידע מדויק לגבי הגודל לפני שהם מעובדים, כדי שהבלוקים של ההורים יוכלו להימתח מסביב לילדים.

למה זה עובד

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

לדוגמה, הוספת בלוק אחד בין שני תורים אחרים 11 עיבודים, אבל רק 3 מתרחשים בפועל (אחד לכל בלוק). זו שיפור של פי 3.6 בביצועים.

איך להשתמש בעמודה

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

עיבודי תור

אם אתם מוסיפים ל-Blockly שיטה חדשה שאמורה לעדכן את הצורה של בלוק, צריך להפעיל את BlockSvg.prototype.queueRender כדי לעבד את הבלוק בתור.

יש להמתין לסיום העיבוד

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

import * as renderManagement from './renderManagement.js';

function async myNewMethod() {
  block.somethingThatModifiesTheShape();
  // Await the promise.
  await renderManagement.finishQueuedRenders();
  myThingThatReliesOnPositioningInfo();
}

עיבוד מיידי של הטריגר בתור

אם אתם מוסיפים ל-Blockly שיטה חדשה שמחייבת עדכון של הגודל או המיקום של הבלוק, וגם לא יכולים לחכות עד לפריים הבא עד להשלמת העיבוד, תוכלו לקרוא ל-renderManagement.triggerQueuedRenders כדי לאלץ את העיבודים שבתור להתרחש באופן מיידי.

import * as renderManagement from './renderManagement.js';

function async myNewMethod() {
  block.somethingThatModifiesTheShape();
  // Trigger an immediate render.
  renderManagement.triggerQueuedRenders();
  myThingThatReliesOnPositioningInfo();
}

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

יש גם כמה מקומות בליבה שבהם הוא גורם לעיבוד מיידי מסיבות של תאימות לאחור. אנחנו מתכננים להסיר אותן בגרסה 11.