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