2015-09-28 14 views
9

Sto vedendo frequenze fotogrammi molto incoerenti nel progetto iniziale di SceneKit. A volte funziona costantemente a 60 fps (rendering 12ms, 6ms metal flush), ea volte funziona costantemente a 40 fps (20ms rendering, 6ms metal flush), né più né meno.Framerate Scene incoerente

Le variazioni di telaio casualmente quando riapro l'applicazione, e rimarranno a tale frame rate fino alla successiva riapertura. Ho provato a passare a OpenGL ES, e mentre sembra sistemarlo nel progetto iniziale, vedo ancora quelle gocce nella mia vera app.

Il progetto di avviamento è non modificato (nave rotazione), e sto testando su Xcode 7.0 e Mini iPad 4 con iOS 9.0.1. Non sono sicuro di cosa stia causando il problema, SceneKit, iOS o il mio dispositivo.

Modifica: Ecco una traccia di sistema di metallo, la prima parte era in esecuzione a 60 fps, la seconda parte premo il pulsante Home e riapre l'app, e funziona a 40 fps. Sembra che ci siano molti carichi di colore/negozi nella seconda parte.

enter image description here

+0

Il tuo dispositivo è destinato solo agli iPhone e lo hai appena testato su un iPad? Poiché ho lavorato a un gioco indirizzato esclusivamente a iPhone, e quando l'ho provato sull'iPad, ho ricevuto anche i 40 fps. Tuttavia, una volta cambiato l'obiettivo del dispositivo su universale, l'iPad è rimasto costantemente a 60 fps. – Jarron

+0

@Jarron era in realtà un progetto solo per iPad. Sfogliando i forum Apple, questo sembra essere un bug noto. – Xzya

+0

@Xzya Hai un link alla discussione non i forum Apple? Vedo che i frame rate partono da 60fps e poi lentamente scendono fino ai 50 bassi. –

risposta

4

Purtroppo sembra che SceneKit (e SpriteKit) sono in fasi evolutive di sviluppo, a scapito di coloro che li utilizzano.

Questo problema è sicuramente su tutti i dispositivi e le seguenti quadri, che io sappia:

  • SceneKit
  • SpriteKit
  • metallo

Anche usando OpenGL, invece di metallo in i framework del gioco il problema esiste ancora, con non meno coerenza.

E sembra essere un tentativo da iOS di fissare il frame rate a 40fps se iOS determina c'è un problema mantenendo un 60fps costanti.

Penso che la causa del calo a 40 fps sia che iOS non sia molto bravo nell'interpretare i "problemi" e che esegua il campionamento delle prestazioni in un periodo troppo breve in un punto instabile nel lancio dell'app, dati molti falsi positivi per problemi che non ci sono quando iOS stesso si è sistemato e ha lasciato che l'app/gioco funzionasse senza ostacoli.

Il modello predefinito con il jetfighter non dovrebbe mai avere problemi a girare a 60fps. Quindi ha senso solo che questa "caratteristica" del framerate diventerebbe attiva se il polling di iOS per determinare quando chiudere il ciclo di gioco a 40fps è fatto troppo presto nel lancio, per troppo poco tempo. Ciò significa che qualsiasi interruzione nei primi fotogrammi del gioco fa sì che iOS lo copra a 40 fps, pensando in anticipo che il gioco non possa/non possa mantenere 60 fps.

Ironia della sorte, iOS è probabilmente la causa del singhiozzo che sta rilevando al momento del lancio del gioco che lo induce a considerare l'app incapace di mantenere un 60fps stabile.

ma sto speculando!

Questo si basa sull'osservazione, non su fatti noti al riguardo. Ma è coerente con quello che sto vedendo accadere e l'unica spiegazione ragionevole che ho finora.

La "buona notizia" è che iOS non campiona solo una volta e lo lascia.Campiona spasmodicamente il gioco e, dopo interruzioni, salta alla schermata principale e torna all'app.

Ad esempio: è possibile provocare un ricampionamento del framerate da parte di iOS e farlo saltare da 40 a 60 o da 60 a 40, semplicemente avviando Quicktime screenCapture mentre il dispositivo è connesso. Apparentemente questo (e alcune altre azioni) faranno sì che iOS test l'app in esecuzione per la sua consistenza framerate, ancora una volta, quindi iOS si adeguerà in base ai suoi risultati, ancora una volta.

E, dopo un lasso di tempo arbitrario, esegue nuovamente la scansione. Se lasci il modello JetFighter in esecuzione per un po ', vedrai che alla fine iOS eseguirà un altro test sulla consistenza del framerate, e spesso determina che è ora abbastanza stabile a 60fps per riportarlo a 60fps, nonostante abbia inizialmente deciso di farlo. dovrebbe funzionare solo a 40fps.

Dico tutto questo perché ho visto una cosa chiamata "renderer" nelle statistiche sul dispositivo che prende deliberatamente la giusta quantità di tempo in più in ogni gameloop per forzare 40fps, anche quando non c'è abbastanza vicino le cose stanno andando a rendere necessario.

Mi sembra che Apple stia lavorando su una tecnologia a frame rate variabile come da loro dichiarazioni sull'iPad Pro e sulle funzionalità iOS a supporto che sono state (apparentemente) implementate prima del rilascio della tecnologia dello schermo, e malamente e prova stranamente le app in esecuzione per determinare quando forzarle a rallentare i frame rate.

Dato che 40 fps è un numero dispari che non si divide equamente nella frequenza di aggiornamento predefinita dei dispositivi attuali alla frequenza di aggiornamento di 60 fps, è probabile che l'iPad Pro sia in grado di aggiornare lo schermo a 120 Hz se sono così interessati a 40 fps.

Durante la cattura da iPads attuali, se si tratta di framerate bloccato a 40fps per iOS che sto vedendo un 2: sequenza di frame 1 è così che saresti 40fps su un dispositivo di 60Hz rinfrescante: 1: 2: 1: 2.

Quale non è in alcun modo l'ideale. Non vorrai mai vederlo su uno schermo a 60Hz perché è fastidioso, visivamente, anche per le persone con occhi insensibili.

Probabilmente questa tecnologia framerate variabile consente i veri 40fps sui nuovi iPhone, non lo so. Non ho ancora visto nulla di testato, ma sembra strano che qualcosa che probabilmente è realmente possibile su iPad Pro stia causando questo problema su tutto in questo momento.

+0

Sembra proprio che sia così. Osservando più da vicino la traccia, il modello 2: 1: 2: 1 è chiaramente visibile http://i.imgur.com/DUEI0A3.png – Xzya