2016-08-19 4 views
13

Я разрабатываю простую игру с Swift & SpriteKit, и я заметил, что FPS падает с 60 до 58-59 (и обратно). Существует заметное отставание, когда происходит падение - похоже, что отбрасывается 1 или 2 кадра.FPS падает в SpriteKit

Загрузка процессора составляет около 20-25% и не изменяется много, использование памяти на постоянной основе составляет около 8 МБ.

Скриншот: App Screenshot

Есть 6 объект на экране: ярлык, красный объект (Sprite), 2x зеленые объекты (Sprite), одна коробка (Sprite) и "землю" (узел формы Rect).

Все объекты, кроме метки, имеют физическое тело (отображаются с белыми границами).

Зеленые и белые объекты создаются динамически, двигаться справа налево и уничтожены, когда закадровый:

func scheduleAddingLiquid() { 
let wait = SKAction.waitForDuration(NSTimeInterval(getRandomNumber(1, end: 3))) 
     let block = SKAction.runBlock({ 
      [unowned self] in 

      let liquidNode = LiquidNode(texture: self.liquidTexture, sceneFrame: self.frame) 
      self.addChild(liquidNode) 
      liquidNode.move() 

      self.scheduleAddingLiquid() 
     }) 

     let sequence = SKAction.sequence([wait, block]) 
     runAction(sequence) 

и:

func move() { 
     let moveAction = SKAction.moveToX(-frame.width, duration: NSTimeInterval(3)) 
     let removeBlock = SKAction.runBlock({ 
      [unowned self] in 

      self.removeFromParent() 
      }) 

     runAction(SKAction.sequence([moveAction, removeBlock])) 
    } 

Красный объект "прыгает" на сенсорный экран:

if touches.count > 0 && isHeroOnGround && heroNode != nil { 
      isHeroOnGround = false 
      heroNode.physicsBody?.velocity = CGVector(dx: 0, dy: 0) 
      heroNode.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 400)) 
     } 

Задержка происходит в течение случайного интервала времени после «прыжки» (от 0,5 до 1,5 секунд после прыжка).

Задержка возникает не при столкновении, когда красный объект находится «в воздухе». И это происходит не каждый прыжок. Нагрузка процессора не растет, когда FPS падает.

Проверен на прошивке 9.3, IPad мини 2.

Upd 1. Проверен на IOS 9.3 iPhone 6 - FPS составляет около 50-55 в течение первых нескольких секунд, после чего он постоянно 60, без лагов. Таким образом, он отстает только от iPad mini 2 (у меня есть только эти два устройства, не могу тестировать на других).

UPD 2. Я прокомментировал код создания всех объектов, за исключением красной фигуры. Он все еще отстает, когда «прыгает». Итак, теперь я уверен, что это связано с методом applyImpulse.

UPD 3. Это действительно, ДЕЙСТВИТЕЛЬНО странно: я удалил весь код из метода touchhesBegan, и он все еще отстает от касаний! Метод полностью пуст. Я не знаю почему, но FPS падает, если я нажимаю несколько раз ...

Как отладить это?

+0

Я подозреваю, что ваша проблема заключается в том, как вы смешиваете skactiona и физический движок. Я вообще не смотрел в вашем коде, я заметил, что вы применяете импульс +, используя переход. Эти двое не хорошо сочетаются друг с другом. Поэтому проверьте, не мешают ли эти два ... Это было бы началом. – Whirlwind

+0

Точнее, SKActions * не должен * использоваться для перемещения объектов, если вы уже перемещаете эти объекты с помощью физического движка. Если вас интересуют только контакты, то хорошо использовать действия вместе с физическим движком. – Whirlwind

+2

Капля с 1 по 2 FPS не будет заметна вашим глазом, поэтому то, что вы вызываете лаг, может не отставать, это может быть пауза в основном потоке, или это может быть нежелательным эффектом из-за неправильного программирования. Более подробная информация о том, что происходит на самом деле, может быть полезна в вашем случае, или, возможно, вы захотите перейти на http://codereview.stackexchange.com/ и позволить людям увидеть, где вы ошибаетесь в своем коде. – Knight0fDragon

