Mechanizmy natywne i zastrzeżone

Pierwsze kroki z interfejsem Vulkan na Androidzie

Vulkan to podstawowy interfejs API niskiego poziomu interfejsu graficzny na Androidzie. Interfejs Vulkan zapewnia optymalną wydajność gier z własnym mechanizmem renderowania i mechanizmem renderowania.

Aby poprawnie wdrożyć interfejs Vulkan w silniku gry, musisz:

  • Określ, które urządzenia z Androidem mają obsługiwać interfejs Vulkan
  • Wady obsługi starszych urządzeń z Androidem
  • Dodaj interfejs Vulkan do celu kompilacji Androida
  • Wybierz kompilator do cieniowania, aby utworzyć SPIR-V dla interfejsu Vulkan
  • Określanie dostępnej wersji interfejsu Vulkan API w czasie działania
  • Dowiedz się, jak zoptymalizować operacje renderowania interfejsu Vulkan za pomocą profili Vulkan, tempa klatek i wstępnej rotacji
  • Wybierz narzędzia graficzne do debugowania i analizy wydajności
    Uwaga: informacje o korzystaniu z interfejsu Vulkan na Androidzie z silnikami gier Unity lub Unreal znajdziesz tutaj:
  • Vulkan w Unity
  • Vulkan w Unreal

Wybierz minimalne specyfikacje urządzenia Vulkan

Interfejs Vulkan jest dostępny na urządzeniach z Androidem od wersji 7.0 (poziom API 24). Nie wszystkie urządzenia z Androidem 7.0 lub nowszym obsługują interfejs Vulkan. Musisz określić, które urządzenia z Androidem z obsługą interfejsu Vulkan obsługuje Twoja gra.

Rekomendacje

Jako minimalne wymagania dla obsługi interfejsu Vulkan zastosuj te specyfikacje:

  • Urządzenie korzysta z Androida 10.0 (poziom interfejsu API 29) lub nowszego.
  • Urządzenie obsługuje interfejs Vulkan API w wersji 1.1 lub nowszej
  • Urządzenie ma dostępne funkcje sprzętowe i funkcje zgodne z profilem Baseline na Androidzie w 2022 r.

Obsługa starszych urządzeń

Jeśli Twoja gra jest zaprojektowana do działania na szerokiej gamie urządzeń o różnym poziomie możliwości graficznych, może być konieczne obsługę urządzeń starszych niż zalecane w artykule Wybieranie minimalnej specyfikacji urządzeń dla interfejsu Vulkan. Zanim utworzysz obsługę starszych urządzeń, zastanów się, czy interfejs Vulkan zapewnia korzyści w Twojej grze. Gry z wieloma wywołaniami rysowania, które używają OpenGL ES, mogą pochwalić się znacznym nadmiarem sterowników ze względu na wysokie koszty wywoływania rysowania w środowisku OpenGL ES. W przypadku takich gier duża część czasu renderowania klatki może być ograniczona przez procesor graficzny. Po przejściu z interfejsu OpenGL ES na Vulkan gry mogą także znacznie obniżyć obciążenie procesora i energii. Jest to szczególnie przydatne, gdy w grze znajdują się złożone sceny, których nie można skutecznie wykorzystać w celu ograniczenia wywołań rysowania. Jeśli kierujesz reklamy na starsze urządzenia, dodaj obsługę renderowania OpenGL ES w ramach kreacji zastępczej, ponieważ niektóre urządzenia na liście urządzeń docelowych mogą mieć implementacje Vulkan, które nie mogą działać prawidłowo.

Możesz nie chcieć obsługiwać starszych urządzeń z obsługą interfejsu Vulkan, ponieważ nie są one wydajne i mają funkcje lub występują problemy ze stabilnością.

Wydajność i funkcje

Starsze urządzenia z Androidem i obsługą interfejsu Vulkan mogą nie mieć wydajności renderowania ani obsługi sprzętowej funkcji niezbędnych do uruchomienia gry. Jest to szczególnie prawdopodobne, jeśli Twoja gra ma wysoką jakość grafiki, a Vulkan to jedyny interfejs API, na który kierujesz reklamy na Androida. Wiele starszych urządzeń ma ograniczony interfejs Vulkan API do wersji 1.0.3 i często nie ma w nich powszechnie używanych rozszerzeń Vulkan dostępnych na bardziej nowoczesnym sprzęcie.

