Mechanizmy natywne i zastrzeżone

Pierwsze kroki z platformą Vulkan na Androidzie

Vulkan to główny niskopoziomowy interfejs API do obsługi grafiki na Androidzie. Vulkan zapewnia optymalną wydajność w grach, które mają własny silnik gry i mechanizm renderowania.

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

  • Określ, których urządzeń z Androidem chcesz używać z Vulkan
  • Poznaj wady obsługi starszych urządzeń z Androidem
  • Dodaj interfejs Vulkan do celu kompilacji Androida
  • Wybierz kompilator do cieniowania, by utworzyć SPIR-V dla Vulkana
  • Określanie dostępnej wersji interfejsu Vulkan API w czasie działania
  • Dowiedz się, jak zoptymalizować operacje renderowania Vulkan za pomocą profili Vulkan, tempa klatek i przedobracania
  • Wybierz narzędzia graficzne do debugowania i analizy wydajności
    Uwaga: informacje o korzystaniu z platformy Vulkan na Androidzie z silnikami gier Unity lub Unreal znajdziesz w tych artykułach:
  • Vulkan w Unity
  • Vulkan w Unreal

Wybierz minimalne specyfikacje urządzenia Vulkan

Interfejs Vulkan jest dostępny na urządzeniach z Androidem w wersji od 7.0 (poziom interfejsu 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

Poniższe specyfikacje stanowią minimalne wymagania dotyczące obsługi interfejsu Vulkan:

  • Na urządzeniu jest zainstalowany Android 10.0 (poziom interfejsu API 29) lub nowszy
  • Urządzenie obsługuje interfejs Vulkan API w wersji 1.1 lub nowszej
  • Urządzenie ma możliwości sprzętowe i funkcje zgodne z profilem Baseline Android z 2022 roku

Obsługa starszych urządzeń

Jeśli Twoja gra jest przeznaczona do działania na różnych urządzeniach o różnych możliwościach graficznych, może być konieczna obsługa urządzeń starszych niż zalecane w sekcji Wybór minimalnej specyfikacji urządzeń dla Vulkan. Zanim zaczniesz obsługiwać starsze urządzenia, oceń, czy Vulkan zapewnia Twojej grze korzyści. Gry, które zawierają wiele wywołań funkcji rysowania i korzystają z platformy OpenGL ES, mogą znacznie obciążać kierowców z powodu wysokich kosztów wykonywania wywołań rysowania w ramach OpenGL ES. Takie gry mogą zużywać sporą część czasu renderowania klatki przez procesor graficzny. Po przejściu z platformy OpenGL ES na Vulkan gry mogą też znacznie zmniejszyć zużycie procesora i mocy. Jest to szczególnie przydatne, jeśli gra zawiera złożone sceny, które nie mogą skutecznie wykorzystać pozycji, aby ograniczyć liczbę wywołań losowania. Jeśli kierujesz reklamy na starsze urządzenia, włącz obsługę renderowania OpenGL ES jako opcję zastępczą, ponieważ niektóre urządzenia na liście urządzeń docelowych mogą korzystać z implementacji interfejsu Vulkan, które nie działają niezawodnie.

Możesz nie chcieć obsługiwać starszych urządzeń, które obsługują interfejs Vulkan, ponieważ nie mają one odpowiedniej wydajności i funkcji lub mają problemy ze stabilnością.

Wydajność i funkcje

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

Stabilność

Starsze urządzenia z Androidem mogą korzystać z nieaktualnych sterowników Vulkan. Te wersje sterowników mogą zawierać błędy, które wpływają na stabilność gry. Naprawianie błędów sterowników może wymagać dużej ilości czasu na testowanie i pracę programistów.

Dodaj interfejs Vulkan do projektu

Aby dodać interfejs Vulkan do projektu, musisz:

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

Uwzględnij nagłówki interfejsu Vulkan API

Twoja gra musi zawierać pliki nagłówka interfejsu Vulkan API, aby skompilować kod korzystający z tego języka. Kopię nagłówków Vulkan znajdziesz w narzędziu Android NDK lub w wersjach pakietu SDK Vulkan. Każda konkretna wersja NDK zawiera tylko nagłówki Vulkan dostępne w momencie wydania NDK. Jeśli używasz nagłówków Vulkan z NDK, użyj NDK w wersji 25 lub nowszej, która zawiera pliki nagłówka obsługujące Vulkan w wersji 1.3. Pakiet SDK Vulkan ma najnowszą wersję nagłówków.

Kompilowanie kodu cieniowania zgodnie ze standardem SPIR-V

Interfejs Vulkan API wymaga, aby programy do cieniowania były udostępniane w formacie binarnym SPIR-V. Ta konwencja różni się od standardu OpenGL ES, w którym można przesłać kod źródłowy napisany w OpenGL Shading Language (GLSL) jako ciągi tekstowe. Za pomocą kompilatora do cieniowania pobierz kod napisany w języku cieniowania, np. GLSL lub High-level Shader Language (HLSL), i skompiluj go w moduły SPIR-V do wykorzystania z Vulkanem.

Za pomocą kompilatora shaderc można kompilować na SPIR-V programy do cieniowania napisane w języku GLSL. Jeśli gra korzysta z HLSL, kompilator DirectXShaderCompiler obsługuje dane wyjściowe SPIR-V. Zwykle kompilujesz programy do cieniowania offline w ramach procesu tworzenia zasobów w grze i dodajesz moduły SPIR-V do zasobów środowiska wykonawczego.

Wywoływanie interfejsu Vulkan API w czasie działania

Aby móc wywoływać interfejs Vulkan API, gra musi uzyskać wskaźniki funkcji do wywołań interfejsu Vulkan API. Najprostszym sposobem jest połączenie się z biblioteką współdzieloną libvulkan.so, która jest częścią pakietu Android NDK. Łączenie z biblioteką ma 2 wady: narzut związany z dodatkową dystrybucją funkcji i ograniczenia dotyczące automatycznego usuwania wskaźników funkcji interfejsu Vulkan API.

Gdy wywołujesz funkcję interfejsu Vulkan API, kontrolka przechodzi przez tabelę dyspozytorską zarządzaną przez konstrukt o nazwie wczytujący się Vulkan. Android używa własnej implementacji programu Vulkan loader, a nie programu ładującego LunarG. Ten system wczytywania jest częścią architektury warstw interfejsu Vulkan API. Połączenie z biblioteką systemową w czasie kompilacji skutkuje dodatkowym poziomem wysyłania dla danego wywołania interfejsu API. Chociaż narzut jest niewielki, może być zauważalny w grach, które generują dużą liczbę wywołań interfejsu Vulkan.

Biblioteka systemowa zazwyczaj rozdziela wskaźniki tylko do funkcji Vulkan, które są częścią podstawowego interfejsu API. Vulkan ma dużą liczbę rozszerzeń, które definiują dodatkowe funkcje, z których wiele nie jest automatycznie rozpoznawanych przez bibliotekę systemową. Musisz ręcznie rozpoznać wskaźniki do tych funkcji interfejsu Vulkan, zanim z nich skorzystasz.

Aby ograniczyć te problemy, dynamicznie rozwiązuj wskaźniki do wszystkich funkcji 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 wykorzystuje w tym celu usługę Volk. Jeśli używasz biblioteki meta-loadera, nie łącz z biblioteką współdzieloną libvulkan.so w skryptach kompilacji.

Określanie dostępnej wersji 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 jest określany na podstawie wersji Androida i obsługi sterownika Vulkan.

Wersja Androida

Obsługa wersji interfejsu Vulkan API przez platformę zależy od minimalnej wersji Androida (poziomu API):

  • 1.3 – Android 13.0 (poziom interfejsu API 33) lub nowszy
  • 1.1 – Android 10.0 (poziom interfejsu API 29) lub nowszy
  • 1.0.3 – Android 7.0 (poziom interfejsu API 24) lub nowszy

Obsługa sterowników Vulkan

Obsługa wersji interfejsu Vulkan API na platformie Androida nie gwarantuje, że wersja interfejsu API będzie obsługiwana przez sterownik Vulkan urządzenia. Urządzenia z Androidem 13 mogą obsługiwać tylko wersję 1.1 interfejsu Vulkan API.

Podczas inicjowania interfejsu Vulkan nie żądaj interfejsu API w wersji nowszej niż:

Oto przykład określania najwyższej obsługiwanej wersji interfejsu 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;
}

