2015-06-10 4 views
5

Il mio progetto funziona a 55-60 FPS su un iPhone 6 ma qualsiasi cosa più vecchia è completamente ingiocabile perché qualcosa sta mangiando CPU.SpriteKit che utilizza la CPU 95-100% quando si esegue il gioco con una tilemap di grandi dimensioni (JSTileMap)

Credo che il problema è legato al numero di tessere e strati sulla mia mappa (64x256 con 4 strati) e strumenti mostra "SKCRenderer: preprocessSpriteImp (..." prendendo 5198ms (23,2%) Tempo di esecuzione

.

Does JSTileMap caricare l'immagine di ogni singolo piastrella (visibile o meno) in una sola volta Questo post da RW indica che è il caso e che potrebbe essere aggirato per grandi miglioramento delle prestazioni:? http://www.raywenderlich.com/forums/viewtopic.php?f=29&t=9479

In un'altra nota le prestazioni - Sprite Kit controlla tutti i suoi nodi e decide quali devono essere visualizzati ogni frame. Se disponi di una grande mappa tile , questo può essere un grande successo in termini di prestazioni. JSTileMap carica tutti i nodi (SKSpriteNode per ogni riquadro) quando carica la mappa di tile. Quindi, I vedeva anche problemi di prestazioni nella versione di Sprite Kit con le mie mappe (che sono 500 x 40 tessere). Ho aggiunto un assegno alla mia versione di JSTileMap che è inclusa nel kit che contrassegna la proprietà nascosta di ogni tessera, quindi nasconde in modo intelligente e nasconde solo le tessere che entrano/escono dallo spazio dello schermo. Questo ha aumentato significativamente le prestazioni di queste mappe più grandi di .

Sfortunatamente quel post non entra nel dettaglio delle azioni intraprese per porvi rimedio.

Il mio primo pensiero è stato (sono un principiante, per favore sii gentile) creare una serie di nodi scorrendo attraverso ogni punto e controllando la presenza di una tessera sul livello specifico. Da lì avrei lavorato per aggiungerli/rimuoverli in base alla distanza dal giocatore.

Questo non ha funzionato, perché il processo di aggiunta di nodi a un array ha semplicemente causato il blocco dell'applicazione per sempre su mappe più grandi.

Qualcuno potrebbe dare una mano? Mi piacerebbe lavorare con tilemaps più grandi/più complicate ma questo problema di prestazioni sta distruggendo il mio cervello.

Grazie per la lettura!

AGGIORNAMENTO: Un grande grazie a SKAToolKit:https://github.com/SpriteKitAlliance/SKAToolKit

La loro caratteristica abbattimento risolto il mio problema e sto ora in esecuzione mappe ancora più grandi a meno del 35% della CPU.

+1

Il nostro gruppo SKA ha lavorato a un kit per caricare le mappe piastrellate. Potresti provare e vedere se vedi delle modifiche alle prestazioni. https://github.com/SpriteKitAlliance/SKAToolKit Sarei molto interessato a te avere lo stesso problema o no. Ho lavorato molto per ottimizzarlo per le prestazioni. Se non ottieni le prestazioni desiderate, potrei aggiungere la funzionalità sopra menzionata. Avrei solo bisogno di una mappa di esempio che causerebbe il rallentamento che stai vedendo. –

+0

Grazie Skyler! Scoprirò stasera e ti faccio sapere come funziona. – Norm

+0

@SkylerLauren Mi dispiace per queste terribili domande per principianti, ma ne ho alcune: 1) Avrò bisogno di un'intestazione di bridging per utilizzare questo kit in un progetto Swift, simile a JSTileMap? e 2) Devo confezionare trame in un modo speciale per lavorare con le mappe JSON? Sto usando TexturePacker e in precedenza avevo creato degli atlanti nel loro modello Swift, che funzionava perfettamente con le mappe TMX. Vedo che il tuo progetto di esempio ha un file TMX e un file esportato da JSON e le immagini non sembrano essere nello stesso formato di atlante. Grazie mille! – Norm

risposta

2

JSTileMap ha alcuni problemi di movimentazione mappe più grandi ma avete un paio di opzioni da considerare:

  1. rompere il vostro grande mappa in diversi pezzi più piccoli e caricare ogni nuovo pezzo, come richiesto.
  2. Caricare solo gli oggetti che si trovano nelle vicinanze del lettore.
  3. Carica solo le tessere che si trovano nelle vicinanze del giocatore.

Personalmente ho trovato impossibile realizzare # 3 con JSTileMap poiché non riuscivo a trovare un array che contenesse le tessere della mappa. Ho risolto questo problema utilizzando lo SKAToolKit che fornisce un facile accesso agli array di tile delle mappe.È un'ottima risorsa per l'analisi delle mappe create in Tiled.

+1

Sangony, grazie mille per questa risposta. Non avevo mai sentito parlare di SKAToolKit prima di oggi e questo, combinato con la raccomandazione di Skyler, mi consentirà di lavorarci il più presto possibile. P.S: Mentre sto imparando a programmare mi trovo spesso a beneficiare delle risposte che hai pubblicato su SA, sei un grande aiuto! – Norm

+0

@Norm - Grazie per le gentili parole :) – sangony