Да, особенно расстраивает отслеживание утечек в коде спагетти, с которым я имею дело :) Но это дает мне несколько мест, чтобы посмотреть, спасибо!

я естьSKScene который является загробным миром для моей 2D-игры. Это как район, который игрок может исследовать. Район полон домов. Игроки могут свободно входить и выходить из домов. Когда игрок входит в дом, я звонюskView.presentScene(newHouse) представить интерьер дома как новую сцену. Когда игрок выходит из дома, я звонюskView.presentScene(overworld) представить окрестности снова. Игрок может входить и выходить из домов много раз, пока они исследуют окрестности. Таким образом, сцена соседства и новые экземпляры сцены дома представлены много раз.

Проблема в том, что каждый раз, когда я представляю домашнюю сцену, в памяти всплеск. Это ожидается, так как мы загружаем новую сцену дома. Но когда я покидаю домашнюю сцену и возвращаюсь к соседской сцене, объем используемой памяти не уменьшается. Я проверил это, входя и выходя из домов снова и снова. Использование памяти постоянно увеличивается (~ 2 МБ) каждый раз, когда я вхожу в дом. В конце концов, объем используемой памяти становится очень большим, и игра начинает сбрасывать кадры (но только в домашних сценах, а не в соседских сценах) и в конечном итоге становится неиграемой.

Почему это происходит?

При работе со SpriteKit я подумал, что лучше всего использоватьpresentScene чтобы перевести игрока в существенно другое «царство» игрового мира (например, на другой уровень), что я и делаю здесь. Я также подумал, что вы не должны предпринимать никаких действий, чтобы «разгрузить» свою старую сцену при загрузке, а затем перейти к новой сцене. Действительно,SKView В документации нет методов для очистки ненужных объектов от старой сцены, когда вы представляете новую сцену. Я думал, что вы должны доверять ОС, чтобы справиться с задачей удаления объектов старой сцены из памяти. Вот почему я просто представляю новые сцены и не беспокоюсь о том, что старые сцены занимают память.

Я профилировал приложение в Инструментах, чтобы проверить на утечки памяти (Инструменты все еще немного над моей головой в этом пункте). Я обнаружил некоторые утечки памяти, которые выглядели очень маленькими, но никаких утечек, которые, казалось, непосредственно вызывали большие и постоянные всплески памяти, которые происходят каждый раз, когда я представляю новую домашнюю сцену.

Я делаю что-то неправильно?

Я полагаю, что выбираю правильный подход, представляя новые сцены и позволяя ОС справиться с задачей очистки старых сцен. Но, возможно, я делаю ошибку в дизайне своего приложения, которая вызывает эту проблему с памятью. Когда я представляю новую сцену дома, я передаю некоторую информацию со сцены соседства новой сцене дома. Эта информация относится к таким вещам, как внешний вид дома (цвет, текстура, содержание и т. Д.), Что необходимо, поскольку дома генерируются процедурно: каждый из них уникален. И когда я возвращаюсь на сцену соседства, я передаю некоторую информацию со сцены дома на сцену соседства. Но, возможно, то, как я передаю информацию между сценами, каким-то образом непреднамеренно приводит к тому, что объекты остаются в памяти. Если так, что я должен сделать, чтобы этого не случилось? Есть ли какой-нибудь код, который я должен выполнить, чтобы удалить ненужные объекты из памяти, когда я представляю новую сцену?

Я заметил, чтоSKScene В документации есть несколько методов, связанных с представлением сцены:sceneDidLoad(), willMove(from:), а такжеdidMove(to:), Это заставляет меня задуматься, стоит ли мне каким-то образом использовать эти методы, чтобы попытаться очистить память от ненужных объектов при переходе между разными сценами.

Может быть, моя архитектура приложения просто плохая (она уже вызывает другие проблемы для меня). Если это так, то решение было бы начать с пересмотра архитектуры моего приложения, чтобы улучшить его. Таким образом, в основном, я пытаюсь определить, является ли моя плохая архитектура приложения причиной этой проблемы раздувания памяти, или же причина связана с SpriteKit и способом представления сцен.

Ответы на вопрос(1)

Ваш ответ на вопрос