Pierwsze kroki z platformą Vulkan na Androidzie
Vulkan to podstawowy niskopoziomowy interfejs API graficzny na Androida. Vulkan zapewnia optymalną wydajność w przypadku gier, które korzystają z własnego silnika i renderowania.
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
- Dodaj interfejs Vulkan do celu kompilacji Androida
- Wybierz kompilator shaderów, aby utworzyć SPIR-V dla Vulkan
- 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 Unreal
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ć, które urządzenia z Androidem z obsługą interfejsu Vulkan obsługuje Twoja gra.
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. 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 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, włącz obsługę renderowania przez 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 są w stanie niezawodnie uruchomić gry.
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 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.
Dodaj interfejs Vulkan do projektu
Aby dodać Vulkan do projektu:
- Uwzględnij 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 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 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. Zwykle kompilujesz programy do cieniowania w trybie offline w ramach procesu tworzenia zasobów gry 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: 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. 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 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-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ż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 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 Android nie gwarantuje, że 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 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 zgłaszana przez vkEnumerateInstanceVersion
- Wersja interfejsu Vulkan API zgłaszana przez właściwość
apiVersion
struktury VkPhysicalDeviceWłaściwości.
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 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 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 tworzenia 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 Androida 15. Co roku będziemy go udostępniać dla każdej głównej wersji 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ć optymalne tempo wyświetlania klatek. Więcej informacji o wdrożeniu znajdziesz w artykule Integracja Android Frame Pacing z renderowaniem Vulkan.
Wdrażanie rotacji wstępnej
Urządzenia z Androidem mogą wyświetlać się 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 optymalna metoda obsługi różnic orientacji w przypadku korzystania z interfejsu Vulkan, zapoznaj się z sekcją Obsługiwanie rotacji urządzenia z wyprzedzeniem Vulkan.
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 rysowania 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 przechwytywania klatek Vulkan można również używać Inspektora GPU (AGI) Androida.
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ą 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. 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 testów Vulkan za pomocą CTS-D
Producenci urządzeń z Androidem korzystają z kompilacji 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 ten sam błąd nie powtórzy się na innych urządzeniach.
Aby uzyskać szczegółowe instrukcje przesyłania propozycji testu, zapoznaj się z procesem przesyłania propozycji testu CTA.