תחילת העבודה עם Vulkan ב-Android
Vulkan הוא ממשק ה-API הראשי של גרפיקה ברמה נמוכה ב-Android. Vulkan מספק ביצועים של משחקים שמטמיעים מנוע משחק וכלי רינדור משלהם.
כדי להטמיע את Vulkan במנוע המשחק, צריך:
- זיהוי מכשירי Android שבהם אפשר להשתמש ב-Vulkan
- להבין את היתרונות של תמיכה במכשירי Android ישנים יותר
- הוספת Vulkan ליעד ה-build של Android
- בחירת מהדר של תוכנת ההצללה (shader) כדי ליצור SPIR-V ל-Vulkan
- בחירת הגרסה הזמינה של Vulkan API בזמן הריצה
- איך מבצעים אופטימיזציה של פעולות הרינדור ב-Vulkan באמצעות פרופילים של Vulkan, התאמת קצב הפריימים וסיבוב מראש
- בחירת כלים גרפיים לניפוי באגים ולניתוח ביצועים
- הערה: לקבלת מידע על השימוש ב-Vulkan ב-Android עם Unity או Unreal
מנועי משחק, כדי לראות:
- Vulkan ב-Unity
- Vulkan ב-Unreal
בחירת מפרטי המכשיר המינימליים ל-Vulkan
Vulkan זמין ב-Android החל מגרסה 7.0 (רמת API 24). לא כל מכשירי Android עם Android 7.0 ואילך תומכים ב-Vulkan. צריך: לקבוע באילו מכשירי Android עם יכולות Vulkan המשחק שלך תומך.
המלצות
כדי לקבל תמיכה ב-Vulkan, צריך להשתמש במפרטים הבאים כדרישות המינימליות:
- במכשיר פועלת מערכת Android מגרסה 10.0 (רמת API 29) ואילך
- המכשיר תומך ב-Vulkan API בגרסה 1.1 ואילך
- המכשיר כולל יכולות חומרה ותכונות תאימות לשנת 2022 פרופיל Android Baseline
תמיכה במכשירים ישנים יותר
אם המשחק נועד לפעול במגוון רחב של מכשירים ברמות שונות של יכולות גרפיקה, ייתכן שיהיה עליך לתמוך במכשירים ישנים יותר מומלץ לעיין במאמר בחירת מפרטי מכשירים מינימליים ל-Vulkan. לפני שיוצרים תמיכה במכשירים ישנים, צריך לבדוק אם Vulkan מספקת לשיפור המשחק. משחקים עם הרבה קריאות משיכה (title) שנעשה בהם שימוש ב-OpenGL ES יכולים לראות תקורה משמעותית של נהגים עקב העלות הגבוהה של ביצוע שיחות משיכה ב-OpenGL ES. המשחקים האלה עלולים להיות מוגבלים למעבד בגלל שהם מבזבזים חלקים גדולים מזמן הפריימים שלהם במנהל הגרפיקה. בנוסף, המעבר מ-OpenGL ES ל-Vulkan יכול להוביל לירידה משמעותית בשימוש ב-CPU ובאנרגיה במשחקים. כדאי להשתמש באפשרות הזו במיוחד אם במשחק יש סצנות מורכבות שלא ניתן להשתמש בהן ביעילות ב-instancing כדי לצמצם את מספר הקריאות ל-draw. כשמטרגטים מכשירים ישנים, מומלץ לכלול תמיכה ברינדור של OpenGL ES כחלופה, כי יכול להיות שבחלק מהמכשירים ברשימת המכשירים לטירגוט יש הטמעות של Vulkan שלא יכולות להריץ את המשחק בצורה מהימנה.
יכול להיות שלא תרצו לתמוך במכשירים ישנים יותר עם תמיכה ב-Vulkan כי הם חסרים ביצועים ותכונות או שיש להם בעיות יציבות.
ביצועים ותכונות
יכול להיות שמכשירי Android ישנים יותר עם תמיכה ב-Vulkan לא יעמדו בביצועי הרינדור או בתמיכת החומרה הנדרשים להפעלת המשחק. הסבירות לכך גבוהה במיוחד אם המשחק כולל גרפיקה באיכות גבוהה ו-Vulkan הוא ממשק ה-API היחיד שאתם מטרגטים ל-Android. מכשירים ישנים רבים מוגבלים לגרסה 1.0.3 של Vulkan API ובדרך כלל חסרים בהם תוספי Vulkan נפוצים, חומרה מודרנית.
יציבות
יכול להיות שמכשירי Android ישנים יותר משתמשים בדרייברים מיושנים של Vulkan. הנהג/ת האלה גרסאות עשויות לכלול באגים שיכולים להשפיע על היציבות של המשחק. פתרון באגים בנהגים יכול לדרוש כמויות משמעותיות של זמן בדיקה ותכנון.
הוספת Vulkan לפרויקט
כדי להוסיף את Vulkan לפרויקט:
- הוספת כותרות של Vulkan API
- הידור קוד של שַדְרֵר ל-SPIR-V
- קריאה ל-Vulkan API בזמן הריצה
הכללת כותרות של Vulkan API
כדי לקמפל קוד שמשתמש ב-Vulkan, המשחק צריך לכלול את קובצי הכותרת של Vulkan API. אפשר למצוא עותק של כותרות Vulkan ב-Android NDK או ארוזות בגרסאות של Vulkan SDK. כל גרסת NDK מסוימת כוללת רק את כותרות Vulkan שזמינות בזמן פרסום NDK. אם להשתמש בכותרות Vulkan מה-NDK. צריך להשתמש ב-NDK בגרסה 25 ואילך, כולל קובצי כותרות שתומכים ב-Vulkan בגרסה 1.3. ב-Vulkan SDK יש את הגרסה העדכנית ביותר של הכותרות.
הידור קוד של שגיאות ל-SPIR-V
ה-Vulkan API מצפה שתוכנות ההצללה יסופקו בקובץ הבינארי SPIR-V בפורמט ביניים. המוסכמה הזו שונה מ-OpenGL ES, שבה אפשר לשלוח קוד מקור שנכתב ב-OpenGL Shading Language (GLSL) כמחרוזות טקסט. שימוש במהדר של תוכנת ההצללה (shader) כדי לקחת קוד שנכתב בכלי להצללה שפה כמו GLSL או High-level Shader Language (HLSL) ולחבר אותם למודולים של SPIR-V לשימוש עם Vulkan.
אפשר להשתמש במהדר shaderc כדי לקמפל תוכניות של שגיאות שנכתבו ב-GLSL ל-SPIR-V. אם המשחק שלכם משתמש ב-HLSL, ה-DirectXShaderCompiler תומך בפלט SPIR-V. בדרך כלל, להדר תוכנות הצללה למצב אופליין כחלק מתהליך ה-build של הנכס ולכלול את המודולים של SPIR-V בנכסי זמן הריצה.
קריאה ל-Vulkan API בזמן הריצה
כדי לקרוא ל-Vulkan API, המשחק צריך לקבל מצביע פונקציות לקריאות ל-Vulkan API. הדרך הפשוטה ביותר לעשות זאת היא ליצור קישור לספרייה המשותפת libvulkan.so
, שכלולה ב-Android NDK. קישור
לספרייה יש שני חסרונות: תקורה נוספת של שליחת פונקציות
והגבלות על העברת הסמן של פונקציות Vulkan API באופן אוטומטי
הבעיה נפתרה.
כשמפעילים פונקציית Vulkan API, אמצעי הבקרה עובר דרך dispatch טבלה שמנוהלת על ידי מבנה שנקרא טוען Vulkan. במכשירי Android משתמש בהטמעה משלו של טוען Vulkan ולא ב-LunarG בטעינה. מערכת הטעינה הזו היא חלק מארכיטקטורת השכבות של Vulkan API. קישור לספריית המערכת בזמן ה-build יגרור שליחה נוספת ברמה נתונה לקריאה ל-API. התקורה קטנה, אבל ניתן להבחין בה עבור משחקים שמבצעים נפחים גדולים של שיחות Vulkan.
בדרך כלל, ספריית המערכת פותרת רק הפניות לפונקציות Vulkan שנחשבות לחלק מ-API הליבה. ב-Vulkan יש מספר רב של תוספים, להגדיר פונקציות Vulkan נוספות, שרבים מהן לא מזוהים באופן אוטומטי. על ידי ספריית המערכת. לפני שמשתמשים בפונקציות האלה ב-Vulkan, צריך לפתור את ההפניות אליהן באופן ידני.
כדי לצמצם את הבעיות האלה, צריך לפתור באופן דינמי את ההפניות לכל הפונקציות של Vulkan שבהן אתם מתכוונים להשתמש במהלך זמן הריצה. אחת הדרכים לעשות זאת היא באמצעות ספריית מטא-טעינה בקוד פתוח, כמו volk.
במשחק לדוגמה AGDKTunnel אפשר לשלב volk למטרה הזו. אם אתם משתמשים בספריית מטא-טעינה, אל תקשרו לספרייה המשותפת libvulkan.so
בסקריפטים ל-build.
איך בודקים איזו גרסת Vulkan API זמינה
Android תומך בגרסאות הבאות של Vulkan API:
- 1.0.3
- 1.1
- 1.3
נקבע מספר הגרסה הגבוה ביותר של Vulkan API שזמין במכשיר נתון לפי גרסת Android ותמיכה במנהל התקן של Vulkan.
גרסת Android
תמיכת הפלטפורמה בגרסת Vulkan API תלויה בגרסה המינימלית של Android (רמת API):
- 1.3 — Android 13.0 (רמת API 33) ואילך
- 1.1 – Android 10.0 (רמת API 29) ואילך
- 1.0.3 – Android 7.0 (רמת API 24) ואילך
תמיכה לנהגי Vulkan
התמיכה של פלטפורמת Android בגרסה של Vulkan API לא מבטיחה שגרסת ה-API נתמכת על ידי מנהל ההתקן של Vulkan במכשיר. מכשיר עם Android 13 יתמוך רק בגרסה 1.1 של Vulkan API.
כשמפעילים את Vulkan, לא מבקשים גרסת API גדולה מזו:
- גרסת Vulkan API המקסימלית לגרסה של Android שפועלת במכשיר
- גרסת Vulkan API שדווחה על ידי vkEnumerateInstanceVersion
- גרסת Vulkan API שמדווחת על ידי המאפיין
apiVersion
במבנה VkPhysicalDeviceProperties
דוגמה לקביעת הגרסה העדכנית ביותר של Vulkan API שנתמכת:
// Minimum Android API levels for Vulkan 1.3/1.1 version support
static constexpr int kMinimum_vk13_api_level = 33;
static constexpr int kMinimum_vk11_api_level = 29;
uint32_t GetHighestSupportedVulkanVersion(VkPhysicalDevice physical_device) {
uint32_t instance_api_version = 0;
vkEnumerateInstanceVersion(&instance_api_version);
VkPhysicalDeviceProperties device_properties;
vkGetPhysicalDeviceProperties(physical_device, &device_properties);
// Instance and device versions don't have to match, use the lowest version
// number for API support if they don't.
const uint32_t driver_api_version =
(instance_api_version < device_properties.apiVersion) ?
instance_api_version : device_properties.apiVersion;
const int device_api_level = android_get_device_api_level();
if (device_api_level >= kMinimum_vk13_api_level &&
driver_api_version >= VK_API_VERSION_1_3) {
return VK_API_VERSION_1_3;
} else if (device_api_level >= kMinimum_vk11_api_level &&
driver_api_version >= VK_API_VERSION_1_1) {
return VK_API_VERSION_1_1;
}
return VK_API_VERSION_1_0;
}
קביעת תאימות של פרופיל Vulkan
פרופילים של Vulkan הם קובצי JSON שמגדירים קבוצה של תכונות, תוספים, יכולות ומגבלות מינימום של פרמטרים שחייבים להיות נתמכים במכשיר Vulkan כדי שהוא יהיה תואם לפרופיל. כדי לקבוע אם המכשיר תואם לפרופיל ספציפי של Vulkan, כמו Android Baseline לשנת 2022 של הפרופיל, משתמשים בספריית ה-API של Vulkan פרופילים בקוד פתוח. אפשר גם לנתח בעצמך את קובץ ה-JSON של הפרופיל ולבדוק את יכולות המכשיר. באמצעות ממשקי ה-API הרלוונטיים של Vulkan כדי לקבוע את התאימות של הפרופילים.
פרופילים של Vulkan
ב-Android נעשה שימוש בפרופילים של Vulkan שמגדירים אילו תכונות ותוספים זמינים לכל אחד מהמכשירים עם Android.
Android Baseline Profile (ABP) הוא הניסיון הראשון ליצירת פרופיל Vulkan. ABP2021 ו-ABP2022 הם פרופילים בהסתכלות לאחור, שנועדו לכסות > ב-85% מהמכשירים הפעילים בזמן האימון. לא תהיה ABP חדש בעתיד.
Vulkan פרופילים ל-Android (VPA) הוא הפרופיל החדש לעתיד, לשקף את הצרכים של מפתחי התוכנה ולפתח תכונות עקביות בהקדם שמפתחי חומרה יכולים לספק אותם. VPA15_minimums הוא הפרופיל הראשון ל-Android 15, וייוצר פרופיל VPA חדש מדי שנה כדי לכסות כל גרסה ראשית של Android.
הטמעת קצב מסגרות
קצב הפריימים הנכון הוא חלק חיוני במתן חוויית משחק באיכות גבוהה. ערכת פיתוח המשחקים של Android כוללת את קצב הפריימים Library כדי לעזור במשחק להשיג קצב פריימים אופטימלי. לקבלת מידע נוסף פרטים על ההטמעה: שילוב של Android Frame Pacing בכלי לרינדור Vulkan.
הטמעת רוטציה מראש
מכשירי Android יכולים להופיע בכמה כיוונים. כיוון המכשיר יכול להיות שונה מכיוון משטח הרינדור. ביטול לייק ל-OpenGL ES ב- ב-Android וב-Vulkan לא מטפלים בפערים בין שני הסוגים. במאמר טיפול בסיבוב המכשיר באמצעות סיבוב מקדים ב-Vulkan מוסבר איך פועל תהליך ההתמקדות ואיך מטפלים בצורה אופטימלית בהבדלים בתצוגה בהתאם לכיוון המכשיר כשמשתמשים ב-Vulkan.
פתרון בעיות ויצירת פרופיל ברינדור Vulkan
יש כלים רבים שיכולים לעזור לכם לאבחן בעיות רינדור עם בעיות בביצועים של קוד הרינדור של Vulkan.
מידע נוסף על הכלים לניפוי באגים ועל הכלים ליצירת פרופילים של Vulkan זמין בקטע כלים ותכונות מתקדמות.
שכבות אימות של Vulkan
שכבות אימות של Vulkan הן ספריות בסביבת זמן ריצה שאפשר להפעיל כדי לבדוק את הקריאות שלכם ל-Vulkan API ולספק אזהרות או שגיאות לגבי שימוש שגוי או לא אופטימלי. שכבות האימות האלה לא פעילות כברירת מחדל, כי תהליך האימות מוסיף תקורה על זמן הריצה ומשפיע על הביצועים משחק. למידע על אופן השימוש בשכבות אימות במשחק: ניפוי באגים באמצעות שכבת אימות.
כלים לצילום מסגרות
שימוש בכלים לצילום פריימים כדי להקליט ולנגן מחדש את הקריאות ל-Vulkan API שבוצעו במהלך פריים של המשחק. בעזרת הכלים האלה תוכלו:
- הצגת מידע על משאבי גרפיקה פעילים והדמיות שלהם
- הצגת רצף הקריאות ל-API שבוצעו על ידי המשחק והצגת הפרמטרים של ה-API
- סקירה של המצב של צינור עיבוד הנתונים של הגרפיקה בזמן קריאה לציור
- הצגה חזותית של תוצאות הרינדור עד להפעלת קריאה ספציפית בפריים
משתמשים בכלי הקוד הפתוח RenderDoc כדי לצלם פריימים מ: משחקים שפועלים ב-Android. RenderDoc תומך בצילום פריימים של Vulkan וגם של OpenGL ES.
אפשר להשתמש גם ב-Android GPU Inspector (AGI) כדי לצלם פריימים של Vulkan.
כלים לניתוח ביצועים
משתמשים בכלים לניתוח ביצועים כדי לבדוק בעיות רינדור במשחק שגורמות לקצב פריימים לא אופטימלי. ספקי GPU מסוימים מספקים כלים שנועדו ליצור פרופיל של המשחק ולספק נתוני ביצועים ספציפיים לארכיטקטורות ה-GPU שלהם. מאפייני הביצועים וצווארי הבקבוק של המשחק שונות באופן משמעותי במהלך רינדור במעבדי GPU מספקים שונים, ואפילו גנרציות שונות של GPU מאותו ספק.
אפשר גם להשתמש ב-Android GPU Inspector כדי לאסוף ולנתח נתוני ביצועים. בניגוד לכלים של הספקים, Android GPU Inspector תואם עם כמה מעבדי GPU מספקים שונים. עם זאת, Android GPU Inspector לא תומכים במכשירי Android ישנים יותר, ויכול להיות שלא יתאימו לכל המכשירים החדשים מכשירים.
שיפור בדיקות Vulkan באמצעות CTS-D
יצרני מכשירים מבוססי Android משתמשים בכלי לבדיקת תאימות (CTS) כדי לעזור. ולוודא שהמכשירים שלהם תואמים. CTS שמופעל על ידי מפתחים (CTS-D) הם בדיקות שנשלחות על ידי מפתחי אפליקציות ל-Android כדי לוודא שמכשירי Android עתידיים יעמדו בתרחישי השימוש שלהם ויוכלו להריץ את האפליקציות שלהם בצורה חלקה וללא באגים.
אם הצלחתם לגרום לשגיאה חדשה באפליקציית Vulkan שמשפיעה על מכשיר ספציפי עם Android, תוכלו לשלוח הצעה חדשה לבדיקה, ולתאר את הבעיה ואת הדרכים לבדוק אותה. כך תוכלו להבטיח שהבעיה תיפתר עדכון עתידי למכשיר, וגם מבטיח שאותו באג לא יקרה לכל מכשיר אחר.
למידע על תהליך הגשת CTS להוראות מפורטות על אופן שליחת מההצעה לבדיקה.