2015-11-09 15 views
9

Quindi, sto usando SceneKit per eseguire il rendering di una raccolta di superfici parametriche (la cui somma crea un oggetto). Per metterle sullo schermo, creo geometrie personalizzate campionando i punti e creando triangoli. Ecco una rapida panoramica di come lo faccio.Accelerazione del rendering in SceneKit

Loop through the collection of surfaces 
    Generate a random color C 
    For each surface calculate a grid of N x N points (both positions and normals) 
    Assign all vertexes for that surface the color C 
    Add groups of 3 vertexes from this surface to the face index list 

E sembra funzionare. Dopo ho tutti questi dati, mi rendono nelle strutture adeguate (SCNGeometrySource e SCNGeometryElement) e fare uno SCNGeometry in questo modo

SCNGeometry(sources: [vertexSource, normalSource, colorSource], elements: [element]) 

Questo funziona e visualizza le superfici sullo schermo bene come un unico elemento geometrico. Il mio problema è che ho degli oggetti davvero complicati con cui sto provando a lavorare e che sta girando molto lentamente per spostare la cinepresa quando si guarda l'oggetto. Il rendering richiede circa 500 ms. Il che rende la mia frame rate e esperienza terribile.

Quindi la domanda è: quali passi posso prendere per accelerare le prestazioni di SceneKit? Ho fatto questo stesso progetto con WebGL usando Three.js con la stessa quantità di dati ed è stato in grado di utilizzare una telecamera orbitante bene, quindi non posso credere che il kit di scena non potrebbe almeno competere con quello. Quali funzioni posso modificare e disattivare per aumentare le prestazioni? Sto usando il tipo di triangolo primitivo, allowCameraControl = true per la telecamera orbitante e metal per SCNView. Per gli curiosi, il modello su cui sto lavorando genera 231.900 vertici e 347.850 indici per le facce (11.1312 MB di dati sui vertici (posizione e normale) e 1.3914 MB di dati sulle facce (essenzialmente solo posizioni degli indici dei vertici in ordine per i triangoli). .))

+0

Su iPad 3 o precedenti, questo si avvicina ai limiti dei vertici. Aggiungete a questo il tasso di riempimento molto alto che state usando e probabilmente avrete difficoltà a raggiungere i 60fps, ma non dovreste essere lontani. 500 ms è davvero anormale. – Confused

+1

I miei vecchi 4 erano abituati a gestire quei tipi di numeri a 20 fps circa. Il tuo pseudo codice sembra buono, è così che generi la mia geometria. In varie occasioni, gli indici venivano incasinati e il risultato era un pasticcio sfaccettato sullo schermo. Questo colpirebbe davvero il framerate, l'ho messo nello shader dei frammenti, dovendo fare molto più lavoro. Dovrei controllare la mesh, magari renderla semi trasparente e attivare wireframe 'svnView.debugOptions = .ShowWireframe'. – lock

+0

Come cambio manualmente il tasso di riempimento? – Red

risposta

3

1) Se si è "in piedi" al centro della superficie generata, allora il problema potrebbe essere che si disegna fuori dallo schermo (senza frustum) e si deve dividere la propria sufrface (nodo singolo) in sottosuperfici (nodi figlio), quindi vengono disegnati solo i nodi visibili nello spazio di visualizzazione della telecamera.

Detto questo, 231.900 vertici non è davvero molto, io disegno diversi milioni a 60 fps con il renderer di SceneKit Metal (+ 20% più veloce rispetto all'utilizzo del renderer OpenGL) su OSX.

2) Se si stanno osservando le superfici a distanza e si verificano cattive prestazioni, controllare quale quantità di bytesPerComponent: si alimenta durante la creazione di SCNGeometrySource. Ho sperimentato un calo notevole delle prestazioni quando si utilizza CGFloat (doppio) invece del semplice float su GeForce GTX (mentre è ok su grafica Intel integrata).