Motori nativi e proprietari

Iniziare a utilizzare Vulkan su Android

Vulkan è la principale API grafica di basso livello su Android. Vulkan offre prestazioni ottimali per i giochi che implementano un proprio motore grafico e renderer.

Per implementare correttamente Vulkan nel tuo motore grafico devi:

  • Identificare quali dispositivi Android utilizzare con Vulkan
  • Vantaggi del supporto dei dispositivi Android meno recenti
  • Aggiungi Vulkan al target della build Android
  • Scegli un compilatore shaker per creare SPIR-V per Vulkan
  • Determina la versione dell'API Vulkan disponibile in fase di runtime
  • Scopri come ottimizzare le operazioni di rendering Vulkan con i profili Vulkan, il pacing dei frame e la pre-rotazione
  • Seleziona strumenti grafici per il debug e l'analisi delle prestazioni

Scegli le specifiche minime del dispositivo per Vulkan

Vulkan è disponibile su Android a partire da Android 7.0 (livello API 24). Non tutti i dispositivi con Android 7.0 o versioni successive supportano Vulkan. Devi determinare quali dispositivi Android compatibili con Vulkan sono supportati dal tuo gioco.

Contenuti consigliati

Utilizza le seguenti specifiche come requisiti minimi per l'assistenza Vulkan:

  • Sul dispositivo sia installato Android 10.0 (livello API 29) o versioni successive
  • Il dispositivo supporta l'API Vulkan versione 1.1 o successive
  • Il dispositivo ha caratteristiche e funzionalità hardware compatibili con il profilo Baseline Android del 2022

Assistenza per dispositivi meno recenti

Se il tuo gioco è progettato per essere eseguito su una vasta gamma di dispositivi con diversi livelli di funzionalità grafiche, potrebbe essere necessario supportare dispositivi più vecchi di quelli consigliati nella sezione Scegliere le specifiche minime dei dispositivi per Vulkan. Prima di sviluppare il supporto per i dispositivi meno recenti, valuta se Vulkan offre vantaggi per il tuo gioco. I giochi con molte chiamate di disegno e che utilizzano OpenGL ES possono registrare un notevole overhead del driver a causa dell'elevato costo delle chiamate di disegno in OpenGL ES. La CPU di questi giochi può essere vincolata dal trascorrere gran parte del loro tempo di frame nel driver di grafica. I giochi possono anche registrare riduzioni significative della CPU e del consumo di energia passando da OpenGL ES a Vulkan. Ciò è soprattutto se il gioco ha scene complesse che non possono essere usate in modo efficace per ridurre le chiamate di estrazione. Quando scegli come target dispositivi meno recenti, includi il supporto del rendering OpenGL ES come riserva, in quanto alcuni dispositivi nell'elenco dei dispositivi target potrebbero avere implementazioni Vulkan che non consentono di eseguire il gioco in modo affidabile.

Potrebbe non essere opportuno supportare i dispositivi compatibili con Vulkan meno recenti perché mancano prestazioni e funzionalità o presentano problemi di stabilità.

Prestazioni e funzionalità

I dispositivi Android compatibili con Vulkan meno recenti potrebbero non avere le prestazioni di rendering o il supporto hardware per le funzionalità necessarie per eseguire il tuo gioco. Ciò è particolarmente probabile se il tuo gioco ha una grafica ad alta fedeltà e Vulkan è l'unica API che hai scelto come target su Android. Molti dispositivi meno recenti sono limitati alla versione 1.0.3 dell'API Vulkan e spesso mancano le estensioni Vulkan ampiamente utilizzate e disponibili su hardware più moderno.

Stabilità

I dispositivi Android meno recenti potrebbero utilizzare driver Vulkan obsoleti. Queste versioni del driver potrebbero includere bug che possono influire sulla stabilità del gioco. La risoluzione dei bug dei conducenti può richiedere una notevole quantità di tempo per i test e la progettazione.

Aggiungi Vulkan al progetto

Per aggiungere Vulkan al tuo progetto devi:

  • Includi intestazioni API Vulkan
  • Compila il codice shaker in SPIR-V
  • Chiama l'API Vulkan in fase di runtime

Includi intestazioni API Vulkan

Il gioco deve includere i file di intestazione dell'API Vulkan per compilare il codice che utilizza Vulkan. Puoi trovare una copia delle intestazioni Vulkan in Android NDK o in un pacchetto nelle release dell'SDK Vulkan. Qualsiasi versione NDK specifica include solo le intestazioni Vulkan disponibili al momento del rilascio dell'NDK. Se utilizzi le intestazioni Vulkan di NDK, utilizza la versione 25 o successive di NDK, che include i file di intestazione che supportano Vulkan versione 1.3. L'SDK Vulkan dispone della versione più recente delle intestazioni.

Compila il codice shaker in SPIR-V

