Mesin native dan eksklusif

Mulai menggunakan Vulkan di Android

Vulkan adalah API grafis tingkat rendah utama di Android. Vulkan memberikan performa optimal untuk game yang mengimplementasikan game engine dan perendernya sendiri.

Agar berhasil menerapkan Vulkan di game engine, Anda harus:

  • Mengidentifikasi perangkat Android yang akan digunakan dengan Vulkan
  • Memahami konsekuensi dari mendukung perangkat Android lama
  • Menambahkan Vulkan ke target build Android Anda
  • Memilih compiler shader guna membuat SPIR-V untuk Vulkan
  • Menentukan versi Vulkan API yang tersedia saat runtime
  • Mempelajari cara mengoptimalkan operasi rendering Vulkan dengan profil Vulkan, kecepatan frame, dan pra-rotasi
  • Memilih alat grafis untuk proses debug dan analisis performa

Memilih spesifikasi perangkat minimum untuk Vulkan

Vulkan tersedia di Android mulai Android 7.0 (level API 24). Tidak semua perangkat Android yang menjalankan Android 7.0 atau yang lebih tinggi mendukung Vulkan. Anda perlu menentukan perangkat Android berkemampuan Vulkan yang didukung game Anda.

Rekomendasi

Gunakan spesifikasi berikut sebagai persyaratan minimum untuk dukungan Vulkan:

  • Perangkat menjalankan Android 10.0 (level API 29) atau yang lebih baru
  • Perangkat mendukung Vulkan API versi 1.1 atau yang lebih tinggi
  • Perangkat memiliki kemampuan dan fitur hardware yang kompatibel dengan Profil Dasar Pengukuran Android 2022

Dukungan perangkat yang lebih lama

Jika game Anda dirancang untuk berjalan di berbagai perangkat dengan berbagai tingkat kemampuan grafis, Anda mungkin perlu mendukung perangkat yang lebih lama dari yang direkomendasikan dalam Memilih spesifikasi perangkat minimum untuk Vulkan. Sebelum membuat dukungan untuk perangkat yang lebih lama, evaluasi apakah Vulkan memberikan manfaat bagi game Anda. Game yang memiliki banyak panggilan gambar dan yang menggunakan OpenGL ES dapat mengalami overhead driver yang signifikan karena tingginya biaya pembuatan panggilan gambar dalam OpenGL ES. Game ini dapat terikat dengan CPU karena menghabiskan sebagian besar waktu render frame-nya dalam driver grafis. Game juga dapat mengalami pengurangan penggunaan CPU dan daya yang signifikan dengan beralih dari OpenGL ES ke Vulkan. Hal ini terutama berlaku jika game Anda memiliki scene kompleks yang tidak dapat menggunakan instance secara efektif untuk mengurangi panggilan gambar. Saat menargetkan perangkat yang lebih lama, sertakan dukungan rendering OpenGL ES sebagai penggantian, karena beberapa perangkat dalam daftar perangkat target mungkin memiliki implementasi Vulkan yang tidak dapat menjalankan game dengan andal.

Anda mungkin tidak ingin mendukung perangkat lama yang mendukung Vulkan karena perangkat tersebut tidak memiliki performa dan fitur atau memiliki masalah stabilitas.

Performa dan Fitur

Perangkat Android lama yang mendukung Vulkan mungkin tidak memiliki performa rendering atau dukungan hardware untuk fitur yang diperlukan guna menjalankan game Anda. Hal ini sangat mungkin terjadi jika game Anda memiliki grafis fidelitas tinggi dan Vulkan adalah satu-satunya API yang Anda targetkan di Android. Banyak perangkat lama yang terbatas pada Vulkan API versi 1.0.3 dan sering kali tidak memiliki ekstensi Vulkan yang banyak digunakan, yang tersedia di hardware yang lebih modern.

Stabilitas

Perangkat Android lama mungkin menggunakan driver Vulkan yang sudah usang. Versi driver ini mungkin memiliki bug yang dapat memengaruhi stabilitas game. Mengatasi bug driver mungkin memerlukan banyak waktu pengujian dan rekayasa.

Menambahkan Vulkan ke project Anda

Untuk menambahkan Vulkan ke project, Anda perlu:

  • Menyertakan header Vulkan API
  • Mengompilasi kode shader ke SPIR-V
  • Memanggil Vulkan API saat runtime

Menyertakan header Vulkan API

Game Anda harus menyertakan file header Vulkan API untuk mengompilasi kode yang menggunakan Vulkan. Anda dapat menemukan salinan header Vulkan di Android NDK atau yang dipaketkan dalam rilis Vulkan SDK. Versi NDK tertentu hanya menyertakan header Vulkan yang tersedia pada saat rilis NDK. Jika Anda menggunakan header Vulkan dari NDK, gunakan NDK versi 25 atau yang lebih tinggi, yang mencakup file header yang mendukung Vulkan versi 1.3. Vulkan SDK memiliki header versi terbaru.

Mengompilasi kode shader ke SPIR-V

