Я разрабатываю простую игру с Swift и SpriteKit, и я заметил, что FPS падает с 60 до 58-59 (и обратно). Существует заметное отставание при падении - похоже, что отбрасываются 1 или 2 кадра.
Нагрузка процессора составляет около 20-25% и не изменяется много, использование памяти постоянно составляет около 8 МБ.
На экране есть 6 объектов: ярлык, красный объект (Sprite), 2x зеленые объекты (Sprite), один ящик (Sprite) и "земля" (форма Rect node).
Все объекты, кроме метки, имеют физическое тело (отображаются с белыми границами).
Зеленые и белые объекты динамически создаются, перемещаются справа налево и уничтожаются при выключенном экране:
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 падает.
Протестировано на iOS 9.3, iPad mini 2.
Обновление 1. Протестировано на iOS 9.3 iPhone 6 - FPS составляет около 50-55 в течение первых нескольких секунд, затем оно постоянно 60, без лагов. Таким образом, он отстает только от iPad mini 2 (у меня есть только эти два устройства, не могу проверить на других).
UPD 2. Я прокомментировал код создания всех объектов, кроме красной фигуры. Он все еще отстает, когда "прыгает". Итак, теперь я уверен, что это связано с применением метода Impulse.
UPD 3.. Это действительно, ДЕЙСТВИТЕЛЬНО странно: я удалил весь код из метода touchhesBegan, и он все еще ходит по касаниям! Метод полностью пуст. Я не знаю почему, но FPS падает, если я нажимаю несколько раз...
Как отладить это?