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

איך מתחילים להשתמש ב-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 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. המשחקים האלה יכולים להיות מוגבלים על ידי המעבד (CPU) אם הם משתמשים בחלקים גדולים מזמן הפריימים שלהם במנהל ההתקן של הגרפיקה. בנוסף, המעבר מ-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 למטרה הזו. אם משתמשים בספריית meta-loader, לא מקשרים לספרייה המשותפת 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 לא מבטיחה שהגרסה הזו נתמכת על ידי מנהל ההתקן של 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, עם הוראות מפורטות לשליחת הצעת הבדיקה.