הפחתת ציור יתר

בדף הזה נסביר מה זה overdraw, איך לאבחן אותו ואיך למנוע או לצמצם אותו.

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

מידע על פיקסלים עודפים (overdraw)

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

איתור בעיות של ציור יתר

הפלטפורמה מציעה את הכלים הבאים שיעזרו לכם לקבוע אם ציור יתר משפיע על ביצועי האפליקציה.

הכלי Debug GPU Overdraw

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

מידע נוסף זמין במאמר בנושא הדמיה של ציור יתר של GPU.

כלי פרופיל עיבוד ב-GPU

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

ב-GPU עם ביצועים נמוכים, קצב המילוי הזמין – המהירות שבה ה-GPU יכול למלא את מאגר המסגרות – יכול להיות נמוך. ככל שמספר הפיקסלים שנדרשים לציור של פריים גדל, יכול להיות שייקח ל-GPU יותר זמן לעבד פקודות חדשות, והוא יבקש משאר המערכת לחכות עד שהוא יוכל להדביק את הפער. העלייה הזו מוצגת בסרגל Process כי המעבד הגרפי עמוס מדי בניסיון לצייר פיקסלים מהר ככל האפשר. יכול להיות שהמדד הזה יציג עלייה חדה גם בגלל בעיות אחרות, ולא רק בגלל מספר הפיקסלים הגולמי. לדוגמה, אם הכלי Debug GPU Overdraw מראה משיכת יתר כבדה והערך של Process עולה בחדות, כנראה שיש בעיה במשיכת היתר.

מידע נוסף זמין במאמר בנושא מהירות העיבוד של פרופיל ב-GPU.

תיקון פיקסלים עודפים (overdraw)

כדי לצמצם את המשיכות העודפות או למנוע אותן, אפשר:

  • הסרת רקעים מיותרים בפריסות.
  • הפחתת השקיפות.

בקטע הזה מוסבר על שתי הגישות האלה.

הסרת רקעים מיותרים בפריסות

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

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

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

הפחתת השקיפות

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

אפקטים חזותיים כמו אנימציות שקופות, דעיכות וצלליות כוללים שקיפות מסוימת, ולכן יכולים לתרום באופן משמעותי לציור יתר. כדי לשפר את הציור החוזר במצבים כאלה, אפשר לצמצם את מספר האובייקטים השקופים שאתם מעבדים. לדוגמה, אפשר ליצור טקסט אפור על ידי ציור טקסט שחור בקומפוזבילי Text והחלת ערך אלפא שקוף למחצה באמצעות modifier = Modifier.alpha(0.5f). עם זאת, אפשר להשיג את אותו האפקט עם ביצועים טובים יותר על ידי הגדרה ישירה של צבע הטקסט של הרכיב הניתן להרכבה לאפור אטום: color = Color.Black.copy(alpha = 0.5f).

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