איך Photoshop פתר את העבודה עם קבצים שגדולים יותר מהמותר בזיכרון

ראו איך Adobe הצליחה לאפשר למשתמשים לערוך אפילו את הקבצים הגדולים ביותר בגרסת האינטרנט של אפליקציית Photoshop המפורסמת שלה.

נביל אל-שאמה
נביל אל-שאמה
תומאס סטיינר
תומאס סטיינר

מבוא

(המאמר הזה זמין גם בצורת סרטון.)

בשנת 2021, Adobe, יחד עם מהנדסי Chrome, הציגו גרסה של Photoshop לאינטרנט. התוכנה עושה שימוש חדשני ב-WebAssembly באמצעות תכונות כמו SIMD, אחסון בעל ביצועים גבוהים במערכת הקבצים הפרטית המקורית, מרחב הצבעים P3 ללוח הציור, ורכיבי אינטרנט עם Lit. במאמר הזה אנחנו רוצים להתמקד באופן שבו הנדסת Adobe Photoshop פתרה את העבודה עם קבצים שגדולים יותר מאשר בזיכרון. ובמקרה של WebAssembly, איך Photoshop עובד עם קבצים שגדולים ממרחב הכתובות של 32 ביט של Wasm32.

אפליקציית Photoshop בזמן עריכת תמונה של הלוגו של Project Fugu.

הבעיה

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

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

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

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

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

לידיעתך, הבעיה המקורית ש-Photoshop הייתה צריכה לפתור הייתה עריכה של קבצים של רזולוציית הדפסה בגרסאות מוקדמות של macOS, בנפח של עד 1MB למערכת ההפעלה ולכל האפליקציות. תמונה של דף מלא ברזולוציה של 300dpi ב-CMYK היא בערך 32MB ללא דחיסה.

הפתרון

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

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

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

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

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

אנחנו בודקים את היררכיית הקבצים הפרטיים של מערכת הקבצים הפרטיים של Photoshop באמצעות התוסף ל-Chrome של OPFS Explorer.

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

מסקנות

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

אישורים

פוסט זה נסקר על ידי אוליבר אונטר אקר ורייצ'ל אנדרו. תודה מיוחדת לראסל וויליאמס על התיעוד המעולה שלו ב-VM של Photoshop.