NSTimer
non è un timer in tempo reale. Non è nemmeno vicino, né significa essere. Se stai guardando qualcosa di più veloce di circa mezzo secondo, lo NSTimer
è lo strumento sbagliato. Non lo consiglierei nemmeno per cose al di sotto di un secondo. Per cose di più secondi, e in particolare per le cose da più minuti, quando non ti importa esattamente quando spara, è fantastico. Io lo uso per tutto il tempo.
CACurrentMediaTime()
non è un timer. È un involucro attorno alla funzione temporale più precisa del sistema: mach_absolute_time()
. Quindi se ti importa davvero di che ora è in questo momento, e ti piacerebbe che fosse un numero comprensibile dall'uomo, la tua funzione è CACurrentMediaTime()
. mach_absolute_time()
ti darà un numero veramente accurato, ma è basato sullo Mach absolute time unit che in realtà non si riferisce a ciò che gli umani fastidiosi pensano (e ogni CPU ha una scala diversa). Ecco perché abbiamo CACurrentMediaTime()
per semplificarci la vita.
OK, quindi NSTimer
non è per il tempo reale e CACurrentMediaTime()
non è un timer. Cosa deve fare un programmatore di giochi?
Grand Central Dispatch include alcuni dei migliori sistemi "fai questa corsa in questo momento" che abbiamo. È una fonte di spedizione. Dico "in questo momento" perché GCD non è ancora realmente "in tempo reale" nel modo in cui i ragazzi di RTOS intendono farlo. Ma è abbastanza in tempo reale per gli sviluppatori di giochi. Cerca Creazione di un timer nello Concurrency Programming Guide. Dai un'occhiata anche allo dispatch_after()
, che è buono per uno scatto "esegui questo dopo un ritardo."
Ricorda che tutto ciò che viene eseguito sul thread principale (il thread dell'interfaccia utente, in cui è stato eseguito tutto il disegno), condividerà il tempo con tutto il resto su quel thread, così spesso avrai bisogno di fare calcoli su un thread in background mentre gestisci il disegno e l'interazione dell'utente sul thread principale.Questo è il tipo di cosa che GCD dispatch_queues è progettato per aiutarti.Inoltre, ricorda che molti dispositivi iOS sono single-core. thread "è un po 'improprio: solo una cosa può davvero funzionare alla volta sulla CPU, ecco perché spostare le cose sulla GPU è così importante (vedi sotto)
Si potrebbe anche voler guardare seriamente ai sistemi come cocos2d, che è un ottimo motore di gioco. Si prende cura di molti e tipi di dettagli per te e ti consente di concentrarti sulla parte del gioco.
Restando nei framework Apple, dovresti anche dare un'occhiata a Core Animation. Se stai spostando le cose sullo schermo con i timer, non dovresti farlo. Core Animation è come si muovono le cose sullo schermo. Si prende cura di molti dettagli per te, più velocemente e usando molta meno batteria di quella che faresti da solo, e sposta gran parte del lavoro sulla GPU (come ho detto sopra). È un po 'più progettato per gli elementi dell'interfaccia utente rispetto ai giochi, ma può sicuramente essere usato per costruire giochi semplici.
E naturalmente c'è GLKit, ma questa è una cosa completamente diversa ....
Hey Rob, grazie per la grande risposta! Apprezzo molto che tu abbia il tempo di leggere e rispondere così a fondo. Grazie! –
Grazie per la risposta dettagliata! Chiarificazione rapida: come suggerito da una delle risposte seguenti, i documenti di NSTimer affermano che la "risoluzione effettiva dell'intervallo temporale per un timer è limitata a un ordine di 50-100 millisecondi". Il tuo suggerimento di evitare NSTimer per compiti secondari rimane ancora oggi? Grazie ancora! – Crashalot
Ancora non userò NSTimers velocemente (certamente non con i selettori). Il ciclo di esecuzione e l'overhead di invio sembrano eccessivi. È possibile che io sia troppo cauto nei loro confronti, ma NSTimer sembra lo strumento sbagliato lì. (Ora ci sono interfacce basate su blocchi che probabilmente sono basate su GCD piuttosto che su cicli di esecuzione, quindi quelle probabilmente sono del tutto soddisfacenti, ma non ho esplorato molto le nuove interfacce). –