2012-04-12 16 views
8

Sto sviluppando un gioco iP * e utilizzo sia UIKit che OpenGL ES 2.0. Gli elementi UIKit sono renderizzati sulla vista OpenGL e occupano una quantità significativa (arbitraria) di spazio sullo schermo. Devo ammettere che Apple ha fatto un lavoro eccellente e il frame rate del gioco è sempre di 60 FPS.Combinazione di blocchi di animazione UIView e rendering OpenGL ES

Per giungere a questa conclusione ho fatto molte prove per quanto riguarda le prestazioni:

  1. ho aggiunto un sacco di statica (non in movimento) UIViews oltre la vista OpenGL - OK!
  2. Ho animato utilizzando codice personalizzato le stesse UView (modifica la proprietà del centro nel metodo drawFrame del mio gioco) - OK !.
  3. Ho aggiunto molti elementi OpenGL ES sotto Uiviews - OK!
  4. Ho aggiunto molti elementi OpenGL ES in movimento sotto Uiviews - OK!

Quindi, ora voglio utilizzare il Core Animation Framework per animare gli elementi UIKit. Io uso

[UIView animateWithDuration:delay:options:animations:completion:] 

in oder per eseguire le animazioni (Io target iOS 4 o più recente).

Il problema ora è che il frame rate ha questo comportamento strano: a volte ho 60 fps con molti molti elementi UIKit animazione (30 elementi è OK per me) e altre volte il frame rate è ovviamente sotto 60 fps anche con un singolo animando l'elemento UIKit ma non riesco a misurarlo con gli strumenti! Lasciatemi spiegare di più: Quando apro gli strumenti e controllo l'animazione di base e/o il driver OpenGL ottengo sempre 60 fps. Ma è ovvio che questo non è il caso, posso vedere con i miei occhi le animazioni OpenGL per muoversi molto più lentamente delle corrispondenti animazioni UIKit in alto. Se rimuovo gli elementi UIKit dalla vista, il frame rate ritorna normale. Una situazione simile a quella che descrivo qui accade in qualsiasi gioco OpenGL ES quando l'utente cambia il volume del dispositivo mentre gioca. Quando la vista trasparente che mostra il volume corrente inizia a dissolversi e fino a quando non svanisce completamente, la frequenza fotogrammi cala drasticamente, ma negli strumenti (ho fatto anche questo test) è bloccata su 60 fps!

Quindi, per riassumere: a volte ottengo veri 60 fps con animazioni a blocchi senza alti e bassi per una corsa e altre volte ottengo 60 fps falsi senza alti e bassi.

Avete qualche soluzione a questo? Tutti i test sono stati eseguiti su un iPad 2 e iPhone 3GS con iOS 5.1

risposta

9

sono riuscito a risolvere il problema e ora posso combinare animazioni basate UIView blocco/fondamentali nel mio gioco OpenGL senza alcun calo di prestazioni.

La soluzione è abbastanza semplice:

  1. Per ogni UIView che volete nella vostra OpenGL applicazione, mantenere il suo limite, il centro e trasformare immobili a schermo OpenGL sistema di coordinate (ad esempio, creare le seguenti proprietà: GLBounds, GLCenter, GLTranform) e aggiornarli di conseguenza ogni volta che si modifica una delle proprietà UIView corrispondenti.
  2. Quando si avvia il gioco, caricare le UIViews ma impostarle su nascosto.Quindi, UIKit non disegna sulla parte superiore della vista OpenGL (in questo modo il problema del frame drop è completamente elliminato). Invece, disegnare le UIViews utilizzando le proprietà GL * create nel passaggio 1 e utilizzando le trame corrispondenti (le immagini/colori che hai usato per ogni UIView).
  3. Animare il nascosto Proprietà di UIViews (limiti, centro e trasformazione) utilizzando l'animazione di blocco/core in base all'animazione che si desidera ottenere (che a sua volta aggiorna le proprietà GL *) e nel metodo di disegno OpenGL utilizza il GL * proprietà per disegnare le UIViews! Per ottenere i valori effettivi di limiti, centro e trasformazione quando un UIView sta animando (e aggiorna le proprietà GL *) usa la sua proprietà presentationLayer.

Best,