2012-03-30 16 views
5

Realizzo un'applicazione iphone 3D che utilizza molti tabelloni. Il mio frame buffer è due volte più grande sullo schermo retina perché voglio aumentare la loro qualità su iPhone 4. Il problema è che gli shader di frammenti consumano molto più tempo a causa della dimensione del framebuffer. C'è un modo per gestire la retina e le trame ad alta definizione senza aumentare la precisione dello shader?Ottimizzazione dello shader per schermo retina su iOS

risposta

9

Se si esegue il rendering con un framebuffer alla massima risoluzione del display Retina, avrà un numero di pixel quattro volte superiore rispetto a una stessa area fisica di un display non Retina. Se la velocità di riempimento è limitata a causa della complessità degli ombreggiatori, questo renderà ogni fotogramma molto più lungo.

Prima di tutto, è necessario verificare che si sia effettivamente limitati dalla parte di elaborazione dei frammenti della pipeline di rendering. Esegui lo strumento OpenGL ES Driver sulla tua applicazione e guarda le statistiche di utilizzo di Tiler e Renderer. Se l'utilizzo del Renderer è vicino al 100%, ciò indica che sei limitato dai tuoi shader di frammenti e dalla tua capacità complessiva di spingere i pixel. Tuttavia, se vedi la percentuale di utilizzo del piastrellista lassù, significa che la geometria è limitata e le modifiche nella risoluzione dello schermo non influiscono sulle prestazioni tanto quanto la complessità e la dimensione dei dati dei vertici.

Supponendo di essere limitato dai frammenti di ombreggiatura, ci sono alcune cose che puoi fare per migliorare in modo significativo le prestazioni delle GPU iOS.

Nel tuo caso, sembra che le dimensioni della trama potrebbero essere un problema. La prima cosa che farei è usare le trame PowerVR Texture Compressed (PVRTC) invece delle sorgenti bitmap standard. Le trame PVRTC sono memorizzate in un formato compresso in memoria e possono essere molto più piccole delle bitmap equivalenti. Ciò potrebbe consentire un accesso molto più rapido aumentando gli hit della cache sulle letture delle texture.

Rendi le tue trame di una potenza di due dimensioni e attiva mipmap. Ho visto le mipmap davvero utili per trame più grandi che spesso si restringono per apparire su oggetti più piccoli. Questo sicuramente sembra il caso della tua applicazione che potrebbe aver bisogno di supportare i dispositivi Retina e non Retina.

Evita letture dipendenti della trama nei tuoi ombreggiatori di frammenti come la peste. Tutto ciò che esegue un calcolo per determinare una coordinata della trama, o qualsiasi lettura di texture che rientra in un'istruzione di ramificazione, attiva una lettura della trama dipendente che può essere più di un ordine di grandezza più lento da eseguire sulle GPU iOS. Durante le normali letture delle texture, le GPU PowerVR possono fare una piccola lettura prima dei valori della trama, ma se si utilizza causa la lettura di una trama dipendente si può perdere quell'ottimizzazione.

Potrei andare avanti su varie ottimizzazioni (usando lowp o mediump precision invece di highp dove appropriato, ecc.), Ho had a little help in this area myself, ma queste sembrano le prime cose su cui mi concentrerei. Infine, puoi anche provare a eseguire gli shader tramite PowerVR's profiling editor che può fornire stime del tempo di ciclo per le prestazioni migliori e peggiori di questi shader.

I dispositivi di visualizzazione Retina non sono nemmeno i peggiori trasgressori quando si tratta di limiti di framment shader. Prova a ottenere un rendering di rendering a schermo intero dell'iPad 1, perché ha più pixel rispetto all'iPhone 4/4S, ma una GPU molto più lenta rispetto all'iPad 2/3 o iPhone 4S. Se riesci a far funzionare qualcosa sull'iPad 1, andrà bene su tutto il resto (anche sul Retina iPad).

+0

Grazie per tutte queste precisioni. L'utilizzo del renderer è di circa il 99% e il piastrellista di circa il 5%. Penso che il mipmapping non migliorerà le prestazioni perché la maggior parte dei miei tabelloni pubblicitari sono visualizzati come sprite 2D (le trame non sono ridimensionate). Proverò l'editor di profili di PowerVR e testerò la mia app su un iPad 1. – Klem

+0

Grazie Brad. Negli ultimi 6 mesi ho codificato shader come un matto e quando ho imparato a modificare le coordinate della texture è stato come accendere una luce nel mio cervello. Ma ultimamente mi sono chiesto se fosse meglio leggere da due trame diverse o affiancare la base e le mappe normali in un'unica trama. Che è più veloce Le migliori pratiche di Apple per la guida degli shader implicano che se la modifica al texcoord viene eseguita nel vertex shader non è una lettura dipendente dalla trama. Vado a provarlo per vedere se il rendering di iphone4 accelera. E magari provare anche diverse mappe. – badweasel

Problemi correlati