ответ

4

У него только проблемы с мини, что заставляет меня думать, что что-то не так с вашим мини (или этим конкретным пакетом на мини). Попробуйте создать новый проект, скопируйте файлы и запустите его снова. Кроме того, вы сказали, что 9.3, но есть 9.3.1, 9.3.2 и т. Д. Оба устройства могли иметь разные сборки.

Итак, во-первых, убедитесь, что ваш iphone и iPad работают с той же версией iOS. Возможно, произошла ошибка, или, возможно, они исправили ошибку (что заставило работать, а не другое).

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

Таким образом, вы также можете увидеть, может ли проблема быть связана с ориентацией (широкоформатный экран iphone vs 4: 3 или что-то вроде iPad).

Иногда у меня были «очень странные» вещи с моими файлами проекта (даже без плагинов) и просто создавался новый проект, копируя все файлы по его исправлению. Если он отстает, когда вы нажимаете на пустой «touchhesBegan» ... заставляет меня думать, что что-то плохое с Xcode/вашим мини под рукой - поскольку это происходит только на этом одном устройстве (таким образом, мы знаем до сих пор) ...

Другие вещи, чтобы рассмотреть,

  1. Какая версия Xcode вы используете? Попробуйте последнюю версию бета-версии/вернитесь к 7.3. Любые различия?

  2. У вас есть другой компьютер, с которого вы могли бы попытаться построить проект?

  3. Если вы заменяете [unowned self] или оставляете его, ничего не исправить, тогда мое предложение состоит в том, чтобы загрузить код с помощью print и посмотреть, что происходит.

  4. Если вы использовали редактор сцен, чтобы создать спрайт-узлы, удалите их все и переделайте их или попробуйте сделать их программным путем. Это фиксировало случайные ошибки в некоторых моих проектах (по-видимому, без причины).

Нам нужно больше кода/информации, но выше, мы надеемся, исправить вашу проблему.

+0

Спасибо за ответ!У меня есть только 2 устройства, iPad mini 2 и iPhone 6, обе имеют ту же версию (9.3.5). Я попытался запустить игру на симуляторах, это нормально на 5 с/6, но отстает на 6 +/6s + (я думаю, это из-за размера экрана). 1. Xcode - последняя стабильная версия, я попробую бета-версию. 2. У меня есть только один MBP (последняя стабильная ОС X). 3. Уже пробовал, ничего не изменилось. 4. Нет, я не использовал это. Самое странное, что он отстает ТОЛЬКО от прикосновений, даже если нет кода для обработки касаний. – arts777

+0

@ RankoR интересный. он не отстает от аппаратного телефона, но делает это на виртуальном. Является ли ваше ядро ​​i или core2duo для Macbook? Я бы определенно попробовал импорт нового проекта, beta Xcode. Если это не сработает, вы должны поставить проект на GH, чтобы мы могли посмотреть. У меня есть 4,5-х четырехъядерный хакертош с r295x2 .. xD, если он отстает от этого, он должен быть кодом. У меня также есть ipad 3, air и обычный iphone 5 .... – Fluidity

+0

также, я бы начал создавать таблицу различных конфигураций, в которых она отстает/не отстает. это может быть или не быть полезным, но может быть что-то рассмотреть, если в будущих проектах начнутся похожие ошибки. Если в xcode или iOS есть реальная ошибка, эти данные помогут Apple исправить это. – Fluidity

1

Ну, я полагаю, что это немного поздно, но у меня падение производительности, когда я добавляю SKShapeNode к своей сцене. У меня нет задержек с 200 + равными SKSpriteNode, и все начинается замерзанием, когда есть 80 узлов, среди которых всего около 30 SKShapeNode. Конечно, без дополнительной функциональности, просто путь, штрих/заливка цветов и lineWidth

Смежные вопросы