Yerel ve tescilli motorlar

Android'de Vulkan'ı kullanmaya başlama

Vulkan, Android'deki birincil alt düzey grafik API'sidir. Vulkan, kendi oyun motorunu ve oluşturucusunu uygulayan oyunlar için optimum performans sağlar.

Vulkan'ı oyun motorunuzda başarıyla uygulamak için şunları yapmanız gerekir:

  • Vulkan ile kullanılacak Android cihazları belirleme
  • Eski Android cihazları desteklemenin avantajlarını ve 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

Vulkan için minimum cihaz özelliklerini seçme

Vulkan, Android 7.0 (API düzeyi 24) sürümünden itibaren Android'de kullanılabilir. Android 7.0 veya sonraki sürümleri çalıştıran tüm Android cihazlar Vulkan'ı desteklemez. Oyununuzun Vulkan özellikli hangi Android cihazları desteklediğini belirlemeniz gerekir.

Öneriler

Vulkan desteği için minimum gereksinimler olarak aşağıdaki özellikleri kullanın:

  • Cihazda Android 10.0 (API düzeyi 29) veya sonraki bir sürüm yüklü olmalıdır.
  • Cihaz, Vulkan API 1.1 veya sonraki sürümleri destekliyor
  • Cihaz, 2022 Android Baseline profili ile uyumlu donanım özelliklerine ve işlevlerine sahiptir.

Eski cihaz desteği

Oyununuz, farklı grafik özelliklerine sahip çok çeşitli cihazlarda çalışacak şekilde tasarlandıysa Vulkan için minimum cihaz özelliklerini seçme bölümünde ö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 çekim çağrısı olan ve OpenGL ES kullanan oyunlar, OpenGL ES'de çekim çağrısı yapmanın yüksek maliyeti nedeniyle önemli ölçüde sürücü ek yüküyle karşılaşabilir. Bu oyunlar, kare sürelerinin büyük bir kısmını grafik sürücüsünde harcadıkları için CPU'ya bağlı hale gelebilir. Oyunlar, OpenGL ES'den Vulkan'a geçerek CPU ve güç kullanımında da önemli düşüşler görebilir. Bu, özellikle oyununuzda çizim çağrılarını azaltmak için örneklemeyi etkili bir şekilde kullanamayan karmaşık sahneler varsa geçerlidir. Eski cihazları hedeflerken yedek olarak OpenGL ES oluşturma desteğini ekleyin. Hedef cihaz listenizdeki bazı cihazlarda oyununuzu güvenilir bir şekilde çalıştıramayan Vulkan uygulamaları olabilir.

Performans ve özellik eksikliği veya kararlılık sorunları nedeniyle Vulkan özellikli eski cihazları desteklemek istemeyebilirsiniz.

Performans ve Özellikler

Vulkan özellikli eski Android cihazlar, oyununuzu çalıştırmak için gereken özelliklere yönelik oluşturma performansına veya donanım desteğine sahip olmayabilir. Oyununuzda yüksek kaliteli grafikler varsa ve Android'de hedeflediğiniz tek API Vulkan ise bu durumun yaşanma olasılığı daha yüksektir. Birçok eski cihaz, Vulkan API'nin 1.0.3 sürümüyle sınırlıdır ve genellikle daha modern donanımlarda bulunan, yaygın olarak kullanılan Vulkan uzantılarını içermez.

Kararlılık

Eski Android cihazlar, güncel olmayan Vulkan sürücülerini kullanıyor olabilir. Bu sürücü sürümlerinde, oyununuzun kararlılığını etkileyebilecek hatalar olabilir. Sürücü hatalarını gidermek için önemli miktarda test ve mühendislik süresi gerekebilir.

Projenize Vulkan ekleme

Vulkan'ı projenize eklemek için:

  • Vulkan API başlıklarını dahil etme
  • Gölgelendirici kodunu SPIR-V'ye derleme
  • Çalışma zamanında Vulkan API'yi çağırma

Vulkan API başlıklarını dahil etme

