Я разрабатываю простую игру с Swift & SpriteKit, и я заметил, что FPS падает с 60 до 58-59 (и обратно). Существует заметное отставание, когда происходит падение - похоже, что отбрасывается 1 или 2 кадра.FPS падает в SpriteKit
Загрузка процессора составляет около 20-25% и не изменяется много, использование памяти на постоянной основе составляет около 8 МБ.
Есть 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 падает, если я нажимаю несколько раз ...
Как отладить это?
Я подозреваю, что ваша проблема заключается в том, как вы смешиваете skactiona и физический движок. Я вообще не смотрел в вашем коде, я заметил, что вы применяете импульс +, используя переход. Эти двое не хорошо сочетаются друг с другом. Поэтому проверьте, не мешают ли эти два ... Это было бы началом. – Whirlwind
Точнее, SKActions * не должен * использоваться для перемещения объектов, если вы уже перемещаете эти объекты с помощью физического движка. Если вас интересуют только контакты, то хорошо использовать действия вместе с физическим движком. – Whirlwind
Капля с 1 по 2 FPS не будет заметна вашим глазом, поэтому то, что вы вызываете лаг, может не отставать, это может быть пауза в основном потоке, или это может быть нежелательным эффектом из-за неправильного программирования. Более подробная информация о том, что происходит на самом деле, может быть полезна в вашем случае, или, возможно, вы захотите перейти на http://codereview.stackexchange.com/ и позволить людям увидеть, где вы ошибаетесь в своем коде. – Knight0fDragon