איך מתחילים להשתמש ב-Vulkan ב-Android
Vulkan הוא ה-API הראשי לגרפיקה ברמה נמוכה ב-Android. Vulkan מספק ביצועים אופטימליים למשחקים שכוללים מנוע משחק ומעבד משלהם.
כדי להטמיע את Vulkan בהצלחה במנוע המשחק, צריך:
- איך לזהות אילו מכשירי Android מתאימים לשימוש ב-Vulkan
- הסבר על היתרונות והחסרונות של תמיכה במכשירי Android ישנים יותר
- הוספת Vulkan ליעד ה-build של Android
- בחירת קומפיילר של הצללה ליצירת SPIR-V ל-Vulkan
- איך בודקים בזמן ריצה איזו גרסה של Vulkan API זמינה
- איך לבצע אופטימיזציה של פעולות הרינדור של Vulkan באמצעות פרופילים של Vulkan, קצב פריימים וסיבוב מראש
- בחירת כלי גרפיקה לניתוח ביצועים ולניפוי באגים
- הערה: למידע על השימוש ב-Vulkan ב-Android עם מנועי המשחקים Unity או Unreal, ראו:
- Vulkan ב-Unity
- Vulkan ב-Unreal
בחירת מפרט מינימלי של מכשירים ל-Vulkan
Vulkan זמין ב-Android החל מ-Android 7.0 (רמת API 24). לא כל מכשירי Android עם Android מגרסה 7.0 ומעלה תומכים ב-Vulkan. אתם צריכים לקבוע באילו מכשירי Android עם תמיכה ב-Vulkan המשחק שלכם תומך.
המלצות
אלה דרישות המינימום לתמיכה ב-Vulkan:
- במכשיר פועלת מערכת Android מגרסה 10.0 (רמת API 29) ומעלה
- המכשיר תומך ב-Vulkan API בגרסה 1.1 ומעלה
- למכשיר יש יכולות חומרה ותכונות שתואמות לפרופיל הבסיס של Android משנת 2022
תמיכה במכשירים ישנים יותר
אם המשחק שלכם מיועד לפעול במגוון רחב של מכשירים עם רמות שונות של יכולות גרפיות, יכול להיות שתצטרכו לתמוך במכשירים ישנים יותר מאלה שמומלצים בקטע בחירת מפרטי מכשירים מינימליים ל-Vulkan. לפני שאתם מפתחים תמיכה במכשירים ישנים יותר, כדאי לבדוק אם Vulkan מספק יתרונות למשחק שלכם. במשחקים עם הרבה בקשות להזזת פריטים גרפיים שמשתמשים ב-OpenGL ES, יכול להיות תקורה משמעותית של הדרייבר בגלל העלות הגבוהה של ביצוע בקשות להזזת פריטים גרפיים ב-OpenGL ES. המשחקים האלה יכולים להיות מוגבלים על ידי המעבד (CPU) כי הם מבלים חלקים גדולים מזמן רינדור הפריים במנהל ההתקן הגרפי. בנוסף, המעבר מ-OpenGL ES ל-Vulkan יכול להפחית באופן משמעותי את השימוש במעבד ובחשמל במשחקים. זה רלוונטי במיוחד אם במשחק יש סצנות מורכבות שבהן אי אפשר להשתמש ביעילות ביצירת מופעים כדי לצמצם את מספר הבקשות להזזת פריטים גרפיים. כשמטרגטים מכשירים ישנים יותר, כדאי לכלול תמיכה ברינדור של OpenGL ES כחלופה, כי יכול להיות שבחלק מהמכשירים ברשימת מכשירי היעד יש הטמעות של Vulkan שלא יכולות להריץ את המשחק בצורה אמינה.
יכול להיות שלא תרצו לתמוך במכשירים ישנים יותר שתומכים ב-Vulkan, כי הם לא מספיק מהירים, חסרות בהם תכונות או שיש בהם בעיות יציבות.
ביצועים ותכונות
יכול להיות שבמכשירי Android ישנים יותר עם תמיכה ב-Vulkan אין את ביצועי הרינדור או את התמיכה בחומרה לתכונות שנדרשות כדי להריץ את המשחק. זה סביר במיוחד אם למשחק שלכם יש גרפיקה באיכות גבוהה, ו-Vulkan הוא ה-API היחיד שאתם מטרגטים ב-Android. הרבה מכשירים ישנים מוגבלים לגרסה 1.0.3 של Vulkan API, ולעיתים קרובות חסרים בהם תוספים של Vulkan שנמצאים בשימוש נרחב וזמינים בחומרה מודרנית יותר.
יציבות
יכול להיות שבמכשירי Android ישנים יותר מותקנים מנהלי התקנים מיושנים של Vulkan. יכול להיות שהגרסאות האלה של מנהלי ההתקנים כוללות באגים שמשפיעים על היציבות של המשחק. כדי לעקוף באגים במנהלי התקנים, צריך להשקיע הרבה זמן בבדיקות ובהנדסה.
הוספת Vulkan לפרויקט
כדי להוסיף את Vulkan לפרויקט:
- הוספת כותרות של Vulkan API
- הידור של קוד תוכנת הצללה (shader) ל-SPIR-V
- שליחת קריאה ל-Vulkan API בזמן ריצה
הוספת כותרות של Vulkan API
המשחק צריך לכלול את קובצי הכותרת של Vulkan API כדי לקמפל קוד שמשתמש ב-Vulkan. אפשר למצוא עותק של כותרות Vulkan ב-Android NDK או בחבילה בגרסאות של Vulkan SDK. כל גרסת NDK מסוימת כוללת רק כותרות Vulkan שהיו זמינות בזמן ההשקה של ה-NDK. אם אתם משתמשים בקובצי כותרת של Vulkan מ-NDK, השתמשו ב-NDK בגרסה 25 ואילך, שכוללת קובצי כותרת שתומכים ב-Vulkan בגרסה 1.3. ב-Vulkan SDK יש את הגרסה העדכנית ביותר של הכותרות.
הידור של קוד תוכנת הצללה (shader) ל-SPIR-V
ב-Vulkan API, תוכנות ההצללה (shader) צריכות להיות בפורמט הביניים הבינארי 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. בדרך כלל, מקמפלים תוכניות של תוכנות הצללה (shaders) אופליין כחלק מתהליך היצירה של הנכסים למשחק, וכוללים את המודולים של SPIR-V כחלק מהנכסים של זמן הריצה.
שליחת קריאה ל-Vulkan API בזמן ריצה
כדי לשלוח קריאה ל-Vulkan API, המשחק צריך לקבל מצביעי פונקציות לקריאות ל-Vulkan API. הדרך הכי פשוטה לעשות את זה היא לקשר לספרייה המשותפת libvulkan.so, שנכללת ב-Android NDK. לקישור לספרייה יש שני חסרונות: תקורה נוספת של שליחת פונקציות ומגבלות על המצביעים לפונקציות של Vulkan API שמתקבלים באופן אוטומטי.
כשמפעילים פונקציה של Vulkan API, השליטה עוברת דרך טבלת שיגור שמנוהלת על ידי מבנה שנקרא Vulkan loader. מערכת ההפעלה Android משתמשת בהטמעה משלה של רכיב הטעינה של Vulkan ולא ברכיב הטעינה של LunarG. מערכת הטעינה הזו היא חלק מארכיטקטורת השכבות של Vulkan API. קישור לספריית המערכת בזמן ה-build גורם לרמת שליחה נוספת לקריאה נתונה ל-API. למרות שהתקורה קטנה, היא יכולה להיות מורגשת במשחקים שמבצעים נפחים גדולים של קריאות Vulkan.
ספריית המערכת בדרך כלל פותרת רק מצביעים לפונקציות של Vulkan שנחשבות לחלק מ-API הליבה. ל-Vulkan יש מספר גדול של תוספים שמגדירים פונקציות נוספות של Vulkan, ורבות מהן לא נפתרות באופן אוטומטי על ידי ספריית המערכת. צריך לפתור באופן ידני את המצביעים לפונקציות האלה של Vulkan לפני שמשתמשים בהן.
כדי לצמצם את הבעיות האלה, צריך לפתור באופן דינמי את המצביעים לכל פונקציות Vulkan שבהן אתם מתכוונים להשתמש בזמן הריצה. אחת הדרכים לעשות את זה היא להשתמש בספריית meta-loader בקוד פתוח, כמו volk. המשחק לדוגמה AGDKTunnel משלב את volk למטרה הזו. אם אתם משתמשים בספריית meta-loader, אל תקשרו לספרייה המשותפת 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, משתמשים בספריית Vulkan Profiles API בקוד פתוח. אפשר גם לנתח את קובץ ה-JSON של הפרופיל בעצמכם ולשלוח שאילתות לגבי יכולות המכשיר באמצעות ממשקי ה-API הרלוונטיים של Vulkan, כדי לקבוע את התאימות לפרופיל.
פרופילים של Vulkan
ב-Android נעשה שימוש בפרופילים של Vulkan, שמגדירים אילו תכונות ותוספים זמינים לכל אחד מהמכשירים שפועלים עם Android.
פרופיל Baseline ל-Android (ABP) הוא הניסיון הראשון ליצור פרופיל Vulkan. הפרופילים ABP2021 ו-ABP2022 הם פרופילים רטרוספקטיביים שנועדו לכסות יותר מ-85% מהמכשירים הפעילים באותה תקופה. לא יהיו יותר עדכונים של ABP.
פרופילי Vulkan ל-Android (VPA) הם הפרופילים החדשים שנועדו לשקף את הצרכים של מפתחי התוכנה ולספק תכונות עקביות ברגע שמפתחי החומרה יכולים לספק אותן. VPA15_minimums הוא הפרופיל הראשון ל-Android 15, וכל שנה יהיה VPA חדש לכל גרסה ראשית של Android.
הטמעת קצב פריימים
קצב פריימים תקין הוא חלק חיוני בחוויית גיימפליי איכותית. ערכת Android Game Development Kit כוללת את ספריית Frame Pacing, שעוזרת למשחק להגיע לקצב פריימים אופטימלי. לפרטים נוספים על ההטמעה, אפשר לעיין במאמר שילוב של Android Frame Pacing בכלי הרינדור של Vulkan.
אל תסתמכו על סנכרון מרומז ועל קצב פריימים
הפונקציות vkAcquireNextImageKHR ו-vkQueuePresentKHR משמשות לניהול שרשרת ההחלפה. אל תסתמכו על התנהגות החסימה הפוטנציאלית שלהם לסנכרון כללי של האפליקציה או ה-GPU.
האופן שבו הפונקציות האלה חוסמות את הגישה יכול להיות שונה מאוד בהתאם:
- מכשירי Android
- מנהלי התקנים של GPU
- מצבים של מנוע המצגות (VkPresentModeKHR)
המטרה היחידה של vkAcquireNextImageKHR היא להשיג תמונה זמינה שניתן להציג, והיא עשויה לחסום או לא לחסום. באופן דומה, הפונקציה vkQueuePresentKHR מוסיפה לתור בקשה להצגת תמונה, וגם היא עשויה לחסום או לא לחסום.
אף אחת מהפונקציות לא מספקת הבטחות מהימנות לסנכרון של משימות CPU או פעולות GPU לא קשורות.
כדי לבצע סנכרון חזק, תמיד צריך להשתמש בפרימיטיבים מפורשים של Vulkan, כמו סמפורים לתלויות GPU-GPU (למשל, render-to-present), גדרות לסנכרון GPU-CPU (למשל, לדעת מתי העיבוד הסתיים ב-CPU), ומחסומים או אירועים של צינור עיבוד נתונים (pipeline) לביצוע GPU מפורט יותר ותלויות בזיכרון. סנכרון מפורש מבטיח התנהגות צפויה ומונע באגים קטנים שנגרמים כתוצאה משינויים בתזמון שספציפיים להטמעה, שנובעים מהמערכת המגוונת של החומרה ב-Android.
הטמעת סבב מודעות לפני הסרטון
מכשירי Android יכולים להציג את המסך בכמה כיוונים. כיוון המכשיר יכול להיות שונה מכיוון משטח העיבוד. בניגוד ל-OpenGL ES ב-Android, Vulkan לא מטפל בפערים בין השניים. כדי להבין איך תהליך הכיוון פועל ומהי השיטה האופטימלית לטיפול בהבדלים בכיוון כשמשתמשים ב-Vulkan, אפשר לעיין במאמר בנושא טיפול בסיבוב המכשיר באמצעות סיבוב מראש של Vulkan.
פתרון בעיות וניתוח ביצועים של רינדור ב-Vulkan
יש כמה כלים שיכולים לעזור לכם לאבחן בעיות עיבוד ובעיות בביצועים בקוד העיבוד של Vulkan.
בקטע כלים ותכונות מתקדמות תוכלו למצוא מידע נוסף על כלי ניפוי הבאגים והפרופיילינג של Vulkan.
שכבות אימות של Vulkan
שכבות אימות של Vulkan הן ספריות זמן ריצה שאפשר להפעיל כדי לבדוק את הקריאות ל-Vulkan API, ולקבל אזהרות או שגיאות לגבי שימוש שגוי או לא אופטימלי. שכבות האימות האלה לא פעילות כברירת מחדל, כי תהליך האימות מוסיף תקורה בזמן הריצה ומשפיע על הביצועים של המשחק. במאמר ניפוי באגים באמצעות שכבת אימות מוסבר איך להשתמש בשכבות אימות במשחק.
כלים לצילום פריים
אפשר להשתמש בכלים לצילום פריימים כדי להקליט ולהפעיל מחדש את הקריאות ל-Vulkan API שבוצעו במהלך פריים של משחק. הכלים האלה מאפשרים לכם:
- לראות מידע על משאבים גרפיים פעילים והדמיות שלהם
- לראות את רצף הקריאות ל-API שהמשחק מבצע ואת הפרמטרים של ה-API
- בדיקת המצב של צינור עיבוד הנתונים הגרפי בזמן הבקשה להזזת פריט גרפי (draw call)
- הצגה חזותית של תוצאות הרינדור עד לבקשה להזזת פריט גרפי (draw call) ספציפית בפריים
אתם יכולים להשתמש בכלי RenderDoc בקוד פתוח כדי לתעד פריימים ממשחקים שפועלים ב-Android. RenderDoc תומך בצילום פריימים גם ב-Vulkan וגם ב-OpenGL ES.
אפשר להשתמש גם ב-Android GPU Inspector (AGI) כדי לתעד פריימים של Vulkan.
כלים לניתוח ביצועים
אתם יכולים להשתמש בכלים לניתוח ביצועים כדי לבדוק בעיות עיבוד במשחק שגורמות לקצב פריימים לא אופטימלי. ספקי GPU מסוימים מספקים כלים שנועדו ליצור פרופיל של המשחק ולספק נתוני ביצועים ספציפיים לארכיטקטורות ה-GPU שלהם. מאפייני הביצועים וצווארי הבקבוק של המשחק יכולים להשתנות באופן משמעותי כשמעבדים גרפיקה במעבדי GPU של ספקים שונים, או אפילו בדורות שונים של מעבדי GPU של אותו ספק.
אתם יכולים גם להשתמש ב-Android GPU Inspector כדי לאסוף ולנתח נתוני ביצועים. בניגוד לכלים של הספקים, Android GPU Inspector תואם למספר מעבדים גרפיים של ספקים שונים. עם זאת, Android GPU Inspector לא תומך במכשירי Android ישנים יותר, ויכול להיות שהוא לא תואם לכל המכשירים החדשים.
שיפור הבדיקות של Vulkan באמצעות CTS-D
יצרני מכשירים עם Android משתמשים בחבילה לבדיקות תאימות (CTS) כדי לוודא שהמכשירים שלהם תואמים. CTS-D (CTS-D – CTS שמופעל על ידי מפתחים) הן בדיקות שמפתחי אפליקציות ל-Android שולחים כדי לוודא שמכשירי Android עתידיים עומדים בתרחישי השימוש שלהם ויכולים להריץ את האפליקציות שלהם בצורה חלקה וללא באגים.
אם הצלחתם להפעיל באג חדש באפליקציית Vulkan שמשפיע על מכשיר ספציפי עם Android, אתם יכולים לשלוח הצעה לבדיקה חדשה, לתאר את הבעיה ולהציע דרכים לבדוק אותה. כך אפשר לוודא שהבעיה תתוקן בעדכון עתידי למכשיר, ושהבאג הזה לא יקרה במכשירים אחרים.
בתהליך השליחה של CTS מוסבר איך לשלוח את הצעת הבדיקה.