Motori nativi e proprietari

Iniziare a utilizzare Vulkan su Android

Vulkan è l'API grafica di basso livello principale su Android. Vulkan offre prestazioni ottimali per i giochi che implementano il proprio motore di gioco e renderer.

Per implementare correttamente Vulkan nel tuo motore di gioco, devi:

  • Identificare quali dispositivi Android utilizzare con Vulkan
  • Comprendere i compromessi del supporto dei dispositivi Android meno recenti
  • Aggiungere Vulkan alla destinazione di build Android
  • Scegli un compilatore di shader per creare SPIR-V per Vulkan
  • Determinare 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 gli strumenti grafici per il debug e l'analisi delle prestazioni

Scegliere le specifiche minime del dispositivo per Vulkan

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

Consigli

Utilizza le seguenti specifiche come requisiti minimi per il supporto di Vulkan:

  • Il dispositivo esegue Android 10.0 (livello API 29) o versioni successive
  • Il dispositivo supporta la versione 1.1 o successive dell'API Vulkan
  • Il dispositivo dispone di funzionalità e caratteristiche hardware compatibili con il profilo di base Android del 2022

Supporto per dispositivi meno recenti

Se il tuo gioco è progettato per essere eseguito su un'ampia gamma di dispositivi con diversi livelli di funzionalità grafiche, potresti dover supportare dispositivi più vecchi di quelli consigliati in Scegliere le specifiche minime dei dispositivi per Vulkan. Prima di creare il supporto per i dispositivi meno recenti, valuta se Vulkan offre vantaggi al tuo gioco. I giochi con molte chiamate di disegno e che utilizzano OpenGL ES possono riscontrare un overhead significativo del driver a causa del costo elevato delle chiamate di disegno all'interno di OpenGL ES. Questi giochi possono diventare CPU-bound se trascorrono gran parte del tempo frame nel driver grafico. I giochi possono anche registrare riduzioni significative dell'utilizzo di CPU ed energia passando da OpenGL ES a Vulkan. Ciò è particolarmente applicabile se il tuo gioco ha scene complesse che non possono utilizzare in modo efficace l'istanza per ridurre le chiamate di disegno. Quando scegli come target dispositivi meno recenti, includi il supporto del rendering OpenGL ES come fallback, in quanto alcuni dispositivi nell'elenco dei dispositivi di destinazione potrebbero avere implementazioni Vulkan che non possono eseguire il gioco in modo affidabile.

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

Prestazioni e funzionalità

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

Stabilità

I dispositivi Android meno recenti potrebbero utilizzare driver Vulkan obsoleti. Queste versioni dei driver potrebbero includere bug che possono influire sulla stabilità del gioco. La risoluzione dei bug dei driver può richiedere tempi di test e ingegnerizzazione significativi.

Aggiungere Vulkan al progetto

Per aggiungere Vulkan al tuo progetto devi:

  • Includi intestazioni API Vulkan
  • Compila il codice dello shader 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 degli header Vulkan nell'NDK Android o inclusi nelle versioni dell'SDK Vulkan. Qualsiasi versione specifica dell'NDK include solo le intestazioni Vulkan disponibili al momento del rilascio dell'NDK. Se utilizzi le intestazioni Vulkan dell'NDK, utilizza la versione 25 o successive dell'NDK, che include file di intestazione che supportano Vulkan versione 1.3. L'SDK Vulkan ha la versione più recente delle intestazioni.

Compila il codice dello shader in SPIR-V

L'API Vulkan prevede che i programmi shader vengano forniti nel formato intermedio binario 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. Utilizza un compilatore di shader per prendere il codice scritto in un linguaggio di shader come GLSL o High-level Shader Language (HLSL) e compilarlo in moduli SPIR-V da utilizzare con Vulkan.

Il compilatore shaderc può essere utilizzato per compilare programmi shader scritti in GLSL in SPIR-V. Se il tuo gioco utilizza HLSL, il DirectXShaderCompiler supporta l'output SPIR-V. In genere, compili i programmi shader offline nell'ambito del processo di creazione degli asset per il tuo gioco e includi i moduli SPIR-V come parte degli asset di runtime.

Chiama l'API Vulkan in fase di runtime

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

Quando chiami una funzione dell'API Vulkan, il controllo passa attraverso una tabella di distribuzione 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 a livelli dell'API Vulkan. Il collegamento alla libreria di sistema in fase di compilazione comporta un livello di invio aggiuntivo per una determinata chiamata API. Sebbene il sovraccarico sia minimo, può essere evidente per i giochi che eseguono un elevato numero 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. Prima di utilizzarli, devi risolvere manualmente i puntatori a queste funzioni Vulkan.

Per mitigare questi problemi, risolvi dinamicamente i puntatori a tutte le funzioni Vulkan che intendi utilizzare in fase di runtime. Un modo per farlo è utilizzare una libreria di meta-loader open source come volk. Il gioco di esempio AGDKTunnel integra volk a questo scopo. Se utilizzi una libreria di caricamento dei metadati, non collegarti 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 dei 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

Supporto dei driver Vulkan

Il supporto della piattaforma Android per una versione dell'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.

