Spritekit: эффективное создание множества SpriteNodes

Я использую SpriteKit для написания стрелялки в стиле пули, и фреймворк SK, кажется, может без проблем обрабатывать сотни узлов со скоростью 60 кадров в секунду. Моя проблема, однако, в том, что иногда мне нужно создать более 50 узлов в одном кадре, и это, кажется, вызывает странную заминку в частоте кадров. Есть ли какие-то приемы, которые я должен использовать, чтобы создание множества узлов было максимально эффективным?

Я повторно использую SKTextures, должен ли я также иметь постоянную коллекцию SKSpriteNodes и SKActions, которые «перерабатываются», а не создают их новыми?


person GoatInTheMachine    schedule 18.03.2015    source источник
comment
Объедините свои узлы и используйте их повторно вместо того, чтобы постоянно добавлять их в качестве дочерних.   -  person Epic Byte    schedule 19.03.2015
comment
Это то, чего я не хотел делать... есть ли потеря производительности из-за того, что сотни узлов сидят без дела? Я бы предпочел странный сбой, чем постоянное увеличение использования батареи!   -  person GoatInTheMachine    schedule 19.03.2015


Ответы (2)


Вы можете предварительно создать все узлы перед загрузкой игровой сцены (используя обработчик завершения) и при необходимости просто показать их, т.е. setHidden = NO. Таким образом, вам не придется заново создавать узлы снова и снова. Когда узлы не нужны, просто сделайте их скрытыми. Вы можете прочитать больше здесь. Просто найдите часть о лазерах. Я думаю, что это был бы один из способов решить проблему падения частоты кадров, вызванную одновременным созданием множества узлов. И я надеюсь, что вы используете атласы... Чтобы убедиться, что все работает правильно, включите информацию о отрисовке и подсчете узлов в контроллере представления и проверьте статистику. Если вы не используете атласы или используете их неправильно, может случиться так, что количество отрисовок будет большим (по сравнению с количеством узлов).

Об атласах из документы:

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

person Whirlwind    schedule 18.03.2015

Пара моментов, о которых следует помнить:

  1. Удалите все узлы, которые больше не нужны от родителя.
  2. Не используйте usePreciseCollisionDetection без крайней необходимости.
  3. Используйте атлас текстур.
  4. Не переусердствуйте с количеством узлов. Оставайтесь реалистом и используйте только необходимый минимум.
person sangony    schedule 18.03.2015