2015-04-22 16 views
5

Di solito, utilizzo il codice seguente per identificare la versione iOS del dispositivo.Codice iOS per identificare il supporto del metallo in runtime?

if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) 

In un modo simile, sto cercando di trovare il supporto di metallo per il dispositivo. Metal è supportato per i dispositivi Apple con GPU A7 (o superiore) e iOS 8.0.

Questo è il modo in cui mi aspetto che il mio codice al lavoro:

if (MetalSupported == true) { 
    // metal programming 
} else { 
    // opengles2 programming 
} 

Come faccio ad avere il valore per la variabile booleana MetalSupported?

risposta

7

E 'bene che siete alla ricerca di qualcosa di specifico per metallo - in generale, iOS versione verifiche e controlli dei nomi hardware sono fragili, perché si basano su vostra applicazione conoscere tutte le versioni del sistema operativo e dei dispositivi che potrebbe mai funzionare esso. Se Apple dovesse tornare indietro e rilasciare una versione di iOS 7.x che ha aggiunto il supporto di Metal (ok, sembra improbabile), o un dispositivo che supporti Metal ma non è uno dei nomi hardware che stai guardando (sembra molto più probabile), rimarrai bloccato nel dover rintracciare tutte queste cose e aggiornare la tua app per gestirle.

In ogni caso, il modo migliore per verificare se il dispositivo su cui stai lavorando è abbastanza metallo per il tuo fantastico codice grafico? Basta cercare di ottenere un oggetto MTLDevice:

id<MTLDevice> device = MTLCreateSystemDefaultDevice(); 
if (device) { 
    // ready to rock 
} else { 
    // back to OpenGL 
} 

Nota che proprio test per la presenza di una classe quadro di metallo non aiuta - le classi ci sono su qualsiasi dispositivo con iOS 8 (tutta la strada fino al iPhone 4s & iPad 2), indipendentemente dal fatto che quel dispositivo abbia una GPU compatibile con Metal.

Inoltre, non vi è alcuna struttura metallica in iOS Simulator, quindi è necessario inserire alcuni #if s attorno a questo e qualsiasi altro codice di metallo se si eseguono test del simulatore (delle parti della propria app che don ' t utilizzare le API GPU, perché il simulatore è un imitatore scarso delle prestazioni della GPU del dispositivo, anche per GL).

-1

Penso che il modo migliore sia cercare di ottenere una delle classi di metallo.

Class metalDeviceClass = NSClassFromString(@"MTLDevice"); 
BOOL isMetalAvailable = metalDeviceClass != nil; 
if (isMetalAvailable) { 
    NSLog(@"Metal available"); 
} else { 
    NSLog(@"Metal not available"); 
} 
+2

1. "MTLDevice' non è una classe; è un protocollo, quindi questo test fallirà anche su dispositivi supportati da Metal. 2.Le classi nel framework Metal sono ancora lì su dispositivi non supportati da Metal (non puoi fare nulla con loro), quindi testare la loro presenza non ti dirà se puoi eseguire il rendering con Metal. Vedi [la mia risposta] (http://stackoverflow.com/a/29903799/957768). – rickster

+0

Sì, grazie per aver indicato. In realtà non ho controllato se fosse una classe o un protocollo. Il mio punto era verificare una delle classi disponibili. La tua soluzione è corretta. – Krivoblotsky

0

Ricster ha spiegato chiaramente tutti i metodi per identificare il dispositivo che supporta il metallo in fase di runtime. Se non è possibile utilizzare MTLCreateSystemDefaultDevice() nella classe includendo librerie di metalli, utilizzare le informazioni sul dispositivo (versione iOS, architettura gpu/cpu), ma è necessario considerare tutti i casi spiegati da Ricster quando si utilizzano le informazioni sul dispositivo.

void deviceConfigurations(){ 
     size_t size; 
     cpu_type_t type; 
     cpu_subtype_t subtype; 
     size = sizeof(type); 
     sysctlbyname("hw.cputype", &type, &size, NULL, 0); 

     size = sizeof(subtype); 
     sysctlbyname("hw.cpusubtype", &subtype, &size, NULL, 0); 
} 

Utilizzare Sottotipo e tipo variabile per identificare il dispositivo e altre informazioni.

+0

Ciò significherebbe tenere un elenco di tutti i dispositivi che possono eseguire Metal ... E aggiornarlo ogni volta che Apple rilascia un nuovo dispositivo. Se la tua app è costruita con l'SDK di iOS 8 o versioni successive, che deve essere utilizzata per l'utilizzo di Metal, allora "MTLCreateSystemDefaultDevice" è a tua disposizione per chiamare, senza alcun costo. – rickster

5

Su iOS, è sufficiente controllare lo MTLCreateSystemDefaultDevice(). Se restituisce un dispositivo valido, sei a posto. Su macOS, devi stare attento; utilizzare [MTLCopyAllDevices() count] per determinare se sono disponibili dispositivi metallici supportati.

Si dovrebbe evitare l'uso di MTLCreateSystemDefaultDevice() su macOS perché ciò può forzare un interruttore mux alla GPU discreta (ad esempio: se si ha a che fare con un laptop con commutazione grafica automatica tra una grafica discreta e integrata).

+0

MTLCopyAllDevices è disponibile solo in macOS. https://developer.apple.com/documentation/metal/1433367-mtlcopyalldevices –

+0

Ah, è vero. Grazie. –

Problemi correlati