2013-01-17 9 views
5

mentre eseguo alcuni test per un piccolo progetto per iPhone/iPad su cui sto lavorando, ho osservato che c'è una grande penalizzazione delle prestazioni della CPU nel disegnare wireframe usando glDrawElements con GL_LINES .glDrawElements con GL_LINES forza gleRunVertexSubmitARM? (o: perché il disegno di wireframe è lento su iOS?)

È lo scenario:

  • un modello con 640 vertici (4 galleggianti per posizione, 3 carri per normali, senza problemi di allineamento ... tutti su 4 byte frontiere)
  • 3840 indici (unsigned short)
  • sia vertici e indici usano VBOs (senza VAO)
  • modello sopra disegnata con glDrawElements con GL_TRIANGLES funziona bene

Poi:

  • stesso modello con 640 vertici
  • 2560 indicizza
  • VBOs e non VAO
  • disegnato con glDrawElements con GL_LINES innesca continue chiamate a gleRunVertexSubmitARM, l'utilizzo della CPU cielo razzi ...

In entrambi i casi i modelli guardano come previsto e senza glErrors intorno ...

Sembra che il problema dipenda dal dispositivo. Lo trovo su un iPhone 3GS e iPhone 4, NON su un iPad 2 né sui simulatori. Su una CPU frame-time iPad 2 = 1ms e nessuna chiamata a gleRunVertexSubmitARM, su una CPU frame-time iPhone 4 = 12ms e chiamate continue a gleRunVertexSubmitARM.

Qualcuno può spiegare questo comportamento o indicare quali errori potrei fare?

Qualsiasi intuizione è molto apprezzata. Grazie in anticipo,

Francesco

risposta

0
non

una facile risposta ad una domanda non facile, direi.

In ogni caso, il motivo per cui 2 dispositivi della stessa "famiglia" si comportano in modi diversi potrebbe dipendere da molti fattori.

Prima di tutto, essi montare differenti GPU (sono molto sicuro che sai già così, mi dispiace per affermare l'ovvio) che porta le seguenti differenze:

  • Iphone 4 e Iphone 3GS montare la stessa GPU , il PowerVR SGX535
  • IPAD 2 utilizza la SGX543MP2 PowerVR

Innanzitutto, quest'ultimo è un'evoluzione del primo con una portata molto diversa e nuova architettura.

Questo da solo non in ogni caso spiegare tutto, il motivo per cui si nota molto di più chiamate a gleRunVertexSubmitARM potrebbe essere spiegato con l'attuazione driver OpenGL eseguite da PowerVR sulle sue GPU, molto probabilmente il driver SGX535 GPU esegue le operazioni che richiedono più di un agganciare a quella funzione.

Ultimo, ma non meno importante, le prestazioni saggio, disegno con GL_LINES è il più delle volte molto inefficiente per diverse ragioni:

  • Non esegue alcun rilevamento geometria nascosta
  • non esegue qualsiasi faccia abbattimento
  • Leggendo intorno (e sulla mia esperienza personale di 2-3 anni fa), utilizzando GL_LINE_WIDTH o GL_LINE_SMOOTH, il driver esegue un rendering "software" che non utilizza alcuna accelerazione HW. Questo dipende dalla GPU e dalla sua implementazione del driver OpenGL
  • Quando viene eseguito il rendering di un poligono pieno, il driver può ottimizzare le operazioni con "Hierarchical Depth Buffer", con GL_LINES non può (di nuovo, dipende molto dal driver ma questo è un aspetto molto comune)
  • Alcuni driver traducono la tua GL_LINES mesh in triangoli al momento del rendering. Questo è qualcosa che non posso dimostrare, ma un argomento molto comune con gli amici sviluppatori di motori di gioco del passato.

Spero di averti aiutato in qualche modo.

Ciao Maurizio

0

Sono su PC, ma sento che questo è rilevante. Ho notato il frame rate in modalità wireframe: glPolygonMode (GL_FRONT_AND_BACK, GL_LINE) ...

era 10 volte più lento se glEnable (GL_LINE_SMOOTH);

È possibile disabilitarlo con questo comando: glDisable (GL_LINE_SMOOTH);

Problemi correlati