בואו לראות איך Adobe הצליחה לאפשר למשתמשים לערוך גם את הקבצים הגדולים ביותר בגרסת האינטרנט של אפליקציית Photoshop המפורסמת.
מבוא
(המאמר הזה זמין גם בפורמט של סרטון).
בשנת 2021, Adobe, יחד עם מהנדסי Chrome, יצרו גרסה של Photoshop לאינטרנט. התוכנה עושה שימוש חדשני ב-WebAssembly עם תכונות כמו SIMD, אחסון בעל ביצועים גבוהים במערכת הקבצים הפרטית של המקור, מרחב הצבעים P3 ללוח הציור ורכיבי אינטרנט עם Lit. במאמר הזה אנחנו רוצים להתמקד באופן שבו מהנדסי Adobe Photoshop פתרו את העבודה עם קבצים שגדולים ממה שהזיכרון יכול להכיל בזיכרון. ובמקרה של WebAssembly, איך Photoshop פועל עם קבצים שגדולים משטח הכתובות של 32 סיביות של Wasm32.
הבעיה
פתיחת קובץ לעריכה דורשת נפח זיכרון גדול, הרבה יותר מפתיחת קובץ לצפייה. בדרך כלל, לקבצים שנערכו ב-Photoshop נדרש יותר זיכרון מזה שזמין למשתמש במכשיר שלו, בגלל הפיצ'רים הרבים שהתוכנה מציעה, סוגי העיצוב והעריכה הדיגיטליים שמשמשים אותה והיכולות של המכשירים של המשתמשים.
פורמט הקובץ Photoshop מאחסן נתונים באמצעות דחיסת נתונים ללא אובדן מידע. כשקוראים קובץ או מסמך, כל נתוני התמונה מבוטלים כדי לאפשר עיבוד יעיל יותר. כתוצאה מכך, כמות הזיכרון הדרושה יכולה להיות גדולה פי כמה מנפח האחסון שבו מסמך משתמש בדיסק או באחסון בענן.
Photoshop תומך בהיסטוריית ביטול גדולה מאוד. פעולות רבות ב-Photoshop הן פעולות הרסניות כלומר, ביצוע עריכה כמו ציור עם מברשת יגרום לנתוני פיקסלים חדשים, שגודלם יכולים להיות בדיוק כמו נתוני הפיקסלים המקוריים. ביצוע שינויי העריכה האלה בפעילות עריכה ארוכה מניב כמויות גדולות של נתוני פיקסלים, שאותם צריך לשמור כדי לתמוך בפעולות ביטול. כך, ההיסטוריה יכולה לגדול למאות מגה-בייט או ג'יגה-בייט של נתונים.
היכולת לנהל את הזיכרון באמצעות מכשירים ופלטפורמות – מחשבים, מכשירים ניידים או דפדפנים. חלקם נדיבים יותר מאחרים בנפח הזיכרון שהם מאפשרים לאפליקציות. כמו כן, נפח הזיכרון משתנה ממכשיר למכשיר, כפי שידוע לכם כשאתם מזמינים מחשב או מכשיר חדש ומציינים את הנפח הרצוי של זיכרון גישה אקראי (RAM). רבות מהפלטפורמות האלה תומכות גם בזיכרון וירטואלי, שמאפשר לאפליקציה להשתמש ביותר זיכרון ממה שזמין פיזית. התמיכה הזו משתנה בהתאם למערכת ההפעלה ולזמן הריצה, כמו במקרה של WebAssembly, יכול להיות שהאפליקציות לא יוכלו לגשת אליהן בקלות או להשתמש בהן. נוסף על כך, למערכות וירטואליות מודרניות יש גבולות גבוהים שקל לחרוג מהדרישות של Photoshop.
באופן אידיאלי, אפליקציות ישתמשו בנפח הזיכרון שהם צריכים. בדרך כלל הם מאפשרים להם לספק למשתמשים את הביצועים הטובים ביותר. עם זאת, אם הם משתמשים ביותר מדי זיכרון, יכול להיות שהם יוטלו סנקציות בגלל הפלטפורמה של סביבת זמן הריצה או שנגמר הזיכרון, וכתוצאה מכך הם ייכשלו.
הערה היסטורית: הבעיה המקורית ש-Photoshop היה צריך לפתור הייתה עריכת קבצים ברזולוציית הדפסה בגרסאות מוקדמות של macOS, החל מ- 1MB במערכת ההפעלה ובכל האפליקציות. תמונה של דף מלא בגודל 300dpi ב-CMYK היא בגודל של כ-32MB במצב לא דחוס.
הפתרון
כדי לפתור את הבעיה של חריגה מנפח ה-RAM הזמין באפליקציה, הושקה תוכנה של מערכת זיכרון וירטואלית (VM). Photoshop משתמשת ב-VM שלה כדי לנהל נתוני מסמכים, במיוחד נתוני תמונה, את כל ההיסטוריה והמצב של הביטולים, וגם את נפח האחסון הפעיל של הפקודה הנוכחית. הוא משמש גם לשמירה במטמון של בלוקים גדולים של נתונים כמו תיאורי מברשות, כך שיהיה צריך לבצע סריאליזציה שלהם מהדיסק רק פעם אחת.
דוגמה לאחד מהמאפיינים שמנוהלים על ידי המכונה הווירטואלית, נתוני התמונה מאוחסנים באמצעות ייצוג mipmap – קבוצת משבצות פירמידה שמספקות נתוני תמונה בטווח של רזולוציות נמוכות עד גבוהות. התכונה הזו מאפשרת ל-Photoshop לפעול על נתוני הרזולוציה המתאימה, כדי לקבל תגובה מהירה יותר כאשר מגדילים את התצוגה או מביטים בתצוגה מקדימה, לעומת הקטנת התצוגה.
במהלך אתחול האפליקציה, Photoshop קובע כמה זיכרון RAM יהיה זמין. היא שומרת חלק אחד של הנתונים ב-VM. נפח ה-RAM הנותר זמין לצרכים של אפליקציות אחרות באמצעות ספריית זמן הריצה הרגילה של C++. זיכרון ה-VM מחולק לדפים. כל דף הוא בדרך כלל כפולה מגודל דף החומרה של המכשיר. כשמשתמשים בנתוני תמונה, הזיכרון מפנה כמשבצות. אריח הוא שטח של ריבוע שמכיל פיקסלים של שכבה יחידה, כולל גבולות גיאומטריים. משבצת צורכת דף אחד או יותר.
Photoshop יוצר קובץ גירוד אחד או יותר כדי לספק גיבוי מבוסס דיסק לדפי VM. קובצי הגירוד האלה מאוחסנים במערכת הקבצים הפרטית של המקור. בצילום המסך מוצגת היררכיית קבצים לדוגמה של קובץ גירוד כזה (מודגש בצהוב) וקבצים אחרים במהלך סשן של עריכת תמונות. כל קובץ גירוד יכול להכיל הרבה דפי VM. כשצריך יותר גיבוי למכונה הווירטואלית, המערכת יוצרת קובצי גירוד נוספים. כשמתפנה דפים, ניתן להשתמש בהם שוב בקובץ גירוד כדי ליצור דפים חדשים.
במהלך עיבוד נתוני התמונה, Photoshop מבצע איטרציה על גבי משבצות, ומבצע חישובי פיקסלים. כל חישוב יכול להתייחס למספר משבצות. המכונה הווירטואלית אחראית לוודא שמשבצות המקור והיעד באיטרציה הנוכחית נמצאות בזיכרון, ולטעון אותן מקובצי מאפס לפי הצורך. במקביל, היא יכולה לרוקן דפים לקובצי גירוד כדי לפנות מקום בזיכרון.
מסקנות
פרטי ההטמעה הממשיים של המכונה הווירטואלית הם הרבה מעבר להיקף המסמך הזה (והם גם קנייניים ל-Adobe), אבל בזכות התיאור הכללי של הפתרון, אנחנו נמצאים במקום שבו אפשר להבין איך Photoshop יכול להתמודד עם קבצים גדולים. מערכת הקבצים הפרטית המקורית עם גישת קריאה וכתיבה לקבצים בעלת ביצועים גבוהים היא רכיב מרכזי בפתרון.
אישורים
פוסט זה נצפה על ידי אוליבר אונטר אקר ורייצ'ל אנדרו. תודה מיוחדת לראסל ויליאמס (Russell Williams) על התיעוד המעולה שלו על המכונה של Photoshop.