Должен ли я удалять все SKSpriteNode и метки при переключении с одного узла на другой

#swift #sprite-kit

#swift #sprite-kit

Вопрос:

В моей игре для iOS есть пара сцен. Я заметил некоторую задержку между переключением сцен, и мне было интересно, может быть, это связано с тем, что я не удаляю все узлы и метки из родительских при переходе к другой сцене. Рекомендуется ли удалять все узлы из их родительского узла при переходе к другой сцене?

Кроме того, я заметил, что когда я удаляю все узлы, эффект перехода отчасти разрушается, так как экран становится черным во время перехода.

Возможно ли удалить узлы (предыдущей сцены) после перехода к следующей сцене?

Комментарии:

1. Добро пожаловать в SO Venkat, ваш вопрос слишком общий.. что вы подразумеваете под «удалением всех узлов и меток из родительских узлов?» Вы говорите о SKNode и SKLabelNode, или вы имеете в виду также UILabels? Можете ли вы сообщить о своем коде, чтобы лучше понять, чего вы хотите достичь?

2. Извиняюсь за то, что не понял мой вопрос. Когда я меняю сцены, должен ли я вызывать removeFromParent() для SKSpriteNodes в сцене 1 (перед переходом к сцене 2)? В моей игре есть только SKNodes.

3. @Venkat Вам не нужно вызывать removeFromParent . Вы должны убедиться, что предыдущая сцена освобождена правильно. Переопределите deinit и посмотрите, что происходит. Кроме того, есть много вещей, которые могут вызвать задержку… Одна из самых странных причин, но, вероятно, многие люди знают об этом, — это неправильное название шрифта 🙂 Так что проверьте это на всякий случай. Проблема с неправильным именем шрифта заключается в том, что iOS будет выполнять поиск по всем шрифтам, что приведет к заметному отставанию.

4. Я очень новичок во всем этом, что именно я должен переопределить deinit?

5. @Venkat Просто переопределите deinit сцены и поместите в нее оператор печати, чтобы узнать, правильно ли освобождена сцена. deinit вызывается, когда сцена собирается освободить место.

Ответ №1:

При выполнении перехода сцена и ее узлы будут освобождены из памяти, если у вас нет сильного ссылочного цикла. Кроме того, вы должны знать, что SpriteKit имеет свою собственную систему кэширования для SKTextures, поэтому не вся память будет освобождена.

Задержка может быть вызвана многими вещами, некоторыми возможностями:

  1. Если вы создаете экземпляр новой сцены при touchesEnded (или закрытии вашей пользовательской кнопки обратного вызова), задержка может быть вызвана тем, что вы выполняете слишком много работы над инициализацией. Это можно решить, например, предварительно загрузив сцену замыканием, которое выполняется в фоновом режиме, и, когда вам нужно выполнить переход, у вас уже все загружено. Ниже приведен пример: введите описание изображения здесь

  2. Возможно, вы используете слишком большие ресурсы, и поскольку их загрузка занимает больше времени, у вас задержка. Вы могли бы решить эту проблему, например, преобразовав изображения, которым не нужен альфа-канал, в .jpeg. Другим решением было бы предварительно загрузить ресурсы. Ниже приведен пример кода. введите описание изображения здесь