Подтвердить что ты не робот

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 падает, если я нажимаю несколько раз...

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

4b9b3361

Ответ 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