Autore Topic: Perdita del context OpenGL  (Letto 993 volte)

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Perdita del context OpenGL
« il: 28 Febbraio 2013, 14:34:04 CET »
0
Come comportarmi quando il sistema si perde il context OpenGL?
Finora ricaricavo tutto senza problemi ma ora sto lavorando ad un piccolo framework e vorrei che il tutto fosse trasparente.

In pratica il problema è che quando l'utente torna al menu o clicca il tasto power al rientro nell'app viene ricreata la surface ma viene ricreato anche il contesto.
Questo significa che per esempio perdo tutte le textures.

Ovviamente non posso, per questioni di heap, tenermi gli originali.

Ho guardato in giro e mi sembra che la soluzione ricada in due categorie principali:
- libgdx ricarica
- andengine ha una versione modificata della glsurfaceview che preserva il contesto ma la compatibilità di questa soluzione è tutta da verificare

Avete mai avuto problemi del genere? Che strategia avete adottato?

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Perdita del context OpenGL
« Risposta #1 il: 28 Febbraio 2013, 17:46:39 CET »
0
Il tuo problema è salvare il context GL quando l'applicativo va in pausa.

La GLSurfaceView ha i metodi onPause e onResume da chiamare quando l'applicativo va in pausa o ritorna dalla pausa, questo permette di fermare o di far ripartire il thread delle OpenGL-ES in modo corretto ma non viene salvato e ripristinato il context GL di default.

Dalla versione API 11 è stato introdotto il salvataggio delle context GL, deve essere impostato con  setPreserveEGLContextOnPause ma bisogna tener conto che solo un numero limitato di context GL possono essere salvati (dipende dall'implementazione dei driver OpenGL-ES).

Se serve una compatibilità con le versioni precedenti delle API 11 bisogna salvare lo stato di tutto quello creato nella scena OpenGL-ES (posizioni X,Y,Z, rotazioni, texture applicate, ecc..) quando l'applicativo va in pausa e ripristinarlo al ritorno. 
adb logcat | tee /tmp/logcat | grep TAG

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Perdita del context OpenGL
« Risposta #2 il: 28 Febbraio 2013, 18:07:36 CET »
0
Compatibilità 11 purtroppo non è una opzione.  :-(

Andengine fa quello che fa setpreserveEGLetcetcetc con una glsurfaceview custom ma come hai detto già il setpreserve dipende dal driver, figuriamoci una gestione custom.

Non è un grosso problema salvarmi lo stato di quanto ho creato ma è palese che se fai qualcosa di non banale ricaricare tutto impiega tempo.

Forse con codice nativo riesco a risolvere qualcosa, che dici?

EDIT: intendo dire che se mi carico per dire delle bitmap da codice nativo mi vado a superare il limite sull'heap quindi potrei evitare di rifare il doppio passaggio carica bitmap->crea la texture.

Cioè qualunque gioco che ha tante texture in qualche modo deve risolvere questo problema velocemente, non credo che ricarichino tutto dalla memoria di storage, qualunque essa sia.
« Ultima modifica: 28 Febbraio 2013, 18:09:25 CET da undead »

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Perdita del context OpenGL
« Risposta #3 il: 01 Marzo 2013, 09:35:11 CET »
0
In Java per aver un heap maggiore nelle proprie app è possibile impostare l'opzione android:largeHeap="true" nel AndroidManifest.xml.

La memoria allocata dai programmi nativi (NDK) non sottrae quota di memoria al heap usato dalla Dalvik, il limite è la massima memoria disponibile nel dispositivo al momento della richiesta.

Dalle API 8 è possibile usare nelle OpenGL-ES texture compresse con l'algoritmo ECT1, esistono altri algoritmi di compressioni ma sono proprietari dei vari fabbricanti di GPU.
adb logcat | tee /tmp/logcat | grep TAG

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Perdita del context OpenGL
« Risposta #4 il: 01 Marzo 2013, 13:56:37 CET »
0
La memoria allocata dai programmi nativi (NDK) non sottrae quota di memoria al heap usato dalla Dalvik, il limite è la massima memoria disponibile nel dispositivo al momento della richiesta.
Esattamente quello che pensavo, cioè caricare le bitmap con codice nativo e tenerle lì per evitare di ricaricare il tutto.