ios - SpriteKit usa un 95-100% de CPU cuando se ejecuta un juego con un mapa de mosaico grande(JSTileMap)
objective-c swift (1)
JSTileMap tiene algunos problemas para manejar mapas más grandes, pero tienes un par de opciones a considerar:
- Divide tu mapa grande en varias piezas más pequeñas y carga cada pieza nueva según sea necesario.
- Solo cargue esos objetos que se encuentren cerca del jugador.
- Solo cargue las fichas que se encuentren cerca del jugador.
Personalmente, me resultó imposible lograr el # 3 con JSTileMap ya que no pude ubicar una matriz con los mosaicos del mapa. Resolví este problema utilizando SKAToolKit, que proporciona un acceso fácil a las matrices de mosaicos de mapas. Es un recurso excelente para analizar mapas creados en Tiled.
Mi proyecto se ejecuta a 55-60 FPS en un iPhone 6, pero cualquier cosa anterior es completamente injugable porque algo está consumiendo CPU.
Creo que el problema está relacionado con el número de teselas y capas en mi mapa (64x256 con 4 capas) e Instrumentos muestra "SKCRenderer: preprocessSpriteImp (..." tomando 5198ms (23.2%) de tiempo de ejecución.
¿JSTileMap carga la imagen de cada azulejo (visible o no) a la vez? Esta publicación de RW indica que ese es el caso y que podría solucionarse para aumentar el rendimiento: http://www.raywenderlich.com/forums/viewtopic.php?f=29&t=9479
En otra nota de rendimiento: Sprite Kit comprueba todos sus nodos y decide cuáles necesita para mostrar cada cuadro. Si tienes un gran mapa de fichas, este puede ser un gran golpe de rendimiento. JSTileMap carga todos los nodos (SKSpriteNode para cada tesela) cuando carga el mapa de teselas. Por lo tanto, también estaba viendo problemas de rendimiento en la versión del Kit Sprite con mis mapas (que son 500 x 40 fichas). Agregué un cheque a mi versión de JSTileMap que está incluida en el kit que marca la propiedad oculta de cada tesela, luego muestra y oculta inteligentemente solo las teselas que entran o salen del espacio de la pantalla. Eso aumentó significativamente el rendimiento en estos mapas más grandes.
Desafortunadamente esa publicación no entra en detalles con respecto a los pasos tomados para remediar esto.
Lo primero que pensé fue (soy un principiante, por favor sé gentil) crear una matriz de nodos al recorrer cada punto y buscar un mosaico en la capa específica. A partir de ahí, trabajaría en agregarlos / eliminarlos según la distancia del jugador.
Esto no funcionó, porque el proceso de agregar nodos a una matriz simplemente causó que la aplicación se cuelgue para siempre en mapas más grandes.
¿Podría alguien echar una mano? Me encantaría trabajar con mapas de mosaicos más grandes / más complicados, pero este problema de rendimiento está destruyendo mi cerebro.
¡Gracias por leer!
ACTUALIZACIÓN: Muchas gracias a SKAToolKit: https://github.com/SpriteKitAlliance/SKAToolKit
Su función de eliminación resolvió mi problema y ahora estoy ejecutando mapas aún más grandes con menos del 35% de CPU.