Oyununuzun, Vulkan'ı kullanan kodu derlemek için Vulkan API üst dosyalarını içermesi gerekir. Vulkan başlıklarının bir kopyasını Android NDK'da veya Vulkan SDK sürümlerinde paketlenmiş olarak bulabilirsiniz. Belirli bir NDK sürümü, yalnızca NDK sürümünün yayınlandığı tarihte mevcut olan Vulkan başlıklarını içerir. NDK'daki Vulkan üstbilgilerini kullanıyorsanız Vulkan 1.3 sürümünü destekleyen üstbilgi dosyalarını içeren NDK 25 veya sonraki sürümleri 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 kodunu metin dizesi 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'de yazılmış gölgelendirici programlarını SPIR-V'ye derlemek için kullanılabilir. Oyununuz HLSL kullanıyorsa DirectXShaderCompiler, SPIR-V çıkışını destekler. Genellikle gölgelendirici programlarını, oyununuzun öğe derleme sürecinin bir parçası olarak çevrimdışı derler ve SPIR-V modüllerini çalışma zamanı öğelerinizin bir parçası olarak dahil edersiniz.

Çalışma zamanında Vulkan API'yi çağırma

Vulkan API'yi çağırmak için oyununuzun Vulkan API çağrılarına yönelik işlev işaretçileri alması gerekir. Bunu yapmanın en kolay yolu, Android NDK'da bulunan libvulkan.so paylaşılan kitaplığına bağlanmaktır. Kitaplığa bağlamanın iki dezavantajı vardır: ek işlev gönderme ek yükü ve hangi Vulkan API işlev işaretçilerinin otomatik olarak çözümlendiğiyle ilgili sınırlamalar.

Bir Vulkan API işlevini çağırdığınızda kontrol, Vulkan yükleyici adlı bir yapı tarafından yönetilen gönderim tablosundan geçer. Android, LunarG yükleyiciyi değil kendi Vulkan yükleyici uygulamasını kullanır. Bu yükleyici sistemi, Vulkan API'nin katman mimarisinin bir parçasıdır. Derleme sırasında sistem kitaplığına bağlantı oluşturmak, belirli bir API çağrısı için ek bir dağıtım düzeyiyle sonuçlanır. Bu ek yük küçük olsa da çok sayıda Vulkan çağrısı 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ı vardır. Bunların çoğu sistem kitaplığı tarafından otomatik olarak çözümlenmez. 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ü desteğine göre belirlenir.

Android sürümü

Bir Vulkan API sürümü için 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

Android platformunun bir Vulkan API sürümünü desteklemesi, API sürümünün cihazın Vulkan sürücüsü tarafından desteklendiğini garanti etmez. Android 13 yüklü bir cihaz, Vulkan API'nin yalnızca 1.1 sürümünü destekleyebilir.

Vulkan'ı başlatırken şundan daha yüksek bir API sürümü istemeyin:

Desteklenen en yüksek Vulkan API sürümünü belirlemeyle ilgili bir örnek 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 zorunlu özellikler, uzantılar, yetenekler ve minimum parametre sınırları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 kaynak Vulkan Profiles API kitaplığını kullanın. Profil JSON dosyasını kendiniz de ayrıştırabilir ve profil uyumluluğunu belirlemek için ilgili Vulkan API'lerini kullanarak cihaz özelliklerini sorgulayabilirsiniz.

Vulkan Profilleri

Android, Android çalıştıran her cihazda hangi özelliklerin ve uzantıların kullanılabileceğini tanımlayan Vulkan Profilleri'ni kullanır.

Android Baseline Profile (ABP), Vulkan Profili oluşturmaya yönelik ilk girişimdir. ABP2021 ve ABP2022, o dönemdeki etkin cihazların% 85'inden fazlasını kapsayan geriye dönük profillerdir. Bundan sonra 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 sunulabilecek tutarlı özellikler sağlamayı amaçlayan yeni ve ileriye dönük bir profildir. VPA15_minimums, Android 15 için ilk profildir ve her yıl her büyük Android sürümünü kapsayacak yeni bir VPA olacaktır.

Kare hızı ayarlama özelliğini uygulama

Doğru kare hızı, yüksek kaliteli bir oyun deneyimi sunmanın önemli bir parçasıdır. Android Game Development Kit, oyununuzun optimum kare hızı elde etmesine yardımcı olmak için Kare Hızı kitaplığını içerir. Uygulamayla ilgili daha fazla bilgi için Android Frame Pacing'i Vulkan oluşturucunuza entegre etme başlıklı makaleyi inceleyin.

Dolaylı senkronizasyona ve kare hızına güvenmeyin

Takas zincirini yönetmek için vkAcquireNextImageKHR ve vkQueuePresentKHR kullanılır. Genel uygulama veya GPU senkronizasyonu için olası engelleme davranışlarına güvenmekten kaçının.

