Autore Topic: Rallentamento canvas su alcuni device  (Letto 1645 volte)

Offline kilop

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
Rallentamento canvas su alcuni device
« il: 04 Settembre 2012, 02:00:55 CEST »
0
Salve a tutti ragazzi,
sto sviluppando il mio primo gioco e sono insorto in un problema alquanto strano.
Utilizzo il Canvas e SurfaceView per la grafica e il lavoro svolto fin ora gira alla meraviglia su diversi dispositivi tra cui un galaxy ace 2 ma provando lo stesso gioco su un galaxy nexus (decisamente più performante) il framerate diminuisce e il tutto ovviamente diventa scattoso anche se il gioco continua a funzionare.

Ho pensato che il motivo potrebbe essere  che utilizzo come sfondo un'immagine caricata cosi:

Codice (Java): [Seleziona]
_bitmapCacheEffect.put(R.drawable.tavolo, Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.tavolo), _display.x, _display.y, true));
dove _display.x e .y contengono le dimensioni in pixel del display.. e il galaxy nexus che ha una densità di pixel maggiore è costretto a lavorare con immagini piu grosse..se è cosi come posso rimediare? Come posso disegnare uno sfondo a tutto schermo?

Grazie a tutti in anticipo.. :-)


     

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Rallentamento canvas su alcuni device
« Risposta #1 il: 04 Settembre 2012, 07:57:11 CEST »
0
Se rimuovi il ridisegno dello sfondo, gira bene anche sul Nexus?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline kilop

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
Re:Rallentamento canvas su alcuni device
« Risposta #2 il: 04 Settembre 2012, 10:33:03 CEST »
0
Si, se tolgo il disegno dello sfondo gira abbastanza bene..quasi perfettamente..

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:Rallentamento canvas su alcuni device
« Risposta #3 il: 04 Settembre 2012, 11:07:02 CEST »
0
Ma tu chiami la "Bitmap.createScaledBitmap" nel loop principale per ogni frame ? Se è così allora devi rivedere il codice, quella funzione richiede parecchi cicli di CPU e tanta memoria e queste richieste aumentano proporzionalmente all'aumentare della risoluzione della bitmap finale.
adb logcat | tee /tmp/logcat | grep TAG

Offline kilop

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
Re:Rallentamento canvas su alcuni device
« Risposta #4 il: 04 Settembre 2012, 11:12:35 CEST »
0
No no..la richiamo una volta nell init...in pratica creo questa bitmap a 768x1280 e nel loop di gioco semplicemente la disegno.. Forse il galaxy nexus (oppure mi correggo, jelly bean) non ha buone performance con i performance con i canvas?
Non mi va proprio di riscrivere tutto con OpenGL soprattutto se noto che con telefoni più scadenti gira a meraviglia!

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:Rallentamento canvas su alcuni device
« Risposta #5 il: 04 Settembre 2012, 12:38:40 CEST »
0
I canvans servono per la UI e non sono nati per fare video games. Se la CPU deve scrivere una bitmap di 768x1280 nella memoria video impiega parecchio tempo. Per andare veloci nei dispositivi equipaggiati con grossi display bisogna utilizzare la GPU, se il display è piccolo la sola CPU può farcela, deve gestire molti meno dati (ad esempio tra una risoluzione di 320x240 e una di 768x1280 c'è un fattore quasi 13 sui dati da elaborare).
adb logcat | tee /tmp/logcat | grep TAG

Offline kilop

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
Re:Rallentamento canvas su alcuni device
« Risposta #6 il: 04 Settembre 2012, 12:56:01 CEST »
0
Come immaginavo..allora dovrei riscrivere tutto in OpenGL ES?..ma i comandi drawxxx non utilizzano anche la GPU nelle ultime versioni di android?

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:Rallentamento canvas su alcuni device
« Risposta #7 il: 04 Settembre 2012, 16:10:26 CEST »
+1
Si è vero ma si sono concentrati soprattutto sulla resa delle pagine web col il nuovo Chrome.

Comunque incuriosito ho esaminato i sorgenti di Android appena sincronizzati col repository ufficiale, visto che è open source.

Nei Canvas della UI le OpenGL sono presenti nella classe "SurfaceTexture", in altre classi non c'è traccia:

Cross Reference: /frameworks/base/graphics/java/android/graphics/SurfaceTexture.java

praticamente converte il frame grafico in una texture da dare in pasto alle OpenGL-ES.

Nel disegnare una bitmap chiama la "Canvans.drawBitmap":

Cross Reference: /frameworks/base/graphics/java/android/graphics/Canvas.java

la quale chiama la funzione nativa "native_drawBitmap":

Cross Reference: /frameworks/base/core/jni/android/graphics/Canvas.cpp

viene chiama la funzione "drawBitmap__BitmapFFPaint" la quale controlla la densità della bitmap se combacia con quella del display, altrimenti esegue un resize. Qui si potrebbe perdere parecchio tempo se la bitmap è molto grossa.

Vengono poi chiamate una serie di funzioni di passaggio fino ad arrivare a quella più basso livello la "SkBlitter":

Cross Reference: /external/skia/src/core/SkBlitter.cpp

la scrittura è fatta dalla CPU usando un semplice puntatore in memoria con qualche ottimizzazione.

Dalla mia rapida indagine non ho visto ottimizzazioni con al GPU per il disegno di piccole bitmap (magari mi sono sfuggite, i sorgenti sono enormi), al massimo quando si ha una grossa bitmap e si vuole fare qualche animazione pesante  si trasferisce il tutto in una texture e si fa tutto con le OpenGL-ES.
adb logcat | tee /tmp/logcat | grep TAG

Offline kilop

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
Re:Rallentamento canvas su alcuni device
« Risposta #8 il: 04 Settembre 2012, 21:32:45 CEST »
0
Grazie infinite per gli aiuti!! Tuttavia a non capire come mai su alcuni device più scadenti gira a meraviglia! :| ..senza il più che minimo rallentamento..e solo su nexus (provato su due..) gira in maniera orribile! ho anche attivato l accelerazione Hw tramite :
Codice (Java): [Seleziona]
android:hardwareAccelerated="true"
qualcuno che ha fatto giochi con il canvas sa dirmi se su dispositivi con display grossi il problema si verifica?