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

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

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

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

  • זיהוי מכשירי Android לשימוש עם Vulkan
  • הסבר על היתרונות והחסרונות של תמיכה במכשירי Android ישנים
  • הוספת Vulkan ליעד הבנייה של Android
  • בחירת קומפיילר של Shader כדי ליצור 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. המשחקים האלה יכולים להיות מוגבלים על ידי המעבד, כי הם משקיעים חלקים גדולים מזמן רינדור הפריים שלהם במנהל ההתקן של הגרפיקה. בנוסף, במשחקים יכולה להיות ירידה משמעותית בשימוש במעבד ובצריכת החשמל אם עוברים מ-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 releases. כל גרסה ספציפית של 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 אופליין כחלק מתהליך build של הנכסים של המשחק, וכוללים את מודולי SPIR-V כחלק מנכסי זמן הריצה.

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

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

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

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

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

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

פרופיל ה-Baseline של Android ‏ (ABP) הוא הניסיון הראשון ליצור פרופיל Vulkan. ‫ABP2021 ו-ABP2022 הם פרופילים שמתייחסים לעבר ומטרתם לכסות יותר מ-85% מהמכשירים הפעילים באותו זמן. לא יהיה יותר ABP.

פרופילים של Vulkan ל-Android‏ (VPA) הם פרופילים חדשים שנועדו לשקף את הצרכים של מפתחי תוכנה ולספק תכונות עקביות ברגע שמפתחי חומרה יכולים לספק אותן. ‫VPA15_minimums הוא הפרופיל הראשון ל-Android 15, ובכל שנה יהיה VPA חדש כדי לכסות כל מהדורה מרכזית של Android.

הטמעה של קצב פריימים

קצב פריימים תקין הוא חלק חיוני בחוויית משחק איכותית. ‫Android Game Development Kit (ערכת פיתוח משחקים ל-Android) כוללת את הספרייה 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
  • בדיקת מצב צינור הגרפיקה בזמן קריאה לציור
  • הדמיה של תוצאות הרינדור עד לבקשה ספציפית להזזת פריט גרפי (draw call) בפריים

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

כאן מפורט תהליך שליחת הצעת הבדיקה.