חדשות על מוצרים

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

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

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

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

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

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

אלה המטרות שלנו: 

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

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

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

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

רינדור ממוקד

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

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

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

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

Vulkan Subsampling

התכונה 'דגימת משנה של Vulkan' היא בת ברית של הרינדור הממוקד. בעוד ש-foveated rendering מחליט מה לשרטט ברמות איכות שונות, Vulkan Subsampling קובע איך לשרטט ביעילות את רמות האיכות השונות באמצעות Fragment Density Maps.

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

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

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

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

מגירה של GPU Resident

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

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

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

הסרת חלקים מוסתרים ב-GPU

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

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

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

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

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

Performance Metrics API

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

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

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

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

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

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

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

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

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

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

  • הגדרות URP: משביתים את HDR ואת Post Processing ל-XR בנייד. התכונות האלה מספקות השפעה חזותית מינימלית בהשוואה לעלות הביצועים שלהן בחומרה של מכשירים ניידים, כך שתקבלו שיפורים מדידים בביצועים עם הבדלים חזותיים שכמעט לא מורגשים.
  • SRP Batcher: מפחית את העומס על המעבד בסצנות עם הרבה חומרים שמשתמשים באותו וריאנט של Shader. אם מצמצמים את השינויים במצב העיבוד בין קריאות הציור, אפשר לצמצם באופן משמעותי את הזמן שהמעבד מקדיש לעיבוד.
  • קצב רענון התצוגה: התאמה דינמית בין 72fps ל-90fps בהתאם למורכבות הסצנה. כדי לשמור על יציבות, כדאי להפחית את קצב הפריימים במהלך רצפים מורכבים, ואז להגדיל אותו במהלך רגעים פשוטים יותר כדי ליצור אינטראקציה חלקה במיוחד.
  • עומק/טקסטורות אטומות: כדאי להשבית את האפשרות הזו אלא אם היא נדרשת במיוחד לאפקטים של הצללה. הן גורמות לפעולות מיותרות של העתקת GPU שפוגעות בביצועים בלי לספק יתרון לרוב האפליקציות.
  • URP Render Scale: ההגדרה הזו מאפשרת לבצע רינדור ברזולוציה מופחתת כדי לשפר את הביצועים, או לבצע רינדור ברזולוציה גבוהה יותר כדי לשפר את האיכות החזותית.

הוראות מפורטות לאופטימיזציות האלה ועוד מופיעות במדריך המלא שלנו לאופטימיזציה של ביצועים ב-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
נכתב על ידי:

להמשך הקריאה