Pierwsze kroki z platformą Vulkan na Androidzie
Vulkan to podstawowy interfejs API do obsługi grafiki na niższym poziomie na Androidzie. Vulkan zapewnia optymalną wydajność w przypadku gier, które implementują własny silnik i renderer.
Aby prawidłowo zaimplementować Vulkan w silniku gry, musisz:
- Określanie, które urządzenia z Androidem można używać z platformą Vulkan
- Zasady obsługi starszych urządzeń z Androidem
- Dodawanie Vulkana do docelowego zestawu Androida
- Wybierz kompilator shaderów, aby 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, synchronizacji klatek i przedwczesnego obracania
- Wybieranie narzędzi graficznych do debugowania i analizy wydajności
- Uwaga: informacje o używaniu Vulkana na Androidzie z silnikami gier Unity lub Unreal:
- Vulkan w Unity
- Vulkan w Unrealu
Wybieranie minimalnych specyfikacji urządzenia dla Vulkan
Vulkan jest dostępny na urządzeniach z Androidem w wersji 7.0 (interfejs API na poziomie 24) i nowszych. Nie wszystkie urządzenia z Androidem w wersji 7.0 lub nowszej obsługują Vulkana. Musisz określić, na jakich urządzeniach z Androidem obsługujących Vulkan Twoja gra działa.
Rekomendacje
Minimalne wymagania dotyczące obsługi Vulkana:
- urządzenie z Androidem w wersji 10.0 (poziom interfejsu API 29) lub nowszej,
- urządzenie obsługuje interfejs Vulkan w wersji 1.1 lub nowszej;
- Urządzenie ma funkcje i możliwości sprzętowe zgodne z profilem podstawowym Androida z 2022 roku.
Obsługa starszych urządzeń
Jeśli gra ma działać na wielu urządzeniach o zróżnicowanych możliwościach graficznych, może być konieczne uwzględnienie urządzeń starszych niż te zalecane w artykule Wybór minimalnych wymagań sprzętowych Vulkana. Zanim zaczniesz tworzyć obsługę starszych urządzeń, sprawdź, czy Vulkan przyniesie korzyści Twojej grze. Gry, które zawierają wiele wywołań funkcji rysowania i korzystają z OpenGL ES, mogą generować znaczne obciążenie sterownika ze względu na wysoki koszt wywołania funkcji rysowania w OpenGL ES. Te gry mogą być ograniczone przez procesor, ponieważ duża część czasu renderowania jest zużywana przez sterownik karty graficznej. Przejście z OpenGL ES na Vulkan może też znacznie zmniejszyć zużycie procesora i energii. Jest to szczególnie przydatne, jeśli gra zawiera sceny złożone, w których nie można efektywnie stosować instancjonowania w celu zmniejszenia liczby wywołań funkcji rysowania. Jeśli kierujesz reklamy na starsze urządzenia, uwzględnij obsługę OpenGL ES jako opcję awaryjnego renderowania, ponieważ niektóre urządzenia na liście urządzeń docelowych mogą mieć implementacje Vulkan, które nie mogą niezawodnie uruchomić gry.
Możesz nie chcieć obsługiwać starszych urządzeń z Vulkanem, ponieważ mają one problemy ze stabilnością lub wydajnością albo nie mają odpowiednich funkcji.
Wydajność i funkcje
Starsze urządzenia z Androidem obsługujące Vulkan mogą nie mieć wydajności renderowania lub wsparcia sprzętowego dla funkcji potrzebnych do uruchomienia gry. Jest to szczególnie prawdopodobne, jeśli gra ma grafikę o wysokiej jakości i Vulkan jest jedynym interfejsem API, na który się kierujesz na Androidzie. Wiele starszych urządzeń jest ograniczonych do wersji 1.0.3 interfejsu Vulkan API i często brakuje na nich często używanych rozszerzeń Vulkan dostępnych na nowocześniejszym sprzęcie.
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. Ominięcie błędów sterownika może wymagać znacznej ilości czasu na testowanie i rozwijanie.
Dodawanie Vulkana do projektu
Aby dodać Vulkan do projektu:
- Dołącz nagłówki interfejsu Vulkan API
- Kompilowanie kodu shadera do formatu SPIR-V
- Wywoływanie interfejsu Vulkan API w czasie wykonywania
Dołącz nagłówki interfejsu Vulkan API
Aby skompilować kod korzystający z Vulkana, gra musi zawierać pliki nagłówka interfejsu Vulkan API. Kopie nagłówków Vulkan znajdziesz w Android NDK lub w pakiecie Vulkan SDK. Każda 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 wersji NDK 25 lub nowszej, która zawiera pliki nagłówków obsługujące Vulkan w wersji 1.3. Pakiet SDK Vulkan zawiera najnowszą wersję nagłówków.
Kompilowanie kodu shadera do formatu SPIR-V
Interfejs Vulkan API wymaga, aby programy cieniowania były dostarczane w formacie binarnym pośrednim SPIR-V. Ta konwencja różni się od OpenGL ES, gdzie można przesłać kod źródłowy napisany w języku cieniowania OpenGL (GLSL) jako ciągi tekstowe. Użyj kompilatora shaderów, aby przetworzyć kod napisany w języku shaderów, takim jak GLSL lub High-level Shader Language (HLSL), na moduły SPIR-V do użycia z Vulkanem.
Kompilator shaderc może być używany do kompilowania programów shaderów napisanych w GLSL na SPIR-V. Jeśli Twoja gra używa HLSL, DirectXShaderCompiler obsługuje wyjście SPIR-V. Zazwyczaj programy shaderów kompilujesz w trybie offline w ramach procesu kompilacji zasobów do gry i uwzględniasz moduły SPIR-V jako część zasobów do uruchomienia.
Wywoływanie interfejsu Vulkan API w czasie wykonywania
Aby wywołać 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ólną, która jest zawarta w NDK Androida. Łączenie z biblioteką ma 2 wady: dodatkowy narzut na obsługę funkcji oraz ograniczenia dotyczące tego, które wskaźniki funkcji interfejsu Vulkan są automatycznie rozwiązywane.
Gdy wywołasz funkcję interfejsu Vulkan API, kontrola przechodzi przez tablicę rozsyłania zarządzaną przez konstrukt zwany ładownikiem Vulkan. Android używa własnej implementacji Vulkan loader, a nie ładowarki LunarG. System ładowarki jest częścią architektury warstw interfejsu Vulkan API. Łączenie z biblioteką systemową w czasie kompilacji powoduje dodatkowy poziom przetwarzania w przypadku danego wywołania interfejsu API. Chociaż jest on niewielki, może być zauważalny w przypadku gier, które wykonują dużą liczbę wywołań Vulkan.
Biblioteka systemowa przeważnie rozwiązuje tylko wskaźniki do funkcji Vulkan, które są uważane za część głównego interfejsu API. Vulkan ma dużą liczbę rozszerzeń, które definiują dodatkowe funkcje Vulkana, z których wiele nie jest automatycznie rozwiązywanych przez bibliotekę systemową. Zanim użyjesz tych funkcji Vulkan, musisz ręcznie rozwiązać wskaźniki do nich.
Aby rozwiązać te problemy, dynamicznie rozwiązuj wskaźniki do wszystkich funkcji Vulkan, których zamierzasz używać w czasie wykonywania. Możesz to zrobić, korzystając z biblioteki meta-loader open source, takiej jak volk. Przykładowa gra AGDKTunnel integruje volk w tym celu. Jeśli używasz biblioteki meta-loader, nie łącz jej z biblioteką udostępnioną libvulkan.so
w swoich 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ższa wersja interfejsu Vulkan API dostępna na danym urządzeniu jest określana przez wersję Androida i obsługę sterownika Vulkana.
Wersja Androida
Obsługa wersji interfejsu Vulkan API zależy od minimalnej wersji Androida (poziom interfejsu API):
- 1.3 – Android 13.0 (poziom 33 interfejsu API) lub 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 sterowników Vulkan
Obsługa wersji interfejsu Vulkan API na platformie Android nie gwarantuje, że wersja interfejsu Vulkan 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 Vulkan nie żądaj wersji interfejsu API większej niż:
- Maksymalna wersja interfejsu Vulkan API dla wersji Androida działającego na urządzeniu
- Wersja interfejsu Vulkan API zwracana przez funkcję vkEnumerateInstanceVersion
- Wersja interfejsu Vulkan API zgłaszana przez właściwość
apiVersion
struktury VkPhysicalDeviceProperties.
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;
}
Sprawdzanie zgodności profilu Vulkan
Profile Vulkan to pliki JSON, które definiują zestaw wymaganych funkcji, rozszerzeń, możliwości i minimalnych limitów parametrów, które urządzenie Vulkan musi obsługiwać, aby być zgodnym z danym profilem. Aby sprawdzić, czy urządzenie jest zgodne z konkretnym profilem Vulkana, np. profilem Android Baseline z 2022 r., użyj biblioteki Vulkan Profiles API. Możesz też samodzielnie przeanalizować plik JSON profilu i za pomocą odpowiednich interfejsów Vulkan sprawdzić możliwości urządzenia, aby określić zgodność profilu.
Profile Vulkan
Android używa profili Vulkan, które określają, które funkcje i rozszerzenia są dostępne na poszczególnych urządzeniach z Androidem.
Profil referencyjny Androida (ABP) to pierwsza próba stworzenia profilu Vulkan. ABP2021 i ABP2022 to profile uwzględniające dane z przeszłości, które obejmują ponad 85% aktywności urządzeń w tym czasie. W przyszłości nie będziemy tworzyć nowych grup odbiorców opartych na zainteresowaniach.
Vulkan Profiles for Android (VPA) to nowy profil, który ma na celu uwzględnienie potrzeb programistów i zapewnienie spójnych funkcji, gdy tylko deweloperzy sprzętu będą mogli je udostępnić. VPA15_minimums to pierwszy profil dla Androida 15. Każdego roku będzie nowy profil VPA, który będzie obejmował każdą główną wersję Androida.
Zastosowanie tempa klatek
Prawidłowe odświeżanie klatek jest kluczowym elementem zapewnienia wysokiej jakości rozgrywki. Pakiet Android Game Development Kit zawiera bibliotekę Frame Pacing, która pomaga uzyskać optymalny interwał wyświetlania klatek. Więcej informacji o wdrożeniu znajdziesz w artykule Integrating Android Frame Pacing into Your Vulkan Renderer (w języku angielskim).
Wdrażanie rotacji wstępnej
Urządzenia z Androidem mogą wyświetlać treści w różnych orientacjach. Orientacja urządzenia może różnić się od orientacji powierzchni renderowania. W przeciwieństwie do OpenGL ES na Androidzie Vulkan nie obsługuje rozbieżności między tymi platformami. Aby dowiedzieć się, jak działa proces orientacji i jaka jest optymalna metoda obsługi różnic w orientacji podczas korzystania z Vulkana, przeczytaj artykuł Zarządzanie obracaniem urządzenia za pomocą Vulkana przed obrotem.
Rozwiązywanie problemów z renderowaniem Vulkan i profilowanie
Dostępnych jest wiele narzędzi, które pomogą Ci zdiagnozować problemy z renderowaniem i wydajnością kodu renderowania Vulkan.
Więcej informacji o narzędziach debugowania i profilowania Vulkana znajdziesz w sekcji Narzędzia i funkcje zaawansowane.
Warstwy walidacji Vulkan
Warstwy weryfikacji Vulkan to biblioteki czasu wykonywania, które można włączyć, aby sprawdzać Twoje 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 używaniu warstw weryfikacji w grze znajdziesz w artykule Debugowanie za pomocą warstwy weryfikacji.
Narzędzia do przechwytywania klatek
Użyj narzędzi do przechwytywania klatek, aby nagrywać i odtwarzać wywołania interfejsu Vulkan API w ramach klatki w grze. Te narzędzia umożliwiają:
- Wyświetlanie informacji o aktywnych zasobach graficznych i ich wizualizacji
- Zobacz sekwencję wywołań interfejsu API wykonanych przez Twoją grę oraz parametry interfejsu API
- Sprawdzanie stanu potoku graficznego w momencie wywołania funkcji draw
- wizualizacja wyników renderowania do konkretnego wywołania funkcji draw na klatce.
Użyj narzędzia open source RenderDoc do przechwytywania klatek z gier działających na Androidzie. RenderDoc obsługuje przechwytywanie klatek zarówno w Vulkan, jak i OpenGL ES.
Do rejestrowania klatek Vulkan można też użyć inspektora GPU Androida (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ą nieoptymalną liczbę klatek. Poszczególni dostawcy GPU udostępniają narzędzia do profilowania gry i dostarczają dane o wydajności dotyczące ich architektur GPU. Właściwości wydajności i wąskie gardła gry mogą się znacznie różnić podczas renderowania na kartach graficznych różnych producentów, a nawet na kartach różnych generacji tego samego producenta.
Dane o wydajności możesz też zbierać i analizować za pomocą narzędzia Android GPU Inspector. W przeciwieństwie do narzędzi dostawców narzędzie Android GPU Inspector jest zgodne z wieloma procesorami graficznymi różnych producentów. Jednak narzędzie Android GPU Inspector nie obsługuje starszych urządzeń z Androidem i może nie być zgodne ze wszystkimi nowymi urządzeniami.
Ulepszanie testów Vulkan za pomocą CTS-D
Producenci urządzeń z Androidem korzystają z komputera Compatibility Test Suite (CTS), aby zapewnić zgodność swoich urządzeń. Testy CTS-D prowadzone przez deweloperów to testy przesyłane przez deweloperów aplikacji na Androida, aby zapewnić, że przyszłe urządzenia z Androidem będą spełniać ich potrzeby i że będą one mogły uruchamiać ich aplikacje płynnie i bez błędów.
Jeśli uda Ci się wywołać nowy błąd w aplikacji Vulkan, który dotyczy konkretnego urządzenia 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 także nie wystąpi na innych urządzeniach.
Aby uzyskać szczegółowe instrukcje przesyłania propozycji testu, zapoznaj się z procesem przesyłania propozycji testu.