2013-09-21 8 views
5

sto provando SpriteKit con la seguente configurazione:Come applicare SKEffectNode a schermo intero per il post-processing in SpriteKit

  1. Uno SKScene con due nodi figli utilizzati solo per il raggruppamento altri nodi: primo piano e sfondo .
  2. sfondo è veramente vuoto fin d'ora, ma sarebbe poi tenere alcune tipo di sfondo sprite/strati.
  3. foreground è un valore SKEffectNode e ogni volta che l'utente tocca lo schermo , viene aggiunta come elemento secondario una nuova sottoclasse di una sottoclasse SKnode che rappresenta un elemento di gioco .
  4. Questo SKNode sottoclasse crea fondamentalmente 3 SKShapeNodes e due etichette: una circonferenza outter , una circonferenza interna, 2 etichette e una circonferenza interna trimestre. La circonferenza interna trimestre ha uno SKAction che fa ruotare sempre sulla sua origine/centro.

Ora questo è il problema, a patto che il primo piano non ha CIFilter o ha shouldEnableEffects = NO, tutto va bene. Cioè, posso toccare lo schermo e i miei elementi di gioco sono istanziati e aggiunti alla scena principale. Ma minuto cerco di aggiungere un CIGaussianBlur o CIBloom in primo piano, ho notato due cose:

  1. Il framerate scende a circa 2 fps. Intendiamoci, questo accade anche con nella trama con appena 6 nodi.
  2. L'effetto sembra essere costantemente ritaglio suo contenuto o regolando è telaio. Cioè, se ho un nodo, l'effetto "a schermo intero" sembra cercare di ritagliare o regolare costantemente i suoi limiti sull'area minima richiesta per contenere tutti i nodi. Questo è per un nodo:

    enter image description here

E questo è per 2 nodi:

enter image description here

In OpenGL ES 2, si potrebbe fare un post sfocatura/Bloom di fondo di rendering tutto framebuffer (tutti gli oggetti) per tessitura, poi facendo almeno un altro passaggio sfocatura, ecc su quella texture e quindi sia presente che nel framebuffer allegata al display o comporre che con l'originale rendering indietro al framebuffer. Mi aspetto che SKEffectNode funzioni in modo simile. Tuttavia il ritaglio e le scarse prestazioni mi fanno pensare che potrei usare il nodo dell'effetto nel modo sbagliato. qualche idea?

risposta

2

Sembra che ci sia un bug con SKEffectNode che tenta di applicare un filtro sui figli SKShapeNodes per quanto posso dire. Ho suonato in giro con questo e raggiunto i risultati, ma quando sono passato i SKShapeNodes per SKSpriteNodes (utilizzando un semplice png di un cerchio) il ritaglio non appare più. È un bug in quanto SKEffectNode non gestisce molto bene il tratto di SKShapeNode. Se togli il tratto (lineWidth = 0) e gli dai un colore di riempimento, vedrai che non ci sono ritagli.

Per quanto riguarda il frame rate, i SKShapeNode funzionano male. Facendo il passaggio a SKSpriteNodes che ho menzionato in precedenza ho incrementato il mio fps da 40 a 50 quando avevo 35 nodi sullo schermo (iPhone 5) con il filtro applicato.

+1

Ora che ci penso, potrebbe esserci una soluzione: lo SKView è supportato da un CAEAGLLayer e ha anche una proprietà a -textureFromNode che restituisce un SKTexture. Se ho impostato il mio shader GL per la sfocatura/fioritura, potrei afferrare ogni fotogramma (tramite la proprietà o forse anche toccando il livello stesso con il mio contesto OpenGL), post-elaborarlo e presentarlo nel livello di SKView o un nuovo CAEAGLLayer. – SaldaVonSchwartz

+1

Puoi commentare se questo lavoro ha funzionato? Sto cercando di capire se puoi fare i tuoi effetti di post processing usando Sprite Kit? – Oscar

Problemi correlati