Vulkan API mengharapkan program shader disediakan dalam format menengah biner SPIR-V. Konvensi ini berbeda dengan OpenGL ES, yang memungkinkan Anda mengirimkan kode sumber yang ditulis dalam OpenGL Shading Language (GLSL) sebagai string teks. Gunakan compiler shader untuk mengambil kode yang ditulis dalam bahasa shader seperti GLSL atau High-level Shader Language (HLSL), lalu kompilasi ke modul SPIR-V untuk digunakan dengan Vulkan.

Compiler shaderc dapat digunakan untuk mengompilasi program shader yang ditulis dalam GLSL menjadi SPIR-V. Jika game Anda menggunakan HLSL, DirectXShaderCompiler mendukung output SPIR-V. Biasanya, Anda akan mengompilasi program shader secara offline sebagai bagian dari proses build aset untuk game dan menyertakan modul SPIR-V sebagai bagian dari aset runtime.

Memanggil Vulkan API saat runtime

Untuk memanggil Vulkan API, game Anda perlu mendapatkan pointer fungsi ke panggilan Vulkan API. Cara paling mudah untuk melakukannya adalah dengan menautkan ke library bersama libvulkan.so, yang disertakan dalam Android NDK. Penautan ke library memiliki dua kekurangan: overhead pengiriman fungsi tambahan dan batasan di mana pointer fungsi Vulkan API akan otomatis di-resolve.

Saat Anda memanggil fungsi Vulkan API, kontrol akan melewati tabel pengiriman yang dikelola oleh konstruksi yang disebut loader Vulkan. Android menggunakan implementasi loader Vulkan-nya sendiri, bukan loader LunarG. Sistem loader ini adalah bagian dari arsitektur lapisan Vulkan API. Menautkan ke library sistem pada waktu build akan menghasilkan tingkat pengiriman tambahan untuk panggilan API tertentu. Meskipun kecil, overhead ini dapat terlihat untuk game yang melakukan panggilan Vulkan dalam volume tinggi.

Library sistem umumnya hanya me-resolve pointer ke fungsi Vulkan yang dianggap sebagai bagian dari API inti. Vulkan memiliki banyak ekstensi yang menentukan fungsi Vulkan tambahan, dan banyak di antaranya tidak otomatis di-resolve oleh library sistem. Anda harus me-resolve pointer secara manual ke fungsi Vulkan ini sebelum menggunakannya.

Untuk mengurangi masalah ini, resolve pointer secara dinamis ke semua fungsi Vulkan yang ingin Anda gunakan saat runtime. Salah satu cara untuk melakukannya adalah dengan menggunakan library meta-loader open source seperti volk. Contoh game AGDKTunnel mengintegrasikan volk untuk tujuan ini. Jika Anda menggunakan library meta-loader, jangan tautkan ke library bersama libvulkan.so dalam skrip build Anda.

Menentukan versi Vulkan API yang tersedia

Android mendukung versi Vulkan API berikut:

  • 1.0.3
  • 1.1
  • 1.3

Nomor versi Vulkan API tertinggi yang tersedia di perangkat tertentu ditentukan berdasarkan versi Android dan dukungan driver Vulkan.

Versi Android

Dukungan platform untuk versi Vulkan API bergantung pada versi Android minimum (level API):

  • 1.3 — Android 13.0 (level API 33) dan yang lebih tinggi
  • 1.1 — Android 10.0 (level API 29) dan yang lebih tinggi
  • 1.0.3 — Android 7.0 (level API 24) dan yang lebih tinggi

Dukungan driver Vulkan

Dukungan platform Android untuk versi Vulkan API tidak menjamin versi API-nya didukung oleh driver Vulkan perangkat. Perangkat yang menjalankan Android 13 mungkin hanya mendukung Vulkan API versi 1.1.

Saat menginisialisasi Vulkan, jangan meminta versi API yang lebih tinggi dari:

Berikut adalah contoh penentuan versi Vulkan API tertinggi yang didukung:

// 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;
}

Menentukan kompatibilitas profil Vulkan

Profil Vulkan adalah file JSON yang menentukan serangkaian fitur, ekstensi, kemampuan, dan batas parameter minimum yang diperlukan dan harus didukung perangkat Vulkan agar kompatibel dengan profil. Untuk menentukan apakah perangkat kompatibel dengan profil Vulkan tertentu, seperti Profil Dasar Pengukuran Android 2022, gunakan library Vulkan Profiles API open source. Anda juga dapat mengurai file JSON profil sendiri dan meng-kueri kemampuan perangkat menggunakan Vulkan API yang relevan untuk menentukan kompatibilitas profil.

Profil Vulkan

Android menggunakan Profil Vulkan yang menentukan fitur dan ekstensi yang tersedia untuk setiap perangkat yang menjalankan Android.

Profil Dasar Pengukuran Android (ABP) adalah upaya pertama dalam mem-build Profil Vulkan. ABP2021 dan ABP2022 adalah profil yang melihat ke belakang dan bertujuan untuk mencakup > 85% perangkat aktif pada saat itu. Tidak akan ada ABP baru ke depannya.