Określanie zgodności profilu Vulkan

Profile Vulkan to pliki JSON definiujące zestaw wymaganych funkcji, rozszerzeń, możliwości i minimalnych limitów parametrów, które urządzenie z Vulkan musi obsługiwać, aby było zgodne z profilem. Aby określić, czy urządzenie jest zgodne z konkretnym profilem Vulkan, takim jak profil Baseline z 2022 r., użyj biblioteki interfejsu Vulkan Profiles API 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 określić zgodność profilu.

Profile Vulkan

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

Android Baseline Profile (ABP) to pierwsza próba utworzenia profilu Vulkan. ABP2021 i ABP2022 to profile patrzące wstecz, które mają obejmować ponad 85% aktywnych urządzeń w tamtym czasie. Nie będziemy już tworzyć nowych kont w tej usłudze.

Vulkan Profiles for Android (VPA) to nowy, przyszłościowy profil stworzony z myślą o potrzebach programistów i wprowadzaniu spójnych funkcji, gdy tylko deweloperzy sprzętu będą w stanie je wprowadzić. VPA15_minimums to pierwszy profil Androida 15. Co roku będziemy tworzyć nowy VPA dotyczący wszystkich głównych wersji Androida.

Wdrażanie tempa klatek

Właściwe tempo klatek to klucz do zapewnienia wysokiej jakości rozgrywki. Android Game Development Kit zawiera bibliotekę Frame Pacing, która pomaga grze uzyskać optymalne tempo wykorzystywania klatek. Więcej informacji o implementacji znajdziesz w artykule Integrowanie Android Frame Pacing z mechanizmem renderowania Vulkan.

