2009-08-17 8 views
25

Ho cercato di eseguire alcune ottimizzazioni delle prestazioni di OpenGL ES nel tentativo di aumentare il numero di triangoli al secondo che sono in grado di eseguire il rendering nella mia applicazione iPhone, ma ho colpito un muro di mattoni. Ho provato a convertire i miei tipi di dati OpenGL ES da fisso a virgola mobile (per Apple's recommendation), intercalando i miei oggetti buffer vertici e riducendo al minimo le modifiche in stato di disegno, ma nessuna di queste modifiche ha fatto la differenza nella velocità di rendering. Non importa cosa, non riesco a spingere la mia applicazione oltre 320.000 triangoli/s su un iPhone 3G con sistema operativo 3.0. Secondo this benchmark, dovrei riuscire a colpire 687.000 triangoli/s su questo hardware con l'ombreggiatura uniforme che sto usando.Che cosa significa la statistica di Tiler Utilization nello strumento iPhone OpenGL ES?

Nei miei test, quando eseguo lo strumento di performance OpenGL ES in Strumenti contro il dispositivo in esecuzione, vedo la statistica "Utilizzo del piastrellista" che raggiunge quasi il 100% quando si esegue il rendering del mio benchmark, tuttavia "Utilità di rendering" è solo arrivare a circa il 30%. Questo potrebbe fornire un indizio su quale sia il collo di bottiglia nel processo di visualizzazione, ma non so cosa significano questi valori e non ho trovato alcuna documentazione su di essi. Qualcuno ha una buona descrizione di cosa significano questa e le altre statistiche nello strumento per iPhone OpenGL ES? So che PowerVR MBX Lite nell'iPhone 3G è un tile-based deferred renderer, ma non sono sicuro di quale sarebbe la differenza tra Renderer e Tiler in quell'architettura.

Se aiuta in qualche modo, il codice sorgente (con licenza BSD) a questa applicazione is available se si desidera scaricarlo e testarlo da soli. Nella configurazione corrente, avvia un piccolo benchmark ogni volta che carichi una nuova struttura molecolare e genera i triangoli/s sulla console.

+0

Quanto sono grandi i triangoli? Penso che una di queste statistiche sia più su # di pixel, e l'altra su # di triangoli. i numeri di utilizzo relativi cambiano se si riduce lo zoom in modo che lo schermo sia meno pieno? –

+1

Varia, a seconda del modello che carico, ma tende ad essere piuttosto piccolo. Non importa il livello di zoom sul modello, i numeri sembrano rimanere gli stessi. Inoltre, ho provato a ridurre le dimensioni della vista OpenGL a metà di ciò che è ora, senza alcun effetto, il che sembrava escludere una limitazione della velocità di riempimento. –

risposta

25

Le percentuali di utilizzo di Tiler Utilization e Renderer misurano rispettivamente il ciclo di lavoro dell'hardware di elaborazione dei vertici e dei frammenti. Sull'MBX, l'utilizzo del piastrellista generalmente scala con la quantità di dati del vertice inviati alla GPU (in termini sia del numero di vertici sia della dimensione degli attributi inviati per ogni vertice) e l'utilizzo del frammento generalmente aumenta con il prelievo e il campionamento della trama .

Nel tuo caso, la cosa migliore sarebbe ridurre la dimensione di ogni vertice che stai inviando. Per cominciare, proverei a mettere insieme i tuoi atomi e legami per colore, e inviando ognuno di questi contenitori usando un colore costante invece di un array. Suggerirei anche di indagare se i pantaloncini sono adatti per le tue posizioni e le normali, dato il ridimensionamento appropriato. In questo caso, potrebbe anche essere necessario bin in posizione, se gli shorts ridimensionati per fornire una precisione sufficiente non coprono l'intervallo necessario. Questo tipo di tecniche potrebbe richiedere ulteriori richiami di disegno, ma sospetto che il miglioramento della velocità effettiva dei vertici supererà il sovraccarico della CPU per le chiamate extra per-draw.

Si noti che è generalmente vantaggioso (su MBX e altrove) assicurare che ogni attributo vertice inizi su un limite a 32 bit, il che implica che si dovrebbero compensare le posizioni e le normali su 4 componenti se si passa a corti. Le peculiarità della piattaforma MBX rendono anche tale che si desidera includere effettivamente la componente W della posizione nella chiamata a glVertexPointer in questo caso.

Si potrebbe anche prendere in considerazione perseguendo metodi di illuminazione alternativi come DOT3 per i dati poligonali, in particolare le sfere, ma questo richiede particolare attenzione per assicurarsi che non si stanno facendo i tuoi rendering frammento-legato, o inviando inavvertitamente più dati di vertice di prima.

+2

Questo è coerente con la mia esperienza da quando ho fatto la prima domanda. Ho ridotto i miei vertici e i dati normali ai corti, espandendoli con il componente aggiuntivo per raggiungere il limite a 32 bit e aumentando le prestazioni di rendering del 30%. L'abbattimento dei backfaces e il tweaking del test di profondità hanno aggiunto un ulteriore 10%. Daremo un'occhiata al color-binning per vedere quale effetto ha. Grazie per la risposta dettagliata. –

+1

Ho una domanda stupida ..... cosa significa il verbo "bin" come usato nella risposta di Pivot qui? –

+3

@Andrew Garrison: in questo caso, significa raggruppare elementi di un certo tipo. Quando dice "binning your atoms and bonds by color", ciò che intende è che dovrei raggruppare i vertici per gli oggetti che condividono tutti lo stesso colore, quindi inviare solo quegli elementi una volta per quel colore. Questo evita di dover specificare un colore per ogni vertice, riducendo la dimensione della geometria inviata. –

4

Ottima risposta, @Pivot! Per riferimento, this Apple doc definisce questi termini:

  • Renderizzatore Utilizzazione%. La percentuale di tempo trascorso dalla GPU per eseguire l'elaborazione dei frammenti.
  • Utilizzo piastrellista%. La percentuale di tempo trascorso dalla GPU nell'eseguire l'elaborazione e la piastrellatura dei vertici.
  • Utilizzo dispositivo%. La percentuale di tempo trascorso dalla GPU per eseguire lavori di affiancamento o rendering.
Problemi correlati