מנועי חיפוש מקומיים וקנייניים

איך מתחילים להשתמש ב-Vulkan ב-Android

‫Vulkan הוא ממשק ה-API העיקרי לגרפיקה ברמה נמוכה ב-Android. ‫Vulkan מספק ביצועים אופטימליים למשחקים שמטמיעים מנוע משחק ורכיב עיבוד משלהם.

כדי להטמיע את Vulkan במנוע המשחק שלכם בהצלחה, אתם צריכים:

  • זיהוי מכשירי Android שאפשר להשתמש בהם עם Vulkan
  • הסבר על היתרונות והחסרונות של תמיכה במכשירי Android ישנים
  • הוספת Vulkan ליעד הבנייה של Android
  • בחירת קומפיילר של Shader כדי ליצור SPIR-V עבור Vulkan
  • קביעת גרסת Vulkan API שזמינה בזמן ריצה
  • איך מבצעים אופטימיזציה של פעולות העיבוד של Vulkan באמצעות פרופילי Vulkan,‏ frame pacing וסיבוב מראש
  • בחירת כלי גרפיקה לניפוי באגים ולניתוח ביצועים
    הערה: למידע על שימוש ב-Vulkan ב-Android עם מנועי המשחקים Unity או Unreal, אפשר לעיין במאמרים הבאים:
  • Vulkan ב-Unity
  • Vulkan on Unreal

בחירת מפרטי מכשיר מינימליים ל-Vulkan

‫Vulkan זמין ב-Android החל מ-Android 7.0 (רמת API‏ 24). לא כל מכשירי Android עם Android 7.0 ומעלה תומכים ב-Vulkan. צריך לקבוע באילו מכשירי Android עם תמיכה ב-Vulkan המשחק שלכם תומך.

המלצות

אלה הדרישות המינימליות לתמיכה ב-Vulkan:

  • במכשיר פועלת מערכת Android מגרסה 10.0 (רמת API‏ 29) ואילך
  • המכשיר תומך בגרסה 1.1 ומעלה של Vulkan API
  • למכשיר יש יכולות חומרה ותכונות שתואמות לפרופיל הבסיסי של Android משנת 2022

תמיכה במכשירים ישנים

אם המשחק שלכם מיועד להפעלה במגוון רחב של מכשירים עם רמות שונות של יכולות גרפיות, יכול להיות שתצטרכו לתמוך במכשירים ישנים יותר מאלה שמומלצים במאמר בחירת מפרטים מינימליים של מכשירים ל-Vulkan. לפני שמוסיפים תמיכה במכשירים ישנים יותר, כדאי לבדוק אם Vulkan מספק יתרונות למשחק. במשחקים שיש בהם הרבה קריאות לציור ושהם משתמשים ב-OpenGL ES, יכול להיות שיהיה עומס משמעותי על הדרייבר בגלל העלות הגבוהה של ביצוע קריאות לציור ב-OpenGL ES. המשחקים האלה יכולים להיות מוגבלים על ידי המעבד אם הם משתמשים בחלקים גדולים מזמן הפריימים שלהם במנהל ההתקן של הגרפיקה. בנוסף, המעבר מ-OpenGL ES ל-Vulkan יכול להוביל להפחתה משמעותית בשימוש במעבד ובצריכת החשמל במשחקים. האפשרות הזו רלוונטית במיוחד אם במשחק יש סצנות מורכבות שלא ניתן להשתמש בהן ביעילות ב-instancing כדי לצמצם את קריאות הציור. כשמטרגטים מכשירים ישנים יותר, כדאי לכלול תמיכה בעיבוד של 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 כדי לקחת קוד שנכתב בשפת shader כמו GLSL או High-level Shader Language‏ (HLSL) ולבצע קומפילציה למודולים של SPIR-V לשימוש עם Vulkan.

אפשר להשתמש בקומפיילר shaderc כדי לקמפל תוכניות shader שנכתבו ב-GLSL ל-SPIR-V. אם המשחק שלכם משתמש ב-HLSL, הקומפיילר DirectXShaderCompiler תומך בפלט SPIR-V. בדרך כלל, אתם מבצעים קומפילציה של תוכניות Shader אופליין כחלק מתהליך בניית הנכסים של המשחק, וכוללים את מודולי SPIR-V כחלק מנכסי זמן הריצה.

קריאה ל-Vulkan API בזמן ריצה

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

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

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

כדי לצמצם את הבעיות האלה, צריך לפתור באופן דינמי את ההפניות לכל הפונקציות של Vulkan שבהן אתם מתכוונים להשתמש בזמן הריצה. אחת הדרכים לעשות זאת היא באמצעות ספריית meta-loader בקוד פתוח, כמו volk. משחק הדוגמה AGDKTunnel משלב את volk למטרה הזו. אם משתמשים בספריית טוען מטא, לא מקשרים לספרייה המשותפת libvulkan.soבסקריפטים של ה-build.

קביעת גרסת ה-API הזמינה של Vulkan

‫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 גבוהה יותר מהגרסה הבאה:

  • גרסת ה-API המקסימלית של Vulkan לגרסת 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 משנת 2022, אפשר להשתמש בספריית Vulkan Profiles API בקוד פתוח. אפשר גם לנתח את קובץ ה-JSON של הפרופיל בעצמכם ולשאול על יכולות המכשיר באמצעות ממשקי ה-API הרלוונטיים של Vulkan כדי לקבוע את התאימות לפרופיל.

פרופילים של Vulkan

מערכת Android משתמשת בפרופילי Vulkan, שבהם מוגדרים התכונות והתוספים שזמינים לכל אחד מהמכשירים שמופעלת בהם מערכת Android.

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

הטמעה של סיבוב מפתחות מראש

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