FPS падает в SpriteKit
Я разрабатываю простую игру с 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 падает, если я нажимаю несколько раз...
Как отладить это?
Ответы
Ответ 1
У него только проблемы с мини, заставляет меня думать, что что-то не так с вашим мини (или этим конкретным пакетом на вашем мини). Попробуйте создать новый проект, скопируйте файлы и запустите его снова. Кроме того, вы сказали, что 9.3, но есть 9.3.1, 9.3.2 и т.д. Оба устройства могли иметь разные сборки.
Итак, во-первых, убедитесь, что ваш iphone и iPad работают с той же версией iOS. Возможно, произошла ошибка, или, возможно, они исправили ошибку (тем самым заставляя работать, а не другую).
Кроме того, попробуйте запустить его на разных эмуляторах... если он работает безупречно на эмуляторах, то я еще больше подозреваю мини (в его текущей конфигурации).
Таким образом, вы также можете увидеть, может ли() проблема связана с ориентацией (широкоформатный iphone против 4: 3 или что-то вроде iPad).
Иногда у меня были "очень странные" вещи с моими файлами проекта (даже без плагинов) и просто создание нового проекта, копирование всех файлов по его исправлению. Если он отстает, когда вы нажимаете на пустой "touchhesBegan"... заставляет меня думать, что что-то плохое с Xcode/мини-под рукой - так как это происходит только на одном устройстве (таким образом, мы знаем до сих пор)...
Другие вещи, которые следует учитывать,
-
Какую версию Xcode вы используете? Попробуйте последнюю версию бета-версии/вернитесь к 7.3. Любые различия?
-
У вас есть другой компьютер, с которого вы могли бы попытаться построить проект?
-
Если замена [unowned self]
или ее удаление не исправит ничего, тогда мое предложение было бы загрузить ваш код с помощью операторов print
и посмотреть, что происходит.
-
Если вы использовали редактор сцен, чтобы создавать спрайт-узлы, удалите их все и переделайте их или попробуйте сделать их программным путем. Это фиксировало случайные ошибки в некоторых моих проектах (по-видимому, без причины).
Нам нужно больше кода/информации, но, как мы надеемся, устранить проблему можно.
Ответ 2
Ну, я полагаю, что это немного поздно, но у меня падение производительности, когда я добавляю SKShapeNode
в свою сцену. У меня нет лагов с 200 + равными SKSpriteNode
, и все начинает замерзать, когда есть 80 узлов, среди которых всего около 30 SKShapeNode
. Конечно, без дополнительной функциональности, просто путь, цвета штриховки/заливки и lineWidth