Stabilność

Starsze urządzenia z Androidem mogą używać nieaktualnych sterowników Vulkan. Mogą one zawierać błędy, które wpływają na stabilność gry. Praca nad błędami sterowników może wiązać się z wieloma czasami testowania i projektowania.

Dodaj do projektu interfejs Vulkan

Aby dodać interfejs Vulkan do projektu:

  • Uwzględnij nagłówki interfejsu Vulkan API
  • Kompilowanie kodu cieniowania do SPIR-V
  • Wywoływanie interfejsu Vulkan API w czasie działania

Uwzględnij nagłówki interfejsu Vulkan API

Gra musi zawierać pliki nagłówka interfejsu Vulkan API, aby skompilować kod korzystający z Vulkana. Kopię nagłówków Vulkan znajdziesz w pakiecie NDK na Androida lub w wersjach pakietu SDK Vulkan. Każda wersja NDK zawiera tylko nagłówki Vulkan dostępne w momencie wydania pakietu. Jeśli używasz nagłówków Vulkan z pakietu NDK, użyj pakietu NDK w wersji 25 lub nowszej, która zawiera pliki nagłówka obsługujące interfejs Vulkan w wersji 1.3. Pakiet SDK Vulkan ma najnowszą wersję nagłówków.

Kompilowanie kodu cieniowania do SPIR-V

Interfejs Vulkan API wymaga, aby programy do cieniowania były udostępniane w formacie binarnym SPIR-V. Konwencja ta różni się od OpenGL ES, gdzie można przesyłać kod źródłowy napisany w języku OpenGL Shading Language (GLSL) jako ciągi tekstowe. Użyj kompilatora do cieniowania, aby pobrać kod napisany w języku cieniowania (takim jak GLSL lub HLSL) (High-level Shader Language) i skompilować go w moduły SPIR-V do użytku z interfejsem Vulkan.

Kompilator shaderc może służyć do kompilowania programów do cieniowania zapisanych w GLSL do SPIR-V. Jeśli Twoja gra korzysta z HLSL, DirectXShaderCompiler obsługuje dane wyjściowe SPIR-V. Programy do cieniowania są zwykle kompilowane offline w ramach procesu tworzenia zasobów gry i dołączane do zasobów środowiska wykonawczego.

Wywoływanie interfejsu Vulkan API w czasie działania

Aby móc wywołać interfejs Vulkan API, gra musi uzyskać wskaźniki funkcji do wywołań interfejsu API interfejsu Vulkan. Najprostszym sposobem jest połączenie konta z zasobami współdzielonymi libvulkan.so, które są częścią pakietu NDK Androida. Jeśli chodzi o łączenie z biblioteką, ma to 2 wady: dodatkowe narzuty wysyłania funkcji i ograniczenia, w przypadku których wskaźniki funkcji interfejsu Vulkan API są automatycznie naprawiane.

Gdy wywołujesz funkcję interfejsu Vulkan API, element sterujący przekazuje przez tabelę wysyłkową zarządzaną przez konstrukt o nazwie Loader Vulkan. Android używa własnej implementacji modułu ładowania Vulkan, a nie modułu ładowania LunarG. Ten system wczytywania jest częścią architektury warstwy interfejsu Vulkan API. Połączenie z biblioteką systemową w czasie kompilacji skutkuje dodatkowym poziomem wysyłania danego wywołania interfejsu API. Choć ten koszt jest niewielki, może być zauważalny w przypadku gier z dużą liczbą wywołań Vulkana.

Biblioteka systemowa zwykle rozpoznaje tylko wskaźniki do funkcji interfejsu Vulkan, które są częścią podstawowego interfejsu API. Interfejs Vulkan ma dużą liczbę rozszerzeń, które definiują dodatkowe funkcje interfejsu Vulkan. Wiele z nich nie jest rozpoznawanych automatycznie przez bibliotekę systemową. Przed użyciem tych funkcji interfejsu Vulkan musisz ręcznie rozpoznać wskaźniki do tych funkcji.

Aby ograniczyć te problemy, dynamicznie rozpoznawaj wskaźniki na wszystkie funkcje interfejsu Vulkan, których zamierzasz używać w czasie działania. Można to zrobić na przykład za pomocą biblioteki open source meta-loadera, takiej jak volk. Przykładowa gra AGDKTunnel integruje w tym celu Volk. Jeśli używasz biblioteki meta-loader, nie twórz w skryptach kompilacji linków do zasobów wspólnych libvulkan.so.

Określ dostępną wersję interfejsu Vulkan API

Android obsługuje te wersje interfejsu Vulkan API:

  • 1.0.3
  • 1,1
  • 1.3

Najwyższy numer wersji interfejsu Vulkan API dostępny na danym urządzeniu zależy od wersji Androida i obsługi sterownika Vulkan.

Wersja Androida

Obsługa platformy interfejsu Vulkan API zależy od minimalnej wersji Androida (poziom interfejsu API):

  • 1.3 – Android 13.0 (poziom interfejsu API 33) i nowsze
  • 1.1 – Android 10.0 (poziom interfejsu API 29) i nowsze
  • 1.0.3 – Android 7.0 (poziom interfejsu API 24) i nowsze wersje

Obsługa sterownika Vulkan

Obsługa wersji interfejsu Vulkan API przez platformę Androida nie gwarantuje, że wersja interfejsu API jest obsługiwana przez sterownik Vulkan urządzenia. Urządzenie z Androidem 13 może obsługiwać tylko interfejs Vulkan API w wersji 1.1.

Podczas inicjowania interfejsu Vulkan nie żądaj wersji interfejsu API wyższej niż:

Oto przykład określania najwyższej obsługiwanej wersji interfejsu API Vulkan:

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

Określanie zgodności profilu Vulkan

Profile Vulkan to pliki JSON określające zestaw wymaganych funkcji, rozszerzeń, możliwości i minimalnych limitów parametrów, które urządzenie Vulkan musi obsługiwać, aby było zgodne z profilem. Aby sprawdzić, czy urządzenie jest zgodne z konkretnym profilem Vulkan, takim jak profil podstawowy w Androidzie z 2022 r., skorzystaj z biblioteki interfejsu Vulkan Profiles API w modelu open source. Możesz też samodzielnie przeanalizować plik JSON profilu i zapytać o możliwości urządzenia za pomocą odpowiednich interfejsów API Vulkan, aby sprawdzić zgodność profilu.

Profile Vulkan

Android korzysta z profili Vulkan, które określają, jakie funkcje i rozszerzenia są dostępne na poszczególnych urządzeniach z Androidem.

Android Baseline Profile (ABP) to pierwsza próba stworzenia profilu Vulkan. ABP2021 i ABP2022 to wstecznie wyglądające profile, które mają obejmować ponad 85% aktywnych urządzeń w danym czasie. Nie będzie w przyszłości nowy system ABP.

Vulkan Profiles for Android (VPA) to nowy, przyszłościowy profil, który ma odzwierciedlić potrzeby deweloperów oprogramowania i udostępniać spójne funkcje, gdy tylko deweloperzy sprzętu mogą je dostarczyć. VPA15_minimums to pierwszy profil w przypadku Androida 15. Co roku będzie pojawiać się nowy VPA obejmujący każdą główną wersję Androida.

Wdróż tempo klatek

Właściwe tempo klatek jest kluczowym elementem zapewniania wysokiej jakości rozgrywki. Pakiet Android Game Development Kit zawiera bibliotekę Frame Pacing, która pomaga grze osiągnąć optymalne tempo klatek. Więcej informacji o implementacji znajdziesz w artykule o integracji Android Frame Pacing z mechanizmem renderowania Vulkan.

Wdrażanie rotacji przed rotacją

Urządzenia z Androidem mogą wyświetlać się w wielu orientacjach. Orientacja urządzenia może się różnić od orientacji powierzchni renderowania. W przeciwieństwie do OpenGL ES na Androidzie interfejs Vulkan nie obsługuje rozbieżności między nimi. Aby dowiedzieć się, jak działa proces orientacji i jak najlepiej radzić sobie z różnicami w orientacji w przypadku interfejsu Vulkan, przeczytaj sekcję Obrót urządzenia za pomocą tej funkcji.

Rozwiązywanie problemów z renderowaniem interfejsu Vulkan i ich profilowanie

Dostępnych jest wiele narzędzi, które pomogą Ci diagnozować problemy z renderowaniem i wydajnością kodu renderowania Vulkan.

Więcej informacji o narzędziach do debugowania i profilowania Vulkan znajdziesz w sekcji Narzędzia i funkcje zaawansowane.

Warstwy walidacji interfejsu Vulkan

Warstwy walidacji Vulkan to biblioteki środowiska wykonawczego, które można włączyć, aby sprawdzać wywołania interfejsu Vulkan API i wyświetlać ostrzeżenia lub błędy dotyczące nieprawidłowego lub nieoptymalnego użycia. Te warstwy weryfikacyjne nie są domyślnie aktywne, ponieważ proces weryfikacji zwiększa nakład pracy podczas działania i wpływa na wydajność gry. Więcej informacji o używaniu warstw weryfikacji w grze znajdziesz w artykule Debugowanie z warstwą weryfikacji.

Narzędzia do przechwytywania klatek

Używaj narzędzi do przechwytywania klatek, aby nagrywać i odtwarzać wywołania interfejsu API interfejsu Vulkan wykonane w trakcie klatki gry. Dzięki tym narzędziom możesz:

  • Wyświetl informacje o aktywnych zasobach graficznych i wizualizacje
  • Zobacz sekwencję wywołań interfejsu API wysyłanych przez Twoją grę i zapoznaj się z parametrami interfejsu API.
  • Eksplorowanie stanu potoku graficznego w czasie wywołania rysowania
  • Zwizualizuj wyniki renderowania aż do określonego wywołania rysowania w ramce

Użyj narzędzia open source RenderDoc, aby przechwycić klatki z gier uruchomionych na Androidzie. RenderDoc obsługuje przechwytywanie klatek w przypadku platformy Vulkan i OpenGL ES.

Do przechwytywania klatek Vulkan można też używać narzędzia Android GPU Inspector (AGI).

Narzędzia do analizy skuteczności

Użyj narzędzi do analizy wydajności, aby zbadać problemy z renderowaniem w grze, które powodują nieoptymalne liczby klatek. Poszczególni dostawcy GPU udostępniają narzędzia przeznaczone do profilowania gry i dostarczania danych o wydajności dostosowanych do ich architektur GPU. Charakterystyka wydajności i wąskie gardła gry mogą się znacznie różnić w przypadku renderowania z wykorzystaniem GPU różnych dostawców, a nawet różnych generacji GPU tego samego dostawcy.

Dane o wydajności możesz też zbierać i analizować za pomocą inspektora GPU w Androidzie. W przeciwieństwie do narzędzi innych dostawców narzędzie Android GPU Investor jest zgodne z wieloma procesorami graficznymi od różnych dostawców. Jednak inspektor GPU w Androidzie nie obsługuje starszych urządzeń z Androidem i może nie być zgodny z niektórymi nowymi urządzeniami.

Usprawnij testowanie interfejsu Vulkan za pomocą CTS-D

Producenci urządzeń z Androidem korzystają z pakietu Compatibility Test Suite (CTS), aby zapewnić zgodność swoich urządzeń. Narzędzia CTS oparte na technologii programisty (CTS-D) to testy przesyłane przez programistów aplikacji na Androida, które pozwalają sprawdzić, czy przyszłe urządzenia z Androidem spełniają odpowiednie wymagania i będą działać płynnie i bez błędów.

Jeśli uda Ci się wywołać nowy błąd w aplikacji Vulkan, który wpływa na konkretne urządzenie z Androidem, możesz przesłać nową ofertę testową, z opisem problemu i sposobami jego sprawdzenia. Dzięki temu problem zostanie rozwiązany w ramach przyszłej aktualizacji urządzenia i że ten sam błąd nie wystąpi na żadnym innym urządzeniu.

Szczegółowe instrukcje przesyłania propozycji testów znajdziesz w procedurze przesyłania pakietu CTS.