2011-12-20 9 views
6

Trovo che quando abilito questa opzione sviluppatore, il mio progetto OpenGL smette di funzionare. Un po 'allarmante per non dire altro.ICS Android: cosa fa in realtà l'opzione "Forza rendering GPU" del sistema?

Logcat mostra uno zillion di questi:

E/libEGL (1022): called unimplemented OpenGL ES API 
E/libEGL (1022): called unimplemented OpenGL ES API 
E/libEGL (1022): called unimplemented OpenGL ES API 
... 

La prima scena rende perfettamente, ma dopo quel primo swapbuffers(), tutte le API susbequent GL ES (anche glSetMatrixMode()) non fanno altro che log "API non implementata".

Questo funziona perfettamente (vale a dire implementato) se l'opzione "Imponi rendering GPU" è impostata su su.

Quindi, cosa fa effettivamente questa opzione?

risposta

3

Questa opzione è destinata agli sviluppatori, in modo che possano facilmente testare le proprie app con Accelerazione H/W attivata. A quanto ho capito, un'app 2D che utilizza Canvas Apis può trarre vantaggio da questa opzione poiché l'attivazione forzerà il sistema a creare un contesto GLES2.0 nativo su un thread diverso e fare in modo che la classe Canvas utilizzi l'accelerazione GLES h/w backend invece di quello di Skia. Questa creazione di contesto nativa GLES2.0 avviene nel codice C Native e lo sviluppatore dell'app non ha alcun controllo su questo.

Tornando al tuo problema, il "messaggio di errore non implementato chiamato" sta fondamentalmente dicendo che (1) stai effettivamente utilizzando il Contesto GL sbagliato (ad esempio, effettuando chiamate GLES1.1 con un contesto GLES2.0 o viceversa) o (2) il tuo dispositivo non è stato in grado di caricare i driver GLES e quindi il sistema non è riuscito a trovare l'effettivo puntatore della funzione GL. Il sistema sa cosa caricare leggendo l'egl.il file cfg si trova in/system/lib/egl/e il driver GL stesso si trova in/system/vendor/lib /.

Vorrei seguire Google perché questo potrebbe essere solo un bug.

+0

Questo è abbastanza vicino per me, e si adatta alle osservazioni e a ciò che ho imparato altrove. Ho ricevuto un tweet dalla persona con grafica Android Romain Guy ... ha detto che le app OpenGL avranno questo problema solo se creano il loro contesto EGL sul thread principale dell'interfaccia utente. È più comune che tutte le chiamate GL vengano eseguite su un thread dedicato, una pratica che non mi piace per motivi troppo noiosi per entrare. –

+1

@ReubenScratton Sto avendo lo stesso identico problema qui, e sto anche creando il contesto EGL sul thread principale. Hai mai trovato una soluzione a questo o sei finito per usare un thread separato per GL? –

+1

Alla fine ho creato un thread di rendering dedicato e spostato tutto il codice GL. Questo era eccessivo per i miei bisogni, e presumibilmente il tuo, ma questa particolare caratteristica del sistema operativo presuppone che tutte le app GL effettuino il rendering del thread principale e che dobbiamo andare avanti. –

2

Forza l'accelerazione hardware in tutte le applicazioni. Puoi leggere maggiori informazioni qui: http://developer.android.com/guide/topics/graphics/hardware-accel.html

Assicurati di controllare le operazioni non supportate, che è probabile che si tratti di problemi.

+0

Grazie per il collegamento, ma la mia UI è * interamente * OpenGL ES ... è già accelerata. Non utilizzo alcuna API Canvas e non capisco perché questa impostazione possa influire su un'app basata su GL. Sembra che questa impostazione causi il caricamento di un driver GL alternativo. –

+0

Interessante, non mi sorprenderebbe se caricasse un altro driver per eseguire l'accelerazione hardware per gli apis di tela. (Che sono quasi sicuro al 100% è quello che stai forzando) Per testare la mia teoria potresti abilitare hw acc nel manifest delle tue applicazioni con un target sdk di almeno 3.0. Le istruzioni per questo sono nel link nella risposta org. – smith324

0

La modalità di accelerazione in ICS non è più speciale di Honeycomd. Di default la modalità di accelerazione è abilitata per tutte le applicazioni indirizzate all'API 14 o successive. Ma allo stesso tempo, ci sono applicazioni che sono mirate ad altre versioni di SDK. Pertanto, è possibile abilitare l'accelerazione hardware in queste applicazioni impostando "Forza rendering GPU". C'è un ottimo explanation e un post di Dianne che spiega questo.

+0

Questo è davvero un buon post di hackbod, ma sfortunatamente non mi aiuta molto. Sono sempre più dell'opinione che si tratti di un bug in ICS. L'ultima osservazione è che dopo il primo frame draw (con successo), il mio EGLImpl.mEGLContext cambia. Abbastanza sicuro che non dovrebbe succedere. –

+0

Prova a porre questa domanda specifica nei gruppi google della piattaforma Android. https://groups.google.com/forum/#!forum/android-platform Inoltre ho trovato una buona spiegazione di questo errore qui: http://stackoverflow.com/questions/5926316/android-gles20-called-unimplemented- opengl-es-api – Yury

+0

Potrei farlo, sto ancora indagando. Sembra che il sistema operativo stia costringendo l'app a passare a un renderer 2.0, motivo per cui le API glMatrixMode ecc. All'improvviso non sono supportate. Questo nonostante le dichiarazioni manifest che vengono utilizzate solo 1.1. Bit di un errore ICS epico se questa osservazione è corretta ... –

0

Come è stato detto qui, questa opzione impone l'accelerazione hardware grafica ed è presumibilmente un valore predefinito su livello API 14 o 15, intendo ICS.

Non è consigliabile testarlo su un emulatore perché renderà il computer e Eclipse lenti e/o in crash. Ho provato questa impostazione su emulatori con una vasta gamma di configurazioni di risorse (diverse dimensioni per display, cache, CPU e RAM) con API 14 e 15 e si blocca sempre.

Sarebbe meglio testare la tua app su un dispositivo Dual Core come un recente tablet Samsung Galaxy 10.1, 8.9 Tablet o Motorola Xoom che ha un hardware reale come la GPU nVidia Tegra per supportare l'accelerazione da Honeycomb, rendendolo migliore per Applicazioni OpenGL ES ... E poiché sul mercato non sono presenti tablet con ICS, non sarà possibile abbinare la configurazione menzionata dell'API Livello 14 e ICS.

Vorrei concludere accettando che c'è un bug che Google non ha ancora risolto/risolto sull'SDK.

Problemi correlati