L'API Vulkan prevede che i programmi shaker vengano forniti nel formato binario intermedio SPIR-V. Questa convenzione è diversa da OpenGL ES, in cui puoi inviare il codice sorgente scritto in OpenGL Shading Language (GLSL) come stringhe di testo. Usa un compilatore shaker per acquisire il codice scritto in un linguaggio shader come GLSL o il High-level Shader Language (HLSL) e compilarlo in moduli SPIR-V per l'utilizzo con Vulkan.

Il compilatore shaderc può essere utilizzato per compilare i programmi Shaderc scritti in GLSL in SPIR-V. Se il tuo gioco utilizza HLSL, DirectXShaderCompiler supporta l'output SPIR-V. In genere, stiplichi i programmi Shar offline come parte del processo di creazione delle risorse per il tuo gioco e includi i moduli SPIR-V come parte delle tue risorse di runtime.

Chiama l'API Vulkan in fase di runtime

Per chiamare l'API Vulkan, il gioco deve ottenere puntatori di funzione alle chiamate API Vulkan. Il modo più semplice per farlo è creare un collegamento alla libreria condivisa libvulkan.so, inclusa nell'NDK di Android. Il collegamento alla libreria presenta due carenze: l'overhead di invio di funzioni aggiuntivo e limitazioni relative ai puntatori delle funzioni API Vulkan vengono risolti automaticamente.

Quando chiami una funzione API Vulkan, il controllo passa attraverso una tabella di invio gestita da un costrutto chiamato caricatore Vulkan. Android utilizza la propria implementazione del caricatore Vulkan e non il caricatore LunarG. Questo sistema di caricamento fa parte dell'architettura dei livelli dell'API Vulkan. Il collegamento alla libreria di sistema al momento della creazione comporta un livello di invio aggiuntivo per una determinata chiamata API. L'overhead è ridotto, ma può essere evidente per i giochi che eseguono volumi elevati di chiamate Vulkan.

La libreria di sistema in genere risolve solo i puntatori alle funzioni Vulkan che sono considerate parte dell'API principale. Vulkan ha un numero elevato di estensioni, che definiscono funzioni Vulkan aggiuntive, molte delle quali non vengono risolte automaticamente dalla libreria di sistema. Devi risolvere manualmente i puntatori a queste funzioni Vulkan prima di utilizzarle.

Per limitare questi problemi, risolvi dinamicamente i puntatori a tutte le funzioni Vulkan che intendi utilizzare in fase di runtime. Un modo per raggiungere questo obiettivo è utilizzare una libreria di meta-loader open source come volk. Il gioco di esempio AGDKTunnel integra volk per questo scopo. Se utilizzi una libreria meta-loader, non creare link alla libreria condivisa libvulkan.so negli script di build.

Determinare la versione dell'API Vulkan disponibile

Android supporta le seguenti versioni dell'API Vulkan:

  • 1.0.3
  • 1,1
  • 1.3

Il numero di versione più alto dell'API Vulkan disponibile su un determinato dispositivo è determinato dalla versione di Android e dal supporto del driver Vulkan.

Versione di Android

Il supporto della piattaforma per una versione dell'API Vulkan dipende da una versione minima di Android (livello API):

  • 1.3 - Android 13.0 (livello API 33) e versioni successive
  • 1.1 - Android 10.0 (livello API 29) e versioni successive
  • 1.0.3 — Android 7.0 (livello API 24) e versioni successive

Assistenza driver Vulkan

Il supporto della piattaforma Android per una versione API Vulkan non garantisce che la versione dell'API sia supportata dal driver Vulkan del dispositivo. Un dispositivo con Android 13 potrebbe supportare solo la versione 1.1 dell'API Vulkan.

Durante l'inizializzazione di Vulkan, non richiedere una versione API superiore a:

  • La versione massima dell'API Vulkan per la versione di Android in esecuzione sul dispositivo
  • La versione dell'API Vulkan segnalata da vkEnumerateInstanceVersion
  • La versione dell'API Vulkan segnalata dalla proprietà apiVersion della struttura VkPhysicalDeviceProperties

Di seguito è riportato un esempio per determinare la versione dell'API Vulkan più alta supportata:

// 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;
}

Determinare la compatibilità del profilo Vulkan

I profili Vulkan sono file JSON che definiscono un insieme di funzionalità, estensioni, funzionalità e limiti minimi di parametri obbligatori che un dispositivo Vulkan deve supportare per essere compatibile con il profilo. Per determinare se un dispositivo è compatibile con un profilo Vulkan specifico, ad esempio il profilo Baseline Android Baseline del 2022, utilizza la libreria dell'API Vulkan Profiles open source. Puoi anche analizzare il file JSON del profilo ed eseguire query sulle funzionalità del dispositivo utilizzando le API Vulkan pertinenti per determinare la compatibilità del profilo.

Profili Vulkan

Android utilizza i profili Vulkan, che definiscono le funzionalità e le estensioni disponibili per ciascuno dei dispositivi su cui è installato Android.

Android Baseline Profile (ABP) è il primo tentativo di creare un profilo Vulkan. ABP2021 e ABP2022 sono profili indietro volti a coprire più dell'85% dei dispositivi attivi in quel momento. In futuro non ci saranno nuovi ABP.

Vulkan Profiles for Android (VPA) è il nuovo profilo lungimirante pensato per riflettere le esigenze degli sviluppatori di software e fornire funzionalità coerenti non appena gli sviluppatori di hardware saranno in grado di fornirle. VPA15_minimums è il primo profilo per Android 15 e ogni anno ci sarà un nuovo VPA per coprire ogni release principale di Android.

Implementa il pacing del frame

Il pacing corretto del frame è un aspetto essenziale per offrire un'esperienza di gameplay di alta qualità. L'Android Game Development Kit include la libreria Frame Pacing per aiutare il tuo gioco a raggiungere un pacing ottimale del frame. Per ulteriori dettagli sull'implementazione, consulta Integrare il pacing frame Android nel renderer Vulkan.

Implementa la pre-rotazione

I dispositivi Android possono essere visualizzati in più orientamenti. L'orientamento del dispositivo può essere diverso da quello della superficie di rendering. A differenza di OpenGL ES su Android, Vulkan non gestisce le discrepanze tra i due. Per comprendere il funzionamento del processo di orientamento e il metodo ottimale per gestire le differenze di orientamento quando si utilizza Vulkan, consulta Gestire la rotazione dei dispositivi con la pre-rotazione di Vulkan.

Risolvere i problemi e profilare il rendering di Vulkan

Sono disponibili diversi strumenti per diagnosticare i problemi di rendering e di prestazioni con il codice di rendering Vulkan.

Per ulteriori informazioni sugli strumenti di debug e profilazione di Vulkan, consulta la sezione Strumenti e funzionalità avanzate.

Livelli di convalida Vulkan

I livelli di convalida Vulkan sono librerie di runtime che possono essere abilitate per controllare le chiamate all'API Vulkan e fornire avvisi o errori sull'utilizzo non corretto o non ottimale. Questi livelli di convalida non sono attivi per impostazione predefinita, poiché il processo di convalida aggiunge l'overhead di runtime e influisce sulle prestazioni del gioco. Per informazioni su come utilizzare i livelli di convalida con il gioco, consulta Debug con il livello di convalida.

Strumenti di acquisizione frame

Usa gli strumenti di acquisizione frame per registrare e ripetere le chiamate API Vulkan effettuate durante un frame di gioco. Questi strumenti ti consentono di:

  • Visualizzare informazioni e visualizzazioni di risorse grafiche attive
  • Controlla la sequenza delle chiamate API effettuate dal tuo gioco e i parametri API
  • Esplorare lo stato della pipeline grafica al momento di una chiamata di disegno
  • Visualizza i risultati del rendering fino a una specifica chiamata di disegno nel frame

Utilizza lo strumento open source RenderDoc per acquisire frame dai giochi in esecuzione su Android. RenderDoc supporta l'acquisizione di frame sia di Vulkan che di OpenGL ES.

Anche Android GPU Inspector (AGI) può essere utilizzato anche per acquisire frame Vulkan.

Strumenti di analisi del rendimento

Usa gli strumenti di analisi delle prestazioni per esaminare i problemi di rendering nel tuo gioco che causano frequenze fotogrammi non ottimali. I fornitori di singole GPU forniscono strumenti progettati per profilare il gioco e forniscono dati sulle prestazioni specifici per le loro architetture GPU. Le caratteristiche prestazionali e i colli di bottiglia del tuo gioco possono variare in modo significativo quando si esegue il rendering su GPU di diversi fornitori o anche su diverse generazioni di GPU dello stesso fornitore.

Puoi anche utilizzare il GPU Inspector di Android per raccogliere e analizzare i dati sul rendimento. A differenza degli strumenti dei fornitori, Android GPU Inspector è compatibile con più GPU di diversi fornitori. Tuttavia, Android GPU Inspector non supporta i dispositivi Android meno recenti e potrebbe non essere compatibile con tutti i nuovi dispositivi.

Migliora i test Vulkan con CTS-D

I produttori di dispositivi con tecnologia Android utilizzano la Compatibility Test Suite (CTS) per garantire la compatibilità dei loro dispositivi. I test CTS forniti dallo sviluppatore (CTS-D) sono test inviati dagli sviluppatori di applicazioni Android per garantire che i futuri dispositivi Android soddisfino i loro casi d'uso e siano in grado di eseguire le loro applicazioni senza problemi e senza bug.

Se riesci ad attivare un nuovo bug nella tua applicazione Vulkan che interessa un dispositivo Android specifico, puoi inviare una nuova proposta di test, descrivendo il problema e i modi per controllarlo. In questo modo ti assicuri che il problema venga risolto in un aggiornamento futuro del dispositivo e che lo stesso bug non si verifichi su altri dispositivi.

Consulta la procedura di invio del CTS per istruzioni passo passo su come inviare la proposta di test.