Wdrażanie rotacji wstępnej

Urządzenia z Androidem mogą wyświetlać się w różnych orientacjach. Orientacja urządzenia może się różnić od orientacji powierzchni renderowania. W przeciwieństwie do OpenGL ES na Androidzie Vulkan nie obsługuje rozbieżności między nimi. Aby dowiedzieć się, jak działa proces orientacji i optymalna metoda obsługi różnic orientacji w przypadku korzystania z interfejsu Vulkan, zapoznaj się z sekcją Obsługa rotacji urządzenia z wyprzedzeniem Vulkan.

Rozwiązywanie problemów z renderowaniem pod kątem interfejsu Vulkan i profilowanie go

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

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

Warstwy weryfikacji interfejsu Vulkan

Warstwy weryfikacji interfejsu Vulkan to biblioteki środowiska wykonawczego, które można włączyć do badania wywołań interfejsu Vulkan API i wyświetlania ostrzeżeń i błędów dotyczących nieprawidłowego lub nieoptymalnego użycia. Te warstwy weryfikacji są domyślnie nieaktywne, ponieważ proces weryfikacji zwiększa narzut środowiska wykonawczego i wpływa na wydajność gry. Informacje o używaniu warstw weryfikacji w grze znajdziesz w artykule Debugowanie z warstwą walidacji.

Narzędzia do przechwytywania klatek

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

  • Wyświetl informacje o aktywnych zasobach graficznych i wizualizacje
  • Zobacz sekwencję wywołań interfejsu API wykonywanych przez grę i zapoznaj się z jej parametrami.
  • Badaj stan potoku graficznego w momencie wywołania rysowania
  • Zwizualizuj wyniki renderowania do określonego wywołania rysowania w klatce

Za pomocą narzędzia RenderDoc typu open source możesz tworzyć klatki z gier działających na Androidzie. RenderDoc obsługuje przechwytywanie klatek w wersjach Vulkan i OpenGL ES.

Do przechwytywania klatek Vulkan można również używać Inspektora GPU (AGI) Androida.

Narzędzia do analizy skuteczności

Używaj narzędzi do analizy wydajności, aby badać problemy z renderowaniem w grze, które powodują nieoptymalną liczbę klatek. Poszczególni dostawcy GPU oferują narzędzia przeznaczone do profilowania gry i dostarczania danych o wydajności dopasowanych do ich architektur GPU. Charakterystyka wydajności i wąskie gardła gry mogą się znacznie różnić w przypadku renderowania z użyciem układów GPU różnych dostawców, a nawet przy różnych generacjach GPU tego samego dostawcy.

Dane o wydajności możesz też zbierać i analizować za pomocą Inspektora GPU na Androidzie. W przeciwieństwie do narzędzi dostawców Android GPU Inspector obsługuje wiele układów GPU różnych dostawców. Jednak Android GPU Inspector nie obsługuje starszych urządzeń z Androidem i może nie być zgodny ze wszystkimi nowymi urządzeniami.

Usprawnij testowanie interfejsu Vulkan dzięki CTS-D

Producenci urządzeń z Androidem korzystają z narzędzia Compatibility Test Suite (CTS), aby sprawdzić, czy ich urządzenia są zgodne. CSS-D oparty na aplikacjach dla programistów (CTS-D) to testy przesyłane przez deweloperów aplikacji na Androida, których celem jest sprawdzenie, czy przyszłe urządzenia z tym systemem spełniają wymagania i mogą działać płynnie i bez błędów.

Jeśli uda Ci się wywołać w aplikacji Vulkan nowy błąd, który wpływa na konkretne urządzenie z Androidem, możesz przesłać nową propozycję testu, opisując swój problem i sposoby jego sprawdzenia. Dzięki temu problem zostanie rozwiązany w przyszłej aktualizacji urządzenia, a ten sam błąd nie powtórzy się na innych urządzeniach.

Zapoznaj się z procesem przesyłania CTS, aby dowiedzieć się, jak krok po kroku przesłać propozycję testu.