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

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

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

  • מינימום: ‎72fps (חלק מההנחיות שלנו לגבי איכות ההפעלה)
  • אופציונלי: 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 Drawer, יש 200 קריאות לציור שצורכות את ה-GPU, ולכן משחררות את ה-CPU. כשמפעילים את התכונה הזו, ה-GPU יוצר מופעים של העצים בצורה חכמה, וכך מצמצם את מספר הקריאות לציור ל-5 עד 10 בלבד. זה חיסכון משמעותי ב-GPU, שאפשר להשקיע אותו בלוגיקה של המשחק או בחישובים פיזיקליים.

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

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

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

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

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

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

Performance Metrics API

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

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

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

להמשך הקריאה