Bu işlevlerin tam engelleme davranışı, aşağıdakiler arasında önemli ölçüde farklılık gösterebilir:

vkAcquireNextImageKHR'nin tek amacı, kullanılabilir bir sunulabilir görüntü elde etmektir ve engelleme yapabilir veya yapmayabilir. Benzer şekilde, vkQueuePresentKHR bir görüntüyü gösterme isteğini sıraya alır ve engelleyebilir veya engellemeyebilir.

İki işlev de alakasız CPU görevlerini veya GPU işlemlerini senkronize etmek için güvenilir garantiler sağlamaz.

Güçlü senkronizasyon için her zaman GPU-GPU bağımlılıkları (ör. sunmak için oluşturma) için semaforlar, GPU-CPU senkronizasyonu (ör. CPU'da oluşturma işleminin ne zaman bittiğini bilme) için çitler ve daha ayrıntılı GPU yürütme ve bellek bağımlılıkları için ardışık düzen engelleri veya etkinlikler gibi açık Vulkan temel öğelerini kullanın. Açık senkronizasyon kullanmak, öngörülebilir davranış sağlar ve Android'in çeşitli donanım ekosistemine özgü uygulamaya özel zamanlama varyasyonlarından kaynaklanan küçük hataları önler.

Rotasyon öncesi uygulama

Android cihazlar birden fazla yönde görüntülenebilir. Cihazın yönü, oluşturma yüzeyinin yönünden farklı olabilir. Android'deki OpenGL ES'nin aksine Vulkan, ikisi arasındaki tutarsızlıkları işlemez. Yönlendirme sürecinin işleyiş şeklini ve Vulkan kullanırken yönlendirme farklılıklarını ele almanın en uygun yöntemini anlamak 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 profili oluşturma

Vulkan oluşturma koduyla ilgili oluşturma ve performans sorunlarını 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üne göz atın.

Vulkan doğrulama katmanları

Vulkan doğrulama katmanları, Vulkan API'ye yaptığınız çağrıları incelemek ve yanlış veya optimum olmayan kullanımla ilgili 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ğinden ve oyununuzun performansını etkilediğinden bu doğrulama katmanları varsayılan olarak etkin değildir. Doğrulama katmanlarını oyununuzda nasıl kullanacağınız 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ı kaydedip tekrar oynatmak için kare yakalama araçlarını kullanın. Bu araçlar sayesinde:

  • Etkin grafik kaynakları hakkındaki bilgileri ve görselleştirmeleri görüntüleme
  • Oyununuz tarafından yapılan API çağrılarının sırasını ve API parametrelerini görme
  • Çekim çağrısı sırasında grafik ardışık düzeninin durumunu inceleme
  • Karedeki belirli bir çekim çağrısına kadar oluşturma sonuçlarını görselleştirme

Android'de çalışan oyunlardan kare yakalamak için açık kaynaklı RenderDoc aracını kullanın. RenderDoc, hem Vulkan hem de OpenGL ES'nin kare yakalama özelliğini destekler.

Vulkan karelerini yakalamak için Android GPU Inspector (AGI) da kullanılabilir.

Performans analizi araçları

Oyununuzda kare hızlarının düşmesine neden olan oluşturma sorunlarını araştırmak için performans analizi araçlarını kullanın. GPU tedarikçileri, oyununuzun profilini çıkarmak ve GPU mimarilerine özel performans verileri sağlamak için tasarlanmış araçlar sunar. Oyununuzun performans özellikleri ve darboğazları, farklı tedarikçilerin GPU'larında, hatta aynı tedarikçinin farklı GPU nesillerinde oluşturulurken önemli ölçüde değişiklik gösterebilir.

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 Compatibility Test Suite'i (CTS) kullanır. Geliştirici Destekli CTS (CTS-D), 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 Android uygulama geliştiricileri tarafından gönderilen testlerdir.

Vulkan uygulamanızla belirli bir Android destekli cihazı etkileyen yeni bir hata tetiklemeyi başarırsanız sorununuzu ve kontrol etme yöntemlerini açıklayan yeni bir test teklifi gönderebilirsiniz. Bu sayede, sorunun cihaz için gelecekteki bir güncellemede düzeltilmesi ve aynı hatanın başka cihazlarda yaşanmaması sağlanır.

Test teklifinin nasıl gönderileceğine ilişkin adım adım talimatlar için CTS gönderme sürecini inceleyin.