Pierwsze kroki z Vulkanem na Androidzie
Vulkan to podstawowy interfejs API grafiki niskiego poziomu na Androidzie. Vulkan zapewnia optymalną wydajność w przypadku gier, które mają własny silnik i program renderujący.
Aby skutecznie wdrożyć interfejs Vulkan w silniku gry, musisz:
- Określanie, które urządzenia z Androidem mają być używane z platformą Vulkan
- Wady i zalety obsługi starszych urządzeń z Androidem
- Dodawanie platformy Vulkan do docelowej wersji Androida
- Wybierz kompilator cieniowania, aby utworzyć SPIR-V dla Vulkan
- Określanie dostępnej wersji interfejsu Vulkan API w czasie działania
- Dowiedz się, jak optymalizować operacje renderowania Vulkan za pomocą profili Vulkan, synchronizacji klatek i wstępnego obracania
- Wybieranie narzędzi graficznych do debugowania i analizy wydajności
- Uwaga: informacje o korzystaniu z interfejsu Vulkan na Androidzie z silnikami gier Unity lub Unreal znajdziesz w tych artykułach:
- Vulkan w Unity
- Vulkan w Unreal Engine
Wybieranie minimalnych specyfikacji urządzeń dla platformy Vulkan
Interfejs Vulkan jest dostępny na Androidzie od wersji 7.0 (poziom interfejsu API 24). Nie wszystkie urządzenia z Androidem w wersji 7.0 lub nowszej obsługują Vulkan. Musisz określić, które urządzenia z Androidem obsługujące Vulkan są obsługiwane przez Twoją grę.
Rekomendacje
Jako minimalne wymagania dotyczące obsługi platformy Vulkan przyjmij te specyfikacje:
- urządzenie ma Androida 10.0 (interfejs API na poziomie 29) lub nowszego,
- Urządzenie obsługuje interfejs Vulkan API w wersji 1.1 lub nowszej.
- Urządzenie ma funkcje sprzętowe zgodne z profilem podstawowym Androida z 2022 r.
Obsługa starszych urządzeń
Jeśli Twoja gra jest przeznaczona do działania na wielu urządzeniach o różnych możliwościach graficznych, może być konieczne obsługiwanie urządzeń starszych niż te zalecane w artykule Wybieranie minimalnych specyfikacji urządzeń dla interfejsu Vulkan. Zanim zaczniesz tworzyć obsługę starszych urządzeń, sprawdź, czy Vulkan przynosi korzyści Twojej grze. Gry, które mają dużo wywołań rysowania i korzystają z OpenGL ES, mogą mieć znaczne obciążenie sterownika ze względu na wysoki koszt wywołań rysowania w OpenGL ES. W przypadku tych gier może wystąpić ograniczenie ze strony procesora, ponieważ duża część czasu renderowania jest wykorzystywana przez sterownik graficzny. Przełączenie z OpenGL ES na Vulkan może też znacznie zmniejszyć wykorzystanie procesora i zużycie energii. Jest to szczególnie przydatne, jeśli gra zawiera złożone sceny, w których nie można skutecznie używać instancji do zmniejszenia liczby wywołań rysowania. W przypadku kierowania reklam na starsze urządzenia uwzględnij obsługę renderowania OpenGL ES jako opcję rezerwową, ponieważ niektóre urządzenia na liście urządzeń docelowych mogą mieć implementacje Vulkan, które nie są w stanie niezawodnie uruchomić Twojej gry.
Możesz nie chcieć obsługiwać starszych urządzeń z Vulkanem, ponieważ brakuje im wydajności i funkcji lub mają problemy ze stabilnością.
Wydajność i funkcje
Starsze urządzenia z Androidem obsługujące Vulkan mogą nie mieć wydajności renderowania ani obsługi sprzętowej funkcji potrzebnych do uruchomienia gry. Jest to szczególnie prawdopodobne, jeśli Twoja gra ma grafikę wysokiej jakości, a Vulkan jest jedynym interfejsem API, na którym się koncentrujesz w przypadku Androida. Wiele starszych urządzeń jest ograniczonych do wersji 1.0.3 interfejsu Vulkan API i często nie ma powszechnie używanych rozszerzeń Vulkan dostępnych na nowszych urządzeniach.
Stabilność
Starsze urządzenia z Androidem mogą używać nieaktualnych sterowników Vulkan. Te wersje sterowników mogą zawierać błędy, które mogą wpływać na stabilność gry. Obejście błędów sterowników może wymagać znacznej ilości czasu na testowanie i opracowywanie rozwiązań.
Dodawanie platformy Vulkan do projektu
Aby dodać Vulkan do projektu:
- Dołącz nagłówki interfejsu Vulkan API
- Kompilowanie kodu shadera do SPIR-V
- Wywoływanie interfejsu Vulkan API w czasie działania
Dołącz nagłówki interfejsu Vulkan API
Aby skompilować kod korzystający z Vulkana, gra musi zawierać pliki nagłówkowe interfejsu Vulkan API. Kopię plików nagłówkowych Vulkan znajdziesz w Android NDK lub w wersjach pakietu Vulkan SDK. Każda wersja NDK zawiera tylko nagłówki Vulkan dostępne w momencie wydania NDK. Jeśli używasz plików nagłówkowych Vulkan z NDK, używaj NDK w wersji 25 lub nowszej, która zawiera pliki nagłówkowe obsługujące Vulkan w wersji 1.3. Pakiet Vulkan SDK zawiera najnowszą wersję plików nagłówkowych.
Kompilowanie kodu shadera do SPIR-V
Interfejs Vulkan API oczekuje, że programy cieniujące będą dostarczane w binarnym formacie pośrednim SPIR-V. Ta konwencja różni się od OpenGL ES, w którym można przesyłać kod źródłowy napisany w języku cieniowania OpenGL (GLSL) jako ciągi tekstowe. Użyj kompilatora cieniowania, aby przekształcić kod napisany w języku cieniowania, takim jak GLSL lub język cieniowania wysokiego poziomu (HLSL), i skompilować go do modułów SPIR-V do użycia z Vulkanem.
Kompilator shaderc może służyć do kompilowania programów cieniowania napisanych w GLSL do SPIR-V. Jeśli Twoja gra korzysta z HLSL, DirectXShaderCompiler obsługuje dane wyjściowe SPIR-V. Zazwyczaj programy cieniujące są kompilowane offline w ramach procesu tworzenia zasobów gry, a moduły SPIR-V są uwzględniane w zasobach środowiska wykonawczego.
Wywoływanie interfejsu Vulkan API w czasie działania
Aby wywoływać interfejs Vulkan API, gra musi uzyskać wskaźniki funkcji do wywołań interfejsu Vulkan API. Najprostszym sposobem jest połączenie z libvulkan.so
biblioteką współdzielonąlibvulkan.so
, która jest częścią Android NDK. Łączenie z biblioteką ma 2 wady: dodatkowe obciążenie związane z wywoływaniem funkcji i ograniczenia dotyczące tego, które wskaźniki funkcji interfejsu Vulkan API są automatycznie rozwiązywane.
Gdy wywołujesz funkcję interfejsu Vulkan API, sterowanie przechodzi przez tabelę wysyłania zarządzaną przez konstrukcję zwaną programem ładującym Vulkan. Android korzysta z własnej implementacji programu ładującego Vulkan, a nie z programu ładującego LunarG. Ten system ładowania jest częścią architektury warstw interfejsu Vulkan API. Połączenie z biblioteką systemową w czasie kompilacji powoduje dodatkowy poziom wysyłania w przypadku danego wywołania interfejsu API. Obciążenie jest niewielkie, ale może być zauważalne w przypadku gier, które wykonują dużą liczbę wywołań Vulkan.
Biblioteka systemowa zwykle rozwiązuje tylko wskaźniki do funkcji Vulkan, które są uważane za część podstawowego interfejsu API. Vulkan ma wiele rozszerzeń, które definiują dodatkowe funkcje Vulkan. Wiele z nich nie jest automatycznie rozwiązywanych przez bibliotekę systemową. Zanim użyjesz tych funkcji Vulkan, musisz ręcznie rozwiązać wskaźniki do nich.
Aby złagodzić te problemy, dynamicznie rozwiązuj wskaźniki do wszystkich funkcji Vulkan, których zamierzasz używać w czasie działania programu. Możesz to zrobić, korzystając z biblioteki meta-loader o otwartym kodzie źródłowym, np. volk. Przykładowa gra AGDKTunnel wykorzystuje w tym celu bibliotekę volk. Jeśli używasz biblioteki meta-loader, nie łącz jej z libvulkan.so
biblioteką udostępnioną 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 przez wersję Androida i obsługę sterownika Vulkan.
Wersja Androida
Obsługa wersji interfejsu Vulkan API zależy od minimalnej wersji Androida (poziomu interfejsu API):
- 1.3 – Android 13.0 (poziom 33 interfejsu API) i nowszy
- 1.1 – Android 10.0 (poziom 29 interfejsu API) lub nowszy
- 1.0.3 – Android 7.0 (poziom interfejsu API 24) lub nowszy
Obsługa sterownika Vulkan
Obsługa wersji interfejsu Vulkan API na platformie Android nie gwarantuje, że ta wersja interfejsu API jest obsługiwana przez sterownik Vulkan na urządzeniu. Urządzenie z Androidem 13 może obsługiwać tylko wersję 1.1 interfejsu Vulkan API.
Podczas inicjowania interfejsu Vulkan nie żądaj wersji API większej niż:
- Maksymalna wersja interfejsu Vulkan API dla wersji Androida działającej na urządzeniu.
- Wersja interfejsu Vulkan zgłoszona przez funkcję vkEnumerateInstanceVersion
- Wersja interfejsu Vulkan API zgłaszana przez właściwość
apiVersion
struktury VkPhysicalDeviceProperties
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;
}
Sprawdzanie zgodności profilu Vulkan
Profile Vulkan to pliki JSON, które określają zestaw wymaganych funkcji, rozszerzeń, możliwości i minimalnych limitów parametrów, które urządzenie Vulkan musi obsługiwać, aby być zgodne z profilem. Aby sprawdzić, czy urządzenie jest zgodne z określonym profilem Vulkan, np. z profilem Android Baseline 2022, użyj biblioteki Vulkan Profiles API o otwartym kodzie źródłowym. Możesz też samodzielnie przeanalizować plik JSON profilu i sprawdzić 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ą, jakie funkcje i rozszerzenia są dostępne na poszczególnych urządzeniach z Androidem.
Android Baseline Profile (ABP) to pierwsza próba utworzenia profilu Vulkan. ABP2021 i ABP2022 to profile wsteczne, które obejmują ponad 85% aktywnych urządzeń w danym czasie. Nie będzie już nowych wersji ABP.
Vulkan Profiles for Android (VPA) to nowy profil przyszłościowy, który ma odzwierciedlać potrzeby programistów i zapewniać spójne funkcje, gdy tylko deweloperzy sprzętu będą w stanie je udostępnić. VPA15_minimums to pierwszy profil dla Androida 15. Co roku będzie się pojawiać nowy profil VPA, który będzie obejmować każdą główną wersję Androida.
Wdrażanie synchronizacji klatek
Prawidłowe tempo klatek jest niezbędne do zapewnienia 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 wdrażaniu znajdziesz w artykule Integrate Android Frame Pacing into your Vulkan renderer (Integracja funkcji synchronizacji klatek na Androidzie z renderowaniem Vulkan).
Nie polegaj na synchronizacji domyślnej i tempie klatek
Do zarządzania łańcuchem wymiany służą funkcje vkAcquireNextImageKHR i vkQueuePresentKHR. Unikaj polegania na ich potencjalnym blokowaniu w przypadku ogólnej synchronizacji aplikacji lub układu GPU.
Dokładne działanie blokujące tych funkcji może się znacznie różnić w zależności od:
- urządzeń z Androidem
- Sterowniki GPU
- Stany silnika prezentacji (VkPresentModeKHR)
Jedynym celem funkcji vkAcquireNextImageKHR jest pobranie dostępnego obrazu, który można wyświetlić. Może ona blokować lub nie. Podobnie vkQueuePresentKHR umieszcza w kolejce żądanie wyświetlenia obrazu i może blokować lub nie.
Żadna z tych funkcji nie zapewnia niezawodnych gwarancji synchronizacji niezwiązanych ze sobą zadań procesora ani operacji GPU.
Aby zapewnić niezawodną synchronizację, zawsze używaj jawnych elementów pierwotnych Vulkan, takich jak semafory w przypadku zależności między procesorami GPU (np. renderowanie do prezentacji), bariery w potoku lub zdarzenia w przypadku bardziej szczegółowych zależności między wykonaniem na procesorze GPU a pamięcią. Używanie jawnej synchronizacji zapewnia przewidywalne działanie i pozwala uniknąć subtelnych błędów spowodowanych przez różnice w czasie działania zależne od implementacji, które są nieodłączne od zróżnicowanego ekosystemu sprzętowego Androida.
Wdrażanie wstępnego obracania
Urządzenia z Androidem mogą wyświetlać treści 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 jaka jest optymalna metoda obsługi różnic w orientacji podczas korzystania z interfejsu Vulkan, przeczytaj artykuł Obsługa obracania urządzenia za pomocą wstępnego obracania w interfejsie Vulkan.
Rozwiązywanie problemów z renderowaniem Vulkan i profilowanie tego procesu
Dostępnych jest wiele narzędzi, które pomagają diagnozować problemy z renderowaniem i wydajnością kodu renderowania Vulkan.
Więcej informacji o narzędziach do debugowania i profilowania platformy Vulkan znajdziesz w sekcji Narzędzia i funkcje zaawansowane.
Warstwy weryfikacji interfejsu Vulkan
Warstwy weryfikacji Vulkan to biblioteki czasu działania, 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 weryfikacji nie są domyślnie aktywne, ponieważ proces weryfikacji zwiększa obciążenie w czasie działania i wpływa na wydajność gry. Informacje o tym, jak używać warstw weryfikacji w grze, znajdziesz w artykule Debugowanie za pomocą warstwy weryfikacji.
Narzędzia do przechwytywania klatek
Używaj narzędzi do przechwytywania klatek, aby nagrywać i odtwarzać wywołania interfejsu Vulkan API wykonane w trakcie klatki gry. Te narzędzia umożliwiają:
- Wyświetlanie informacji o aktywnych zasobach graficznych i ich wizualizacji
- Sprawdzanie sekwencji wywołań interfejsu API wykonywanych przez grę i parametrów interfejsu API
- Sprawdzanie stanu potoku graficznego w momencie wywołania rysowania
- wizualizować wyniki renderowania maksymalnie określonego wywołania rysowania w klatce;
Użyj narzędzia open source RenderDoc, aby przechwytywać klatki z gier działających na Androidzie. RenderDoc obsługuje przechwytywanie klatek zarówno w przypadku Vulkan, jak i OpenGL ES.
Do przechwytywania klatek Vulkan można też używać Android GPU Inspector (AGI).
Narzędzia do analizy wydajności
Użyj narzędzi do analizy wydajności, aby zbadać problemy z renderowaniem w grze, które powodują nieoptymalną liczbę klatek. Poszczególni dostawcy procesorów graficznych udostępniają narzędzia przeznaczone do profilowania gier i dostarczania danych o wydajności konkretnych architektur procesorów graficznych. Wydajność i wąskie gardła gry mogą się znacznie różnić w zależności od tego, czy renderowanie odbywa się na procesorach graficznych różnych dostawców, czy nawet na różnych generacjach procesorów graficznych tego samego dostawcy.
Możesz też użyć narzędzia Android GPU Inspector do zbierania i analizowania danych o wydajności. W przeciwieństwie do narzędzi dostawców Android GPU Inspector jest zgodny z wieloma procesorami graficznymi różnych dostawców. Narzędzie Android GPU Inspector nie obsługuje jednak starszych urządzeń z Androidem i może nie być zgodne ze wszystkimi nowymi urządzeniami.
Ulepszanie testowania interfejsu Vulkan za pomocą CTS-D
Producenci urządzeń z Androidem używają pakietu CTS (Compatibility Test Suite), aby mieć pewność, że ich urządzenia są zgodne. Testy CTS opracowane przez deweloperów (CTS-D) to testy przesyłane przez deweloperów aplikacji na Androida, aby upewnić się, że przyszłe urządzenia z Androidem spełniają ich wymagania i mogą bezproblemowo uruchamiać ich aplikacje bez błędów.
Jeśli w aplikacji Vulkan uda Ci się wywołać nowy błąd, który występuje na konkretnym urządzeniu z Androidem, możesz przesłać nową propozycję testu, opisując problem i sposoby jego sprawdzenia. Dzięki temu problem zostanie rozwiązany w przyszłej aktualizacji urządzenia, a ten sam błąd nie wystąpi na innych urządzeniach.
Szczegółowe instrukcje przesyłania propozycji testu znajdziesz w procesie przesyłania CTS.