SKTextureAtlas carga y gestión de la memoria

Estoy desarrollando un juego en SpriteKit y tengo varias escenas cada escena tiene desde 3 TextureAtlas en tamaño mínimo y máximo de una imagen en cada TextureAtlas es 60K mi juego falla en la memoria.

lo que hago en Cada escena es Definir acción en el Archivo de encabezado, por ejemplo:

initialise them in -(id)initWithSize:(CGSize)size Function @interface FirstLevel : SKScene { SKAction *RedBirdAnimation; } 

y en el archivo de implementación:

 -(id)initWithSize:(CGSize)size{ if(self=[super initWithSize:size]) {[self setupRedBirdActions];} return self; } -(void)setupRedBirdActions{ SKTextureAtlas *RedBirdAtlas = [SKTextureAtlas atlasNamed:@"RedBird"]; SKTexture *RedBird1 = [RedBirdAtlas textureNamed:@"Redbird_01_iphone.png"]; SKTexture *RedBird2 = [RedBirdAtlas textureNamed:@"Redbird_02_iphone.png"]; SKTexture *RedBird3 = [RedBirdAtlas textureNamed:@"Redbird_03_iphone.png"]; NSArray *atlasTexture = @[RedBird1, RedBird2, RedBird3]; SKAction* atlasAnimation = [SKAction animateWithTextures:atlasTexture timePerFrame:0.2]; RedBirdAnimation = atlasAnimation;} 

¿Hay algo así como la mejor práctica para cargar texturas Atlas en mi juego para evitar colisiones debido a la memoria?

Hago todos SkAction con Nil al final de cada Skscene y elimino All action from All SkSpriteNode

Hay alguna solución

Cada TextureAtlas es 60K

Como un archivo tal vez. Pero eso no es uso de memoria. Para calcular el uso de memoria de un archivo de imagen, tome las dimensiones del archivo y multiplíquelas con la profundidad de bits de color (generalmente 32 bits = 4 bytes).

Por ejemplo, una textura de 4096×4096 usa 16 MB de memoria de textura (pero puede ser mucho menos que 1 MB como archivo PNG).

 4096 x 4096 x (32/8) = 16 Megabytes 

Para resumir: use instrumentos para verificar el consumo de memoria real de su aplicación.

El problema de un juego basado en SpriteKit que se queda sin memoria casi siempre es causado por el desarrollador que usa tantas texturas que todas las RAM activas son consumidas por las texturas. Voy a suponer que utilizas el enfoque de animación basado en SKAction estándar y que no tienes ninguna extraña pérdida de memoria causada por refs fuertes o algo así. La forma correcta de determinar la cantidad de RAM consumida por una textura es (ANCHURA * ALTURA * 4/1000), esto indica el número de kB de memoria requerido para almacenar la textura. Para una textura de 4096×4096, eso es 67108 kB o aproximadamente 68 Megs. No importa si se almacena en un atlas o como una textura única. La clave para reducir la cantidad total de memoria utilizada con un juego SpriteKit es reducir la cantidad de memoria consumida por cada textura. Eche un vistazo al código fuente de este ejemplo de SpriteKitFireAnimation que muestra cómo reducir el uso de memoria de cada fotogtwig puede reducir de 286 Megs a 130 Megs para una animación de canal alfa muy compleja que se ejecuta a 60FPS en un sistema iOS de 64 bits. . Este enfoque es solo para A7 y los sistemas más nuevos de 64 bits. Si está buscando enfoques de calidad inferior pero totalmente gratuitos, consulte esta comparación de enfoques de compresión de textura muy con pérdidas con SpriteKit. Como último esfuerzo, uno puede reducir el ancho y la altura de cada textura en 1/2 y luego escalar las texturas hacia atrás cuando se renderiza en un nodo, no se ve tan bien, pero usa 4 veces menos memoria en tiempo de ejecución.

TextureAtlas es demasiado grande para que el sistema se cargue. Debe dividir las imágenes en dos o más textAtlases por separado, lo que permite que el sistema administre la memoria. Coloque las imágenes que se necesitan para la configuración inicial en su propio atlas para que pueda precargarlas al inicio de su juego. Haga referencia a las imágenes como si fueran archivos individuales y el sistema cargará y descargará atlas según sea necesario. El sistema puede hacer un mejor trabajo administrando la memoria, entonces puedes dejarlo.