Profil Vulkan untuk Android (VPA) adalah profil baru yang berorientasi ke depan yang bertujuan untuk mencerminkan kebutuhan developer software dan mendorong fitur yang konsisten segera setelah developer hardware dapat mengirimkannya. VPA15_minimums adalah profil pertama untuk Android 15 dan akan ada VPA baru setiap tahun untuk mencakup setiap rilis Android utama.

Menerapkan pengaturan kecepatan frame

Kecepatan frame yang tepat adalah bagian penting dalam memberikan pengalaman gameplay berkualitas tinggi. Android Game Development Kit menyertakan library Frame Pacing untuk membantu game Anda mencapai kecepatan frame yang optimal. Untuk detail penerapan selengkapnya, lihat Mengintegrasikan Android Frame Pacing ke dalam perender Vulkan.

Menerapkan pra-rotasi

Perangkat Android dapat ditampilkan dalam beberapa orientasi. Orientasi perangkat mungkin berbeda dengan orientasi platform render. Tidak seperti OpenGL ES di Android, Vulkan tidak menangani perbedaan di antara keduanya. Untuk memahami cara kerja proses orientasi dan metode yang optimal untuk menangani perbedaan orientasi saat menggunakan Vulkan, lihat Menangani rotasi perangkat dengan pra-rotasi Vulkan.

Memecahkan masalah dan membuat profil rendering Vulkan

Beberapa alat tersedia untuk membantu Anda mendiagnosis masalah rendering dan masalah performa dengan kode rendering Vulkan.

Untuk informasi selengkapnya tentang alat proses debug dan pembuatan profil Vulkan, lihat bagian Alat & fitur lanjutan.

Lapisan validasi Vulkan

Lapisan validasi Vulkan adalah library runtime yang dapat diaktifkan untuk memeriksa panggilan ke Vulkan API dan memberikan peringatan atau error tentang penggunaan yang salah atau tidak optimal. Lapisan validasi ini tidak aktif secara default, karena proses validasi menambahkan overhead runtime dan memengaruhi performa game Anda. Untuk mengetahui informasi tentang cara menggunakan lapisan validasi dengan game, lihat Men-debug dengan lapisan validasi.

Alat perekam frame

Gunakan alat perekam frame untuk merekam dan memutar ulang panggilan Vulkan API yang dilakukan selama frame game. Alat ini memungkinkan Anda:

  • Melihat informasi tentang dan visualisasi dari aset grafis aktif
  • Melihat urutan panggilan API yang dilakukan oleh game Anda dan melihat parameter API
  • Mempelajari status pipeline grafis pada saat panggilan gambar
  • Memvisualisasikan hasil rendering untuk panggilan gambar tertentu dalam frame

Gunakan alat RenderDoc open source untuk merekam frame dari game yang berjalan di Android. RenderDoc mendukung perekaman frame Vulkan dan OpenGL ES.

Android GPU Inspector (AGI) juga dapat digunakan untuk merekam frame Vulkan.

Alat analisis performa

Gunakan alat analisis performa untuk menyelidiki masalah rendering dalam game yang menyebabkan kecepatan frame kurang optimal. Setiap vendor GPU menyediakan alat yang dirancang untuk membuat profil game Anda dan memberikan data performa khusus untuk arsitektur GPU mereka. Karakteristik performa dan bottleneck game Anda dapat bervariasi secara signifikan saat merender dengan GPU dari vendor yang berbeda atau bahkan pada generasi GPU yang berbeda dari vendor yang sama.

Anda juga dapat menggunakan Android GPU Inspector untuk mengumpulkan dan menganalisis data performa. Tidak seperti alat vendor, Android GPU Inspector kompatibel dengan beberapa GPU dari vendor yang berbeda. Namun, Android GPU Inspector tidak mendukung perangkat Android lama dan mungkin tidak kompatibel dengan semua perangkat baru.

Meningkatkan pengujian Vulkan dengan CTS-D

Produsen perangkat yang didukung Android menggunakan Compatibility Test Suite (CTS) untuk membantu memastikan perangkat mereka kompatibel. CTS yang Didukung Developer (CTS-D) adalah pengujian yang dikirimkan oleh developer aplikasi Android untuk memastikan bahwa perangkat Android mendatang memenuhi kasus penggunaan mereka dan dapat menjalankan aplikasi mereka dengan lancar dan tanpa bug.

Jika Anda berhasil memicu bug baru dengan aplikasi Vulkan yang memengaruhi perangkat Android tertentu, Anda dapat mengirimkan proposal pengujian baru, yang menjelaskan masalah dan cara memeriksanya. Hal ini memastikan bahwa masalah tersebut diperbaiki dalam update mendatang untuk perangkat, dan juga memastikan bahwa bug yang sama tidak akan terjadi pada perangkat lain.

Lihat proses pengiriman CTS untuk mendapatkan petunjuk langkah demi langkah tentang cara mengirimkan proposal pengujian.