Quando inizializzi Vulkan, non richiedere una versione dell'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 di determinazione della versione più recente dell'API Vulkan 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, capacità e limiti minimi dei parametri richiesti 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 Android Baseline 2022, utilizza la libreria API Vulkan Profiles open source. Puoi anche analizzare autonomamente 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 che eseguono Android.

Android Baseline Profile (ABP) è il primo tentativo di creare un profilo Vulkan. ABP2021 e ABP2022 sono profili retrospettivi che mirano a coprire oltre l'85% dei dispositivi attivi in quel periodo. Non verranno più creati nuovi ABP.

Vulkan Profiles for Android (VPA) è il nuovo profilo orientato al futuro che mira a riflettere le esigenze degli sviluppatori di software e a promuovere funzionalità coerenti non appena gli sviluppatori hardware possono renderle disponibili. VPA15_minimums è il primo profilo per Android 15 e ogni anno verrà creato un nuovo VPA per coprire ogni release principale di Android.

Implementare il pacing dei frame

La corretta spaziatura dei fotogrammi è un aspetto essenziale per offrire un'esperienza di gioco di alta qualità. L'Android Game Development Kit include la libreria Frame Pacing per aiutare il tuo gioco a ottenere una spaziatura dei frame ottimale. Per ulteriori dettagli sull'implementazione, vedi Integrare Android Frame Pacing nel renderer Vulkan.

Non fare affidamento sulla sincronizzazione implicita e sul ritmo dei fotogrammi

vkAcquireNextImageKHR e vkQueuePresentKHR vengono utilizzati per gestire la swapchain. Evita di fare affidamento sul loro potenziale comportamento di blocco per la sincronizzazione generale dell'applicazione o della GPU.

Il comportamento di blocco preciso di queste funzioni può variare notevolmente tra:

  • dispositivi Android
  • Driver GPU
  • Stati del motore di presentazione (VkPresentModeKHR)

L'unico scopo di vkAcquireNextImageKHR è acquisire un'immagine presentabile disponibile e potrebbe o meno bloccare. Analogamente, vkQueuePresentKHR mette in coda una richiesta di visualizzazione di un'immagine e può bloccare o meno.

Nessuna delle due funzioni fornisce garanzie affidabili per la sincronizzazione di attività della CPU o operazioni della GPU non correlate.

Per una sincronizzazione efficace, utilizza sempre primitive Vulkan esplicite come semafori per le dipendenze GPU-GPU (ad es. render-to-present), fences per la sincronizzazione GPU-CPU (ad es. sapere quando il rendering è terminato sulla CPU) e barriere o eventi della pipeline per dipendenze di esecuzione e memoria della GPU più granulari. L'utilizzo della sincronizzazione esplicita garantisce un comportamento prevedibile ed evita bug sottili causati da variazioni di timing specifiche dell'implementazione inerenti al diverso ecosistema hardware di Android.

Implementare 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 capire come funziona il processo di orientamento e il metodo ottimale per gestire le differenze di orientamento quando utilizzi Vulkan, consulta Gestire la rotazione del dispositivo con la pre-rotazione Vulkan.

Risolvere i problemi e profilare il rendering Vulkan

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

Per saperne di più 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 ispezionare le chiamate all'API Vulkan e fornire avvisi o errori relativi a un utilizzo errato o non ottimale. Questi livelli di convalida non sono attivi per impostazione predefinita, in quanto la procedura di convalida aggiunge un sovraccarico di runtime e influisce sulle prestazioni del gioco. Per informazioni su come utilizzare i livelli di convalida con il tuo gioco, vedi Debug con il livello di convalida.

Strumenti di acquisizione dei fotogrammi

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

  • Visualizzare informazioni e visualizzazioni delle risorse grafiche attive
  • Visualizza la sequenza di chiamate API effettuate dal tuo gioco e i parametri API
  • Esplora 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 i frame dei giochi in esecuzione su Android. RenderDoc supporta l'acquisizione di frame sia di Vulkan che di OpenGL ES.

È possibile utilizzare anche Android GPU Inspector (AGI) per acquisire i frame Vulkan.

Strumenti di analisi del rendimento

Utilizza gli strumenti di analisi delle prestazioni per esaminare i problemi di rendering nel tuo gioco che causano frame rate non ottimali. I singoli fornitori di GPU forniscono strumenti progettati per profilare il tuo gioco e fornire dati sulle prestazioni specifici per le loro architetture GPU. Le caratteristiche di prestazioni e i colli di bottiglia del tuo gioco possono variare in modo significativo durante il rendering su GPU di fornitori diversi o anche su generazioni di GPU diverse dello stesso fornitore.

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

Migliorare i test Vulkan con CTS-D

I produttori di dispositivi basati su Android utilizzano la suite di test di compatibilità (CTS) per assicurarsi che i loro dispositivi siano compatibili. I test CTS basati sugli sviluppatori (CTS-D) sono test inviati dagli sviluppatori di applicazioni per Android per assicurarsi 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 con la tua applicazione Vulkan che interessa un dispositivo Android specifico, puoi inviare una nuova proposta di test, descrivendo il problema e i modi per verificarlo. In questo modo, il problema viene risolto in un aggiornamento futuro del dispositivo e si garantisce 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.