חדשות על המוצר

אופטימיזציה של הביצועים ב-Android XR באמצעות Unity

משך הקריאה: 6 דקות
לצפייה בפרופיל של Luke Hopkins
Luke Hopkins מהנדס קשרי מפתחים, Android

‫Samsung Galaxy XR כבר כאן, והוא מבוסס על Android XR! הפוסט הזה בבלוג הוא חלק מ שבוע ה-Spotlight של Android XR, שבו אנחנו מספקים משאבים – פוסטים בבלוג, סרטונים, קוד לדוגמה ועוד – שנועדו לעזור לכם ללמוד, לפתח ולהכין את האפליקציות שלכם ל-Android XR.  

השבוע, סמסונג השיקה את Galaxy XR, שפותח בשיתוף עם Google ו-Qualcomm. זו תקופה מרגשת למפתחים, ואנחנו רוצים לעזור לכם להפיק את הביצועים הטובים ביותר מאפליקציית ה-XR שלכם.

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

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

אלה היעדים שלנו: 

  • מינימום: 72fps (חלק מהנחיות האיכות שלנו לגבי המשחק)
  • אופציונלי: 90fps עם תקציב של 11ms לכל פריים

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

תכונות ספציפיות ל-XR שקשורות לביצועים

נתחיל בשתי תכונות ספציפיות לביצועים של XR: רינדור ממוקד ודגימת משנה של Vulkan. 

רינדור ממוקד

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

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

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

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

Vulkan Subsampling

‫Vulkan Subsampling הוא החבר הכי טוב של foveated rendering. בעוד שרינדור ממוקד קובע מה לרנדר ברמות איכות שונות, תת-דגימה של Vulkan מטפלת באופן היעיל של רינדור רמות האיכות השונות באמצעות מפות צפיפות של מקטעים.

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

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

תכונות GPU לסצנות מורכבות

בנוסף ל-Foveated Rendering ול-Vulkan Subsampling, יש כמה תכונות של GPU שמפחיתות עומס מיותר באמצעות יצירת מופעים חכמה ו-culling. הן יעילות במיוחד בסצנות מורכבות עם גיאומטריה שחוזרת על עצמה או הסתרה משמעותית.

מגירת GPU Resident

התכונה GPU Resident Drawer משתמשת באופן אוטומטי ב-GPU instancing כדי להפחית את מספר הבקשות להזזת פריטים גרפיים ולפנות זמן עיבוד ב-CPU. כך, במקום שה-CPU יספק ל-GPU מידע על כל אובייקט בנפרד, ה-GPU מקבץ אובייקטים דומים יחד.

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

דמיינו סצנה של יער עם 200 עצים שמשתמשים באותו רשת בסיס. בלי GPU Resident Drawer, יש 200 בקשות להזזת פריט גרפי שמעמיסות על ה-GPU, ולכן מפנות את ה-CPU. כשמפעילים את התכונה הזו, ה-GPU יוצר מופעים של העצים האלה בצורה חכמה, וכך מפחית את מספר בקשות להזזת פריט גרפי (draw call) ל-5 עד 10 בלבד. זה חיסכון עצום ב-GPU, שאפשר להשקיע בלוגיקה של הגיימפליי או בחישובים פיזיקליים.

הסתרת אובייקטים מוסתרים ב-GPU

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

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

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

מעקב אחרי הביצועים

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

Performance Metrics API

Performance Metrics API מאפשר לעקוב בזמן אמת אחרי השימוש בזיכרון, ביצועי המעבד (CPU) וביצועי ה-GPU של האפליקציות. הוא מספק נתונים מקיפים משכבות הקומפוזיטור וזמן הריצה, כך שתוכלו לראות בדיוק מה קורה באפליקציה.

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

לפני שמפעילים רינדור foveated, זמן רינדור הפריים של ה-GPU יכול להיות 13 אלפיות השנייה, שזה יותר מהתקציב של 11 אלפיות השנייה. מפעילים את הרינדור הממוקד, מודדים שוב, ומקווים לראות שהזמן ירד ל-9 אלפיות השנייה. זה אומר שקיבלתם 4 אלפיות השנייה של מרווח פעולה כדי להוסיף עוד פרטים לסצנה, לשפר את האיכות החזותית במקומות אחרים או פשוט להבטיח ביצועים חלקים יותר במגוון רחב יותר של תוכן.

בלי המדדים האלה, אתם מבצעים אופטימיזציה בלי לדעת מה קורה. ‫Performance Metrics API מספק מידע מדויק על מה שבאמת עוזר לתרחיש השימוש הספציפי שלכם.

כלי לניפוי באגים בפריים

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

רוצים לוודא שה-SRP Batcher פועל? מחפשים את הרשומות של RenderLoopNewBatcher בכלי לניפוי באגים בפריימים. בודקים אם ה-GPU Resident Drawer מבצע אצווה כמו שצריך? מחפשים את הרשומות של "קבוצת אצווה היברידית". האישורים החזותיים האלה עוזרים לכם להבין אם הגדרות האופטימיזציה שלכם באמת משפיעות.

עוברים על 50 הבקשות הראשונות להזזת פריט גרפי (draw call) בסצנה. אם אתם רואים אובייקטים דומים שמשורטטים בנפרד במקום באצווה, זה אומר שהיצירה של המופעים או האצוות לא פועלת כמו שצריך. הכלי Frame Debugger מציג את הבעיות האלה באופן מיידי כדי שתוכלו לטפל בהן.

אופטימיזציות נוספות

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

  • הגדרות URP: השביתו את HDR ואת העיבוד לאחר הצילום ב-XR לנייד. התכונות האלה מספקות השפעה חזותית מינימלית בהשוואה לעלות הביצועים שלהן בחומרה של מכשירים ניידים, כך שתקבלו שיפורים משמעותיים בביצועים עם הבדלים חזותיים שכמעט לא מורגשים.
  • SRP Batcher: מפחית את העומס על המעבד (CPU) בסצנות עם הרבה חומרים שמשתמשים באותה גרסה של הצללה. אם תצמצמו את השינויים במצב הרינדור בין בקשות להזזת פריט גרפי, תוכלו להפחית באופן משמעותי את זמן ה-CPU שמוקדש לרינדור.
  • קצב רענון המסך: התאמה דינמית בין 72fps ל-90fps בהתאם למורכבות הסצנה. כדי לשמור על יציבות, אפשר להוריד את קצב הפריימים ברצפים מורכבים, ולהגביר אותו ברגעים פשוטים יותר כדי ליהנות מאינטראקציה חלקה במיוחד.
  • Depth/Opaque Textures: השביתו את האפשרויות האלה, אלא אם הן נדרשות באופן ספציפי לאפקטים של הצללה. הם גורמים לפעולות העתקה מיותרות של GPU שפוגעות בביצועים בלי לספק תועלת לרוב האפליקציות.
  • קנה מידה לעיבוד ב-URP: ההגדרה הזו מאפשרת לעבד ברזולוציה נמוכה יותר כדי לשפר את הביצועים, או להגדיל את קנה המידה של העיבוד כדי לשפר את האיכות החזותית.

הוראות מפורטות לגבי האופטימיזציות האלה ואחרות זמינות במדריך המלא לביצועים ב-Unity ל-Android XR.

סיכום

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

הנה מפת הדרכים שלכם:

  1. כדאי להתחיל עם Foveated Rendering ו-Vulkan Subsampling. התכונות האלה, שספציפיות ל-XR, חוסכות באופן מיידי ומשמעותי במשאבי ה-GPU.
  2. אם יש לכם סצנות מורכבות עם גיאומטריה חוזרת או חללים פנימיים, הוסיפו את GPU Resident Drawer ו-Occlusion Culling.
  3. עוקבים אחרי הכול באמצעות Performance Metrics API כדי לוודא שהשינויים באמת עוזרים
  4. אופטימיזציות נוספות של URP לשיפור הביצועים

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

השלב הבא: הרחבת המיומנויות

מוכנים לגלות עוד? תוכלו לעיין במקורות המידע הבאים:

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