2012-10-02 16 views
12

Sto realizzando un'app per fotocamera e questa app fornirà alcuni filtri agli utenti. Attualmente il mio codice è su NDK e funziona Ok, tuttavia voglio renderlo un po 'più veloce. Sembra GPU e opengl Es 2.0 è la strada da percorrere. La mia unica preoccupazione per la GPU è la limitazione della memoria. Dal momento che le moderne fotocamere prendono immagini a 5-10 MP mentre la limitazione della memoria GPU è molto inferiore. Mi stavo chiedendo se c'è un modo per ovviare a questa limitazione. L'unica opzione logica che mi sembra è dividere l'immagine in una parte più piccola, quindi elaborarli su GPU e infine assomigliarli all'immagine finale. La mia domanda è, se questo approccio sarebbe ancora buono per le prestazioni e c'è anche qualche altra opzione per l'elaborazione di immagini ad alta risoluzione su GPU mobili.Come gestire la limitazione della memoria della GPU per l'elaborazione di immagini ad alta risoluzione su GPU?

Modifica: Ho bisogno di chiarire che voglio utilizzare GPU per l'elaborazione delle immagini, quindi il mio obiettivo non è quello di visualizzare i risultati sullo schermo. Lo renderò a un'altra texture e salvarlo su disco.

+1

Dipende davvero da cosa si sta tentando di fare. Il vantaggio offerto dalle GPU è che sono altamente paralleli, ma non tutti i problemi possono essere semplificati semplicemente lanciando più core su di essi. – thecoshman

+0

Volevo ottenere una soluzione generale a un problema generale, ma attualmente sto cercando di codificare "laplacian pyramid" che è molto costosa quando viene eseguita sulla CPU. – dirhem

+0

beh, se si sta facendo qualcosa come applicare una tinta a un'immagine, in cui si desidera applicare la stessa operazione a tutti i bit, quindi il caricamento sulla GPU è una soluzione ovvia. attività come la sfocatura di un'immagine sono un po 'più complicate, dato che ogni nuovo valore dipende da un intervallo di pixel. Nel tuo caso però, devi considerare che ci sono molte differenze tra l'hardware, come la quantità di RAM che supportano, la consistenza della trama, la quantità di dati che puoi inviare a loro. Potrebbero non essere nemmeno in grado di eseguire l'elaborazione in stile OpenCL – thecoshman

risposta

2

La tua idea di piastrellatura è stata utilizzata dal Nintendo Entertainment System, che ha un Ricoh 2A03 a 1.79 MHz, quindi è un buon approccio. Google utilizza la piastrellatura per gestire le visualizzazioni delle mappe e persino i giochi come Crysis tendono a limitare le dimensioni delle texture della maggior parte delle loro trame a qualcosa come 1024x1024 (1 megapixel). E sì, 10 megapixel richiedono 30 mega di RAM, quindi alcuni dispositivi potrebbero avere problemi, soprattutto perché se si utilizza una fonte e una trama di destinazione, ciò significherebbe 60 mega di RAM sono necessari.

Basta ricordare che le dimensioni della trama tendono a utilizzare una potenza di 2 (2, 4, 8, 16, 32, 64, ecc.). A volte otterrai una qualità migliore, almeno se lo tagli e affili l'immagine.

2

Non è necessario applicare i filtri in tempo reale a immagini da 10 mp ... perché non ci sono tali schermi (o forse ci sono ma non sono più utilizzati tra di noi). :)

Quindi è necessario applicare i filtri sui pixel che vengono visualizzati (1900x1280?). La tecnica di piastrellatura che hai citato sarà ancora utile in alcuni scenari. Il rendering differito è un esempio. X-Box 360 utilizzava entrambe le tecniche (piastrellatura con differimento) su base giornaliera. Senza la piastrellatura non sarebbe possibile a causa degli elevati requisiti di memoria per la tecnica differita.

+0

Ho modificato la domanda per chiarire che non userò gpu per visualizzare le immagini sullo schermo. Non ho niente a che fare con lo schermo e la sua risoluzione. L'elaborazione delle immagini verrà eseguita in background e lo schermo mostrerà solo una barra di avanzamento. Quindi la limitazione della memoria della GPU è ancora lì per me. – dirhem

Problemi correlati