Nella mia vista sto disegnando un percorso piuttosto grande e sto riscontrando alcuni problemi di prestazioni. Il percorso è attualmente lungo 32.000 punti, ma la mia applicazione dovrebbe raggiungere almeno i 128.000 punti. Non posso davvero fare nulla per la dimensione del percorso, poiché i set di dati sono così grandi e ho bisogno di essere in grado di visualizzare l'intero percorso in una sola volta e consentire lo zoom.Percorsi di disegno e accelerazione hardware
Sto usando un Nexus 10 con Android 4.2, che ha l'accelerazione hardware abilitata di default per le applicazioni che non la disabilitano esplicitamente.
Il percorso viene creato con il seguente codice (ho omesso alcune operazioni di configurazione e altre parti irrilevanti):
dataPath.moveTo(0, offset - (float) data[leftLimit]/ scalingFactor);
for (int i = leftLimit; i < rightLimit; ++i) {
x = (i - leftLimit) * dx;
y = offset - (float) data[i]/ scalingFactor;
dataPath.lineTo(x, y);
}
E poi elaborato nel metodo onDraw()
:
canvas.drawColor(Color.WHITE);
canvas.drawPath(dataPath, linePaint);
ho misurato il tempo per disegnare la mia vista utilizzando adb shell dumpsys gfxinfo
con e senza accelerazione hardware e con mia sorpresa l'accelerazione hardware è molto più lenta:
Con accelerazione hardware:
Senza accelerazione hardware: versione
L'hardware accelerata richiede circa 200-300 ms per frame, più passate in fase di processo. La versione non accelerata richiede circa 50 ms, con 2/3 nella fase di disegno e 1/3 nella fase di elaborazione.
Ovviamente anche la mia versione più veloce senza accelerazione hardware è ancora troppo lenta per raggiungere i 60 fps, o per essere anche appena utilizzabile quando passo a set di dati più grandi.
L'idea di rendere il percorso di una bitmap e quindi solo trasformare quella bitmap per adattarla allo schermo è anche problematica nel mio caso. Devo supportare lo zoom molto lontano sul percorso e, per abilitare lo zoom avanti senza che la qualità del percorso peggiori, dovrei eseguire il rendering di bitmap di grandi dimensioni del percorso (e probabilmente correrò nei limiti di memoria e nei limiti delle dimensioni della trama). E quando si esegue lo zoom in lontananza, dovrei creare immagini più nuove solo di parti del percorso o passare semplicemente al rendering del percorso direttamente, il che probabilmente porterebbe a ritardi maggiori del framerate se la performance è ancora simile a ciò che ho ragione adesso.
Quello che mi chiedo ora è
- sta disegnando linee/percorsi solo qualcosa la GPU è affatto male e che non si dovrebbe cercare di hardware accelerare, o sono io probabilmente fare qualcosa di sbagliato che causa il cattivo prestazione?
- C'è qualcosa che posso fare per tracciare percorsi così grandi con prestazioni accettabili?
In che modo OpenGL si adatta perfettamente a questo? –
L'accelerazione hardware utilizza OpenGL, per quanto ho capito. Ma non ero sicuro di quale tag usare lì. –
Come stai disegnando questo? Se tracciate 1 punto alla volta per la GPU, probabilmente otterrete prestazioni peggiori, ma se lo fate a pezzi su tutti dovreste vedere un aumento, almeno in teoria. – Automatico