После закрытия SKScene память остается высокой

Я использую dispatch_once NSObject для создания указателей данных. Таким образом, все указатели на игровые активы создаются при появлении основного контроллера представления. Чтобы начать игру, пользователь нажимает кнопку UIButton, соответствующую определенному уровню в UIViewController. Позвольте мне назвать его LevelSelectionController. Когда игра закончится, пользователь коснется ярлыка (SKLabel). И все действия и узлы будут удалены.

[self removeAllActions];
[self removeAllChildren];
[self removeFromParent];

Более того, подкласс SKScene для определенного уровня делегирует задачу возврата пользователя в LevelSelectionController контроллеру представления, представляющему игру SKView, следующим образом.

- (void)closeScene {
    SKView *spriteView = [[SKView alloc] init];
    [spriteView presentScene:nil];
    [self.navigationController popViewControllerAnimated:YES];
}

Единственная проблема, которая у меня есть, заключается в том, что память остается высокой, когда пользователь покидает игровую сцену (SKScene). Игра требует много ресурсов. Поэтому, когда игра запускается, использование памяти подскакивает до 200 МБ. Когда пользователь возвращается к исходному контроллеру представления выбора уровня, симулятор игры по-прежнему потребляет 200 МБ, согласно монитору активности. Когда пользователь переходит на другой уровень, использование памяти увеличивается еще на 10 МБ. Итак, как я могу освободить память для последней игры, когда пользователь покидает SKScene?

Я использую АРК. Версия Xcode 5.1. Целью разработки является iOS 7.1.

Спасибо за помощь.

-- Редактировать 1 --

Я глупый. Я знаю, в чем проблема. Когда я закрываю сцену, я создаю новый SKView, который затем устанавливаю на ноль, чтобы выйти из текущей сцены. Оно работает. Но это не должно быть способом сделать это. Вместо этого мне нужно установить текущий SKView в переменную перед его представлением. Когда я закрываю сцену, мне нужно установить эту переменную в ноль. Хм... Я не думал.

-- Редактировать 2 -- Там мало изменений, когда текущая сцена представлена ​​с нулевым значением. Удаление его из removeFromSuperview мало что дает.


person El Tomato    schedule 28.03.2014    source источник
comment
Я не думаю, что это хорошая идея управлять несколькими SKView в проекте iOS, даже если вы заменяете представления. Одна из причин заключается в том, что с представлением могут быть связаны различные кэши ресурсов, и замена представлений может быть дорогостоящей (как с точки зрения производительности, так и с точки зрения потребления памяти). Вместо этого используйте один вид и используйте переходы сцен для смены сцен. Вот как Sprite Kit предназначен для использования.   -  person LearnCocos2D    schedule 28.03.2014


Ответы (2)


Несколько человек в SO заметили, что SKScene освобождается, когда содержащий SKView удаляется из его супервизора.

Взгляните на эти вопросы и ответы на них:

Освободить SKScene после перехода на другую SKScene в SpriteKit< /а>

Комплект Sprite для iOS 7 освобождает память

Кроме того, попробуйте изменить метод closeScene следующим образом:

- (void)closeScene {
    SKView *spriteView = (SKView*)self.view;
    [spriteView presentScene:nil];
    [self.navigationController popViewControllerAnimated:YES];
}
person ZeMoon    schedule 28.03.2014
comment
Спасибо. Я уже читал эти темы. И эта модификация приводит к сбою приложения: [UIView presentScene:]: нераспознанный селектор отправлен в экземпляр - person El Tomato; 28.03.2014

Поместите NSLog() в метод dealloc SKScene, чтобы убедиться, что он освобождает память.

Кроме того, ресурсы могут не освобождаться сразу после того, как счетчик ссылок вашей сцены достигает 0. Из-за внутренних оптимизаций ресурсы могут оставаться в памяти до тех пор, пока не будет получен сигнал предупреждения о памяти.

person Andrey Gordeev    schedule 28.03.2014