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

תחילת העבודה עם 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 לשנת 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
  • הידור קוד של שַדְרֵר ל-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, תוכניות של שידרים (shaders) צריכות להיות בפורמט הביניים הבינארי 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) אופליין כחלק מתהליך ה-build של הנכסים של המשחק, וכוללים את המודולים של SPIR-V כחלק מנכסי זמן הריצה.

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

כדי לקרוא ל-Vulkan API, המשחק צריך לקבל מצביע פונקציות לקריאות ל-Vulkan API. הדרך הפשוטה ביותר לעשות זאת היא ליצור קישור לספרייה המשותפת libvulkan.so, שכלולה ב-Android NDK. לקישור לספרייה יש שני חסרונות: עלות נוספת של שליחת פונקציות ומגבלות על האופן שבו נפתרים באופן אוטומטי מצביעים לפונקציות של 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 for 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 שלהם. מאפייני הביצועים וצווארי בקבוק במשחק עשויים להשתנות באופן משמעותי כשמבצעים עיבוד ב-GPUs של ספקים שונים, או אפילו ב-GPUs מדור שונה של אותו ספק.

אפשר גם להשתמש ב-Android GPU Inspector כדי לאסוף ולנתח נתוני ביצועים. בניגוד לכלים של הספקים, Android GPU Inspector תואם למספר מעבדי GPU מספקים שונים. עם זאת, Android GPU Inspector לא תומך במכשירי Android ישנים, ויכול להיות שהוא לא תואם לכל המכשירים החדשים.

שיפור בדיקות Vulkan באמצעות CTS-D

יצרני מכשירים עם Android משתמשים בחבילת בדיקות התאימות (CTS) כדי לוודא שהמכשירים שלהם תואמים. CTS שמופעל על ידי מפתחים (CTS-D) הן בדיקות שנשלחות על ידי מפתחי אפליקציות ל-Android כדי לוודא שמכשירי Android עתידיים יעמדו בתרחישי השימוש שלהם ויוכלו להריץ את האפליקציות שלהם בצורה חלקה וללא באגים.

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

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