Android'de Vulkan'ı kullanmaya başlama
Vulkan, Android'deki birincil düşük seviyeli grafik API'sidir. Vulkan, kendi oyun motorunu ve oluşturucusunu uygulayan oyunlar için optimum performans sağlar.
Vulkan'ı oyun motorunuza başarıyla uygulamak için:
- Vulkan ile hangi Android cihazların kullanılacağını belirleme
- Eski Android cihazları desteklemenin dezavantajlarını anlama
- Android derleme hedefinize Vulkan'ı ekleme
- Vulkan için SPIR-V oluşturmak üzere bir gölgelendirici derleyici seçin
- Çalışma zamanında kullanılabilir Vulkan API sürümünü belirleme
- Vulkan profilleri, kare hızı ve ön döndürme ile Vulkan oluşturma işlemlerinizi nasıl optimize edeceğinizi öğrenin.
- Hata ayıklama ve performans analizi için grafik araçlarını seçme
- Not: Unity veya Unreal oyun motorlarıyla Android'de Vulkan'ı kullanma hakkında bilgi edinmek için aşağıdaki kaynaklara bakın:
- Unity'de Vulkan
- Unreal'da Vulkan
Vulkan için minimum cihaz özelliklerini seçme
Vulkan, Android 7.0 (API düzeyi 24) ve sonraki sürümlerde kullanılabilir. Android 7.0 veya sonraki sürümlerin yüklü olduğu tüm Android cihazlar Vulkan'ı desteklemez. Oyununuzun hangi Vulkan özellikli Android cihazları desteklediğini belirlemeniz gerekir.
Öneriler
Vulkan desteği için minimum gereksinim olarak aşağıdaki özellikleri kullanın:
- Cihazda Android 10.0 (API düzeyi 29) veya daha yeni bir sürüm yüklü olmalıdır.
- Cihaz, Vulkan API sürüm 1.1 veya daha yeni bir sürümü destekliyor olmalıdır.
- Cihaz, 2022 Android Baseline profili ile uyumlu donanım özelliklerine ve işlevlerine sahip olmalıdır.
Eski cihaz desteği
Oyununuz, farklı düzeylerde grafik özelliklerine sahip çok çeşitli cihazlarda çalışacak şekilde tasarlanmışsa Vulkan için minimum cihaz özelliklerini seçme başlıklı makalede önerilenlerden daha eski cihazları desteklemeniz gerekebilir. Eski cihazlar için destek oluşturmadan önce Vulkan'ın oyununuza fayda sağlayıp sağlamadığını değerlendirin. Çok sayıda çizim çağrısı olan ve OpenGL ES kullanan oyunlarda, OpenGL ES'de çizim çağrısı yapmanın yüksek maliyeti nedeniyle sürücü ek yükü önemli ölçüde artabilir. Bu oyunlar, kare sürelerinin büyük bir bölümünü grafik sürücüsünde harcadıkları için CPU sınırlı hale gelebilir. Oyunlar, OpenGL ES'den Vulkan'a geçerek CPU ve güç kullanımında da önemli ölçüde azalma sağlayabilir. Bu durum, özellikle oyununuzda çizim çağrılarını azaltmak için örnekleme özelliğinin etkili bir şekilde kullanılamadığı karmaşık sahneler varsa geçerlidir. Daha eski cihazları hedeflediğinizde, hedef cihaz listenizdeki bazı cihazlarda oyununuzu güvenilir bir şekilde çalıştıramayan Vulkan uygulamaları olabileceğinden, yedek olarak OpenGL ES oluşturma desteğini ekleyin.
Performans ve özellik eksikliği veya kararlılık sorunları nedeniyle eski Vulkan özellikli cihazları desteklemek istemeyebilirsiniz.
Performans ve Özellikler
Vulkan'ı destekleyen eski Android cihazlarda, oyununuzu çalıştırmak için gereken özelliklerin donanım desteği veya oluşturma performansı olmayabilir. Bu durum, özellikle oyununuzda yüksek kaliteli grafikler varsa ve Android'de hedeflediğiniz tek API Vulkan ise geçerlidir. Birçok eski cihaz, Vulkan API'nin 1.0.3 sürümüyle sınırlıdır ve daha modern donanımlarda bulunan, yaygın olarak kullanılan Vulkan uzantıları genellikle bu cihazlarda yoktur.
Kararlılık
Eski Android cihazlarda güncel olmayan Vulkan sürücüleri kullanılıyor olabilir. Bu sürücü sürümleri, oyununuzun kararlılığını etkileyebilecek hatalar içerebilir. Sürücü hatalarını gidermek için önemli miktarda test ve mühendislik süresi gerekebilir.
Projenize Vulkan ekleme
Projenize Vulkan'ı eklemek için:
- Vulkan API başlıklarını ekleyin
- Gölgelendirici kodunu SPIR-V'ye derleme
- Çalışma zamanında Vulkan API'yi çağırma
Vulkan API başlıklarını ekleyin
Oyununuzun, Vulkan kullanan kodu derlemek için Vulkan API başlık dosyalarını içermesi gerekir. Vulkan başlıklarının bir kopyasını Android NDK'da veya Vulkan SDK sürümlerinde bulabilirsiniz. Belirli bir NDK sürümü yalnızca NDK'nın yayınlandığı sırada mevcut olan Vulkan üstbilgilerini içerir. NDK'daki Vulkan başlıklarını kullanıyorsanız Vulkan 1.3 sürümünü destekleyen başlık dosyalarını içeren NDK sürüm 25 veya sonraki bir sürümü kullanın. Vulkan SDK'da başlıkların en güncel sürümü bulunur.
Gölgelendirici kodunu SPIR-V'ye derleme
Vulkan API, gölgelendirici programlarının SPIR-V ikili ara biçiminde sağlanmasını bekler. Bu kural, OpenGL Shading Language (GLSL) ile yazılmış kaynak kodu metin dizeleri olarak gönderebildiğiniz OpenGL ES'den farklıdır. GLSL veya High-level Shader Language (HLSL) gibi bir gölgelendirici dilinde yazılmış kodu alıp Vulkan ile kullanılmak üzere SPIR-V modüllerine derlemek için bir gölgelendirici derleyici kullanın.
shaderc derleyicisi, GLSL ile yazılmış gölgelendirici programlarını SPIR-V'ye derlemek için kullanılabilir. Oyununuzda HLSL kullanılıyorsa DirectXShaderCompiler, SPIR-V çıkışını destekler. Genellikle, oyununuzun öğe oluşturma sürecinin bir parçası olarak gölgelendirici programlarını çevrimdışı derler ve SPIR-V modüllerini çalışma zamanı öğelerinize dahil edersiniz.
Çalışma zamanında Vulkan API'yi çağırma
Vulkan API'sini çağırmak için oyununuzun Vulkan API çağrılarına yönelik işlev işaretçileri alması gerekir. Bunu yapmanın en basit yolu, Android NDK'da bulunan libvulkan.so
paylaşılan kitaplığına bağlamaktır. Kitaplığa bağlama işleminin iki dezavantajı vardır: ek işlev gönderme ek yükü ve hangi Vulkan API işlev işaretçilerinin otomatik olarak çözümleneceğiyle ilgili sınırlamalar.
Bir Vulkan API işlevini çağırdığınızda kontrol, Vulkan yükleyici adı verilen bir yapı tarafından yönetilen bir gönderme tablosundan geçer. Android, LunarG yükleyicisi yerine kendi Vulkan yükleyici uygulamasını kullanır. Bu yükleyici sistemi, Vulkan API'nin katman mimarisinin bir parçasıdır. Derleme zamanında sistem kitaplığına bağlantı oluşturmak, belirli bir API çağrısı için ek bir gönderme düzeyiyle sonuçlanır. Ek yük küçük olsa da yüksek hacimli Vulkan çağrıları yapan oyunlarda fark edilebilir.
Sistem kitaplığı genellikle yalnızca temel API'nin bir parçası olarak kabul edilen Vulkan işlevlerine yönelik işaretçileri çözer. Vulkan'da, ek Vulkan işlevlerini tanımlayan çok sayıda uzantı bulunur. Bunların çoğu sistem kitaplığı tarafından otomatik olarak çözülmez. Bu Vulkan işlevlerini kullanmadan önce işaretçileri manuel olarak çözmeniz gerekir.
Bu sorunları azaltmak için, çalışma zamanında kullanmayı planladığınız tüm Vulkan işlevlerine yönelik işaretçileri dinamik olarak çözün. Bunu yapmanın bir yolu, volk gibi açık kaynaklı bir meta yükleyici kitaplığı kullanmaktır. AGDKTunnel örnek oyunu, bu amaçla volk'u entegre eder. Meta yükleyici kitaplığı kullanıyorsanız derleme komut dosyalarınızda libvulkan.so
paylaşılan kitaplığına bağlantı oluşturmayın.
Kullanılabilir Vulkan API sürümünü belirleme
Android, aşağıdaki Vulkan API sürümlerini destekler:
- 1.0.3
- 1,1
- 1.3
Belirli bir cihazda kullanılabilen en yüksek Vulkan API sürüm numarası, Android sürümü ve Vulkan sürücüsü desteğine göre belirlenir.
Android sürümü
Bir Vulkan API sürümünün platform desteği, minimum Android sürümüne (API düzeyi) bağlıdır:
- 1.3 — Android 13.0 (API düzeyi 33) ve sonraki sürümler
- 1.1 — Android 10.0 (API düzeyi 29) ve sonraki sürümler
- 1.0.3 — Android 7.0 (API düzeyi 24) ve sonraki sürümler
Vulkan sürücü desteği
Bir Vulkan API sürümünün Android platformunda desteklenmesi, API sürümünün cihazın Vulkan sürücüsü tarafından desteklendiğini garanti etmez. Android 13 çalıştıran bir cihaz yalnızca Vulkan API'nin 1.1 sürümünü destekleyebilir.
Vulkan'ı başlatırken şu değerden büyük bir API sürümü istemeyin:
- Cihazda çalışan Android sürümü için maksimum Vulkan API sürümü
- vkEnumerateInstanceVersion tarafından bildirilen Vulkan API sürümü
apiVersion
özelliği tarafından bildirilen Vulkan API sürümü VkPhysicalDeviceProperties yapısı
Desteklenen en yüksek Vulkan API sürümünü belirleme örneği aşağıda verilmiştir:
// 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;
}
Vulkan profili uyumluluğunu belirleme
Vulkan profilleri, bir Vulkan cihazının profille uyumlu olması için desteklemesi gereken bir dizi zorunlu özelliği, uzantıyı, yeteneği ve minimum parametre sınırını tanımlayan JSON dosyalarıdır. Bir cihazın 2022 Android Baseline profili gibi belirli bir Vulkan profiliyle uyumlu olup olmadığını belirlemek için açık kaynaklı Vulkan Profiles API kitaplığını kullanın. Ayrıca, profil JSON dosyasını kendiniz ayrıştırabilir ve profil uyumluluğunu belirlemek için ilgili Vulkan API'lerini kullanarak cihaz özelliklerini sorgulayabilirsiniz.
Vulkan Profilleri
Android, Android'in yüklü olduğu cihazlarda hangi özelliklerin ve uzantıların kullanılabileceğini tanımlayan Vulkan Profilleri'ni kullanır.
Android Baseline Profile (ABP), Vulkan Profile oluşturmaya yönelik ilk girişimdir. ABP2021 ve ABP2022, o sırada etkin cihazların% 85'inden fazlasını kapsayacak şekilde geriye dönük olarak oluşturulmuş profillerdir. Gelecekte yeni ABP olmayacak.
Android için Vulkan Profilleri (VPA), yazılım geliştiricilerin ihtiyaçlarını yansıtmayı ve donanım geliştiriciler tarafından sunulabildiği anda tutarlı özellikler sunmayı amaçlayan yeni bir profildir. VPA15_minimums Android 15'in ilk profilidir ve her yıl yeni bir VPA yayınlanarak her ana Android sürümü desteklenir.
Kare ilerleme hızını uygulama
Doğru kare hızı, yüksek kaliteli bir oyun deneyimi sunmanın önemli bir parçasıdır. Android Oyun Geliştirme Kiti, oyununuzun optimum kare hızına ulaşmasına yardımcı olmak için Frame Pacing kitaplığını içerir. Uygulama hakkında daha fazla bilgi için Android Frame Pacing'i Vulkan oluşturucunuza entegre etme başlıklı makaleyi inceleyin.
Örtülü senkronizasyona ve kare hızına güvenmeyin
vkAcquireNextImageKHR ve vkQueuePresentKHR fonksiyonları, swapchain'i yönetmek için kullanılır. Genel uygulama veya GPU senkronizasyonu için olası engelleme davranışlarına güvenmeyin.
Bu işlevlerin tam olarak nasıl engellediği, aşağıdakilere bağlı olarak önemli ölçüde farklılık gösterebilir:
- Android cihaz
- GPU sürücüleri
- Sunu motoru durumları (VkPresentModeKHR)
vkAcquireNextImageKHR'nin tek amacı, mevcut ve sunulabilir bir resmi edinmektir. Bu işlem engellenebilir veya engellenmeyebilir. Benzer şekilde, vkQueuePresentKHR bir resmi görüntüleme isteğini sıraya alır ve ayrıca engelleyebilir veya engellemeyebilir.
Her iki işlev de alakasız CPU görevlerini veya GPU işlemlerini senkronize etmek için güvenilir garantiler sunmaz.
Güçlü senkronizasyon için her zaman GPU-GPU bağımlılıkları (ör. oluşturma-sunma) için semaforlar, GPU-CPU senkronizasyonu (ör. CPU'da oluşturmanın ne zaman tamamlandığını bilme) için çitler ve daha ayrıntılı GPU yürütme ve bellek bağımlılıkları için işlem hattı engelleri veya etkinlikler gibi açık Vulkan temel öğelerini kullanın. Açık senkronizasyon kullanmak, öngörülebilir davranışlar sağlar ve Android'in çeşitli donanım ekosisteminde bulunan, uygulamaya özel zamanlama farklılıklarından kaynaklanan küçük hataları önler.
Ön döndürmeyi uygulama
Android cihazlar birden fazla yönde görüntülenebilir. Cihaz yönü, oluşturma yüzeyinin yönünden farklı olabilir. Android'deki OpenGL ES'nin aksine Vulkan, ikisi arasındaki tutarsızlıkları ele almaz. Oryantasyon sürecinin nasıl çalıştığını ve Vulkan kullanırken oryantasyon farklılıklarını ele almanın en iyi yöntemini öğrenmek için Vulkan ön döndürme ile cihaz döndürmeyi işleme başlıklı makaleyi inceleyin.
Vulkan oluşturma ile ilgili sorunları giderme ve profilleme
Vulkan oluşturma koduyla ilgili oluşturma sorunlarını ve performans problemlerini teşhis etmenize yardımcı olacak çeşitli araçlar mevcuttur.
Vulkan'ın hata ayıklama ve profil oluşturma araçları hakkında daha fazla bilgi için Araçlar ve ileri seviye özellikler bölümünü inceleyin.
Vulkan doğrulama katmanları
Vulkan doğrulama katmanları, Vulkan API'ye yaptığınız çağrıları incelemek ve yanlış veya en uygun olmayan kullanım hakkında uyarılar ya da hatalar sağlamak için etkinleştirilebilen çalışma zamanı kitaplıklarıdır. Doğrulama işlemi çalışma zamanı ek yükü eklediği ve oyununuzun performansını etkilediği için bu doğrulama katmanları varsayılan olarak etkin değildir. Doğrulama katmanlarını oyununuzda kullanma hakkında bilgi edinmek için Doğrulama katmanıyla hata ayıklama başlıklı makaleyi inceleyin.
Kare yakalama araçları
Oyun karesi sırasında yapılan Vulkan API çağrılarını kaydetmek ve yeniden oynatmak için kare yakalama araçlarını kullanın. Bu araçlar sayesinde:
- Etkin grafik kaynakları hakkında bilgi görüntüleme ve bu kaynakların görselleştirmelerini görme
- Oyununuzun yaptığı API çağrılarının sırasını ve API parametrelerini görme
- Çizim çağrısı sırasında grafik ardışık düzeninin durumunu keşfetme
- Karede belirli bir çizim çağrısına kadar oluşturma sonuçlarını görselleştirme
Android'de çalışan oyunlardan kareler yakalamak için açık kaynaklı RenderDoc aracını kullanın. RenderDoc, hem Vulkan hem de OpenGL ES'nin kare yakalamasını destekler.
Vulkan karelerini yakalamak için Android GPU Inspector (AGI) da kullanılabilir.
Performans analizi araçları
Oyununuzda kare hızının idealin altında olmasına neden olan oluşturma sorunlarını araştırmak için performans analizi araçlarını kullanın. Bağımsız GPU tedarikçileri, oyununuzun profilini oluşturmak ve GPU mimarilerine özel performans verileri sağlamak için tasarlanmış araçlar sunar. Oyununuzun performans özellikleri ve darboğazları, farklı satıcılara ait GPU'larda veya aynı satıcının farklı GPU nesillerinde oluşturulurken önemli ölçüde değişebilir.
Performans verilerini toplamak ve analiz etmek için Android GPU Inspector'ı da kullanabilirsiniz. Tedarikçi araçlarının aksine, Android GPU Inspector farklı tedarikçilerin birden fazla GPU'suyla uyumludur. Ancak Android GPU Inspector, eski Android cihazları desteklemez ve tüm yeni cihazlarla uyumlu olmayabilir.
CTS-D ile Vulkan testini iyileştirme
Android destekli cihaz üreticileri, cihazlarının uyumlu olduğundan emin olmak için Uyumluluk Test Paketi'ni (CTS) kullanır. Geliştirici Destekli CTS (CTS-D), Android uygulama geliştiricileri tarafından gönderilen testlerdir. Bu testler, gelecekteki Android cihazların kullanım alanlarını karşıladığından ve uygulamalarını sorunsuz ve hatasız bir şekilde çalıştırabildiğinden emin olmak için gönderilir.
Vulkan uygulamanızla belirli bir Android destekli cihazı etkileyen yeni bir hata tetiklemeyi başarırsanız sorununuzu ve nasıl kontrol edileceğini açıklayan yeni bir test önerisi gönderebilirsiniz. Bu sayede, sorunun cihazın gelecekteki bir güncellemesinde düzeltilmesi ve aynı hatanın başka cihazlarda da oluşmaması sağlanır.
Test önerisini göndermeyle ilgili adım adım talimatlar için CTS gönderme sürecini inceleyin.