ios - Después de cerrar SKScene, la memoria permanece alta
objective-c sprite-kit (2)
Yo uso un NSObject dispatch_once para crear punteros de datos. Por lo tanto, todos los punteros de activos del juego se crean cuando aparece el controlador de vista principal. Para jugar un juego, el usuario toca un UIButton correspondiente a un nivel particular en un UIViewController . Déjame llamarlo LevelSelectionController. Cuando el juego termine, el usuario tocará una etiqueta ( SKLabel ). Y todas las acciones y nodos serán eliminados.
[self removeAllActions];
[self removeAllChildren];
[self removeFromParent];
Además, una subclase SKScene para un nivel particular delega la tarea de devolver al usuario a LevelSelectionController al viewcontroller que presenta el juego SKView de la siguiente manera.
- (void)closeScene {
SKView *spriteView = [[SKView alloc] init];
[spriteView presentScene:nil];
[self.navigationController popViewControllerAnimated:YES];
}
El único problema que tengo es que la memoria permanece alta cuando el usuario abandona la escena del juego (SKScene). El juego requiere muchos activos. Entonces, cuando comience el juego, el uso de la memoria saltará a 200 MB. Cuando el usuario vuelve al controlador de vista de selección de nivel original, el simulador de juego aún consume 200 MB de acuerdo con el Monitor de actividad . Cuando el usuario ingresa a un nivel diferente, el uso de la memoria saltará otros 10 MB. Entonces, ¿cómo puedo liberar la memoria para el último juego una vez que el usuario abandona SKScene?
Estoy usando ARC. La versión de Xcode es 5.1. El objetivo de desarrollo es iOS 7.1.
Gracias por tu ayuda.
- Editar 1 -
Soy tonto. Yo sé cuál es el problema. Cuando cierro la escena, estoy creando una nueva SKView, que luego configuro como nula para sacar la escena actual. Funciona. Pero esa no debería ser la forma de hacerlo. En cambio, necesito establecer el SKView actual en una variable antes de presentarlo. Cuando cierro la escena, necesito establecer esa variable en cero. Hmm ... No estaba pensando.
- Editar 2 - Hay pocos cambios cuando la escena actual se presenta con nulo. Quitarlo de removeFromSuperview no hace mucho.
Algunas personas en SO han notado que un SKScene se desasigna cuando el SKView que lo contiene se elimina de su supervista.
Eche un vistazo a estas preguntas y sus respuestas:
Desasignar SKScene después de la transición a otro SKScene en SpriteKit
iOS 7 Sprite Kit liberando memoria
Además, intente modificar el método closeScene de esta manera:
- (void)closeScene {
SKView *spriteView = (SKView*)self.view;
[spriteView presentScene:nil];
[self.navigationController popViewControllerAnimated:YES];
}
Coloque NSLog()
en el método dealloc
para asegurarse de que está desasignando.
Además, es posible que los recursos no se liberen justo después de que el recuento de referencias de la escena llegue a 0. Debido a las optimizaciones internas, los recursos pueden permanecer en la memoria hasta recibir la señal de advertencia de la memoria.