תחילת העבודה עם Vulkan ב-Android
Vulkan הוא ה-API הראשי ברמה נמוכה לגרפיקה ב-Android. Vulkan מספק ביצועים אופטימליים למשחקים שמטמיעים מנוע משחק ונגן גרפיקה משלהם.
כדי להטמיע את Vulkan במנוע המשחק, צריך:
- זיהוי מכשירי Android שבהם אפשר להשתמש ב-Vulkan
- להבין את היתרונות של תמיכה במכשירי Android ישנים יותר
- הוספת Vulkan ליעד ה-build של Android
- בחירת מְהַמְר (compiler) של קוד שַדְר (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 ואילך
- המכשיר כולל יכולות חומרה ותכונות שתואמות לפרופיל Android Baseline לשנת 2022
תמיכה במכשירים ישנים
אם המשחק שלכם מיועד לפעול במגוון רחב של מכשירים עם רמות שונות של יכולות גרפיקה, יכול להיות שתצטרכו לתמוך במכשירים ישנים יותר מאלה המומלצים בקטע בחירת מפרטים מינימלי למכשירים ל-Vulkan. לפני שיוצרים תמיכה במכשירים ישנים, כדאי לבדוק אם Vulkan מספקת את היתרונות למשחק. במשחקים עם הרבה קריאות לציור שמשתמשים ב-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) כדי לקחת קוד שנכתב בשפה של תוכנת ההצללה (shader), כמו GLSL או High-level Shader Language (HLSL) כדי להדר אותו למודולים של SPIR-V לשימוש עם Vulkan.
אפשר להשתמש במהדר shaderc כדי לקמפל תוכניות של שגיאות שנכתבו ב-GLSL ל-SPIR-V. אם המשחק שלכם משתמש ב-HLSL, ה-DirectXShaderCompiler תומך בפלט SPIR-V. בדרך כלל, לוקחים תוכנות של תוכנת ההצללה (shader) אופליין כחלק מתהליך בניית הנכסים של המשחק, וכוללים את המודולים SPIR-V כחלק מהנכסים הדיגיטליים שבסביבת זמן הריצה.
קריאה ל-Vulkan API בזמן הריצה
כדי לקרוא ל-Vulkan API, המשחק צריך לקבל מצביע פונקציות לקריאות ל-Vulkan API. הדרך הפשוטה ביותר לעשות זאת היא ליצור קישור לספרייה המשותפת libvulkan.so
, הכלולה ב-NDK של Android. לקישור לספרייה יש שני חסרונות: עלות נוספת של שליחת פונקציות ומגבלות על האופן שבו נפתרים באופן אוטומטי מצביעים לפונקציות של Vulkan API.
כשקוראים לפונקציה של Vulkan API, השליטה עוברת דרך טבלת תזמון שמנוהלת על ידי מבנה שנקרא Vulkan loader. ב-Android נעשה שימוש בהטמעה משלו של Vulkan loader, ולא ב-loader של LunarG. מערכת הטעינה הזו היא חלק מארכיטקטורת השכבות של Vulkan API. קישור לספריית המערכת בזמן ה-build יוצר רמת שליחה נוספת לקריאה נתונה ל-API. עלות העלויות המשניות קטנה, אבל היא יכולה להיות משמעותית במשחקים שמבצעים כמויות גדולות של קריאות ל-Vulkan.
בדרך כלל, ספריית המערכת פותרת רק הפניות לפונקציות Vulkan שנחשבות לחלק מ-API הליבה. ל-Vulkan יש מספר גדול של תוספים שמגדירים פונקציות נוספות של Vulkan, שרבות מהן לא נפתרות באופן אוטומטי על ידי ספריית המערכת. לפני שמשתמשים בפונקציות האלה ב-Vulkan, צריך לפתור את ההפניות אליהן באופן ידני.
כדי לצמצם את הבעיות האלה, צריך לפתור באופן דינמי את ההפניות לכל הפונקציות של Vulkan שבהן אתם מתכוונים להשתמש במהלך זמן הריצה. אחת הדרכים לעשות זאת היא להשתמש בספריית מטא-טעינה בקוד פתוח, כמו 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.
Android Baseline Profile (ABP) הוא הניסיון הראשון ליצירת פרופיל Vulkan. ABP2021 ו-ABP2022 הם פרופילים שפונים לאחור, שמטרתם לכסות יותר מ-85% מהמכשירים הפעילים באותו זמן. לא יהיו מודעות ABP חדשות מעכשיו והלאה.
Vulkan Profiles ל-Android (VPA) הוא הפרופיל החדש לעתיד, שמטרתו לשקף את הצרכים של מפתחי התוכנה ולפתח תכונות עקביות ברגע שמפתחי חומרה יוכלו לספק אותן. VPA15_minimums הוא הפרופיל הראשון ל-Android 15, ויהיו פרופילים חדשים של VPA מדי שנה כדי לכסות כל גרסה ראשית של Android.
הטמעת קצב מסגרות
קצב פריימים נכון הוא חלק חיוני ביצירת חוויית משחק איכותית. Android Game Development Kit כולל את הספרייה של קצב הפריימים, שבעזרתה תוכלו לשפר את קצב הפריימים במשחק. לפרטים נוספים על ההטמעה, ראו שילוב של Android Frame Pacing ב-renderer של 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 מפורטות הוראות מפורטות לשליחת הצעת הבדיקה.