Sprite Kit Physics: можно ли использовать фиксированное обновление?

У меня есть сценарий, в котором в моей сцене происходит фиксированное обновление.

При каждом обновлении я хотел бы создать тень, используя предыдущее положение спрайтов.

func update(currentTime: NSTimeInterval)
{
    shadow.position = sprite.position
}

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

Однако это не так, поскольку при сравнении тени на моем симуляторе с тенью на моем устройстве расстояние между ними сильно различается.

НАПРИМЕР. Моему телефону потребовалась 1 секунда, чтобы переместить спрайт на 60 шагов Моему симулятору потребовалось 2 секунды, чтобы переместить спрайт на 60 шагов

В мире фиксированных обновлений. для достижения обоих потребовалось 60 кадров, симулятор просто отставал.

Фактические результаты, однако, поставят симулятор на 120 шагов.

Я попытался отключить asynchronous на SKView в надежде, что это даст мне фиксированные обновления, но это ни к чему не привело, поэтому я спрашиваю, знает ли кто-нибудь, как заставить SKPhysics работать с фиксированной средой обновлений.


person Knight0fDragon    schedule 07.07.2016    source источник
comment
Вычислить разницу во времени между обновлениями с аргументом currentTime, масштабировать движение по этой разнице   -  person Kametrixom    schedule 08.07.2016
comment
Это нехороший подход, вы удваиваете усилия уже отстающей машины.   -  person Knight0fDragon    schedule 08.07.2016
comment
Почему бы не ограничить тень спрайтом?   -  person Simone Pistecchia    schedule 08.07.2016
comment
Потому что это ничего не решит эту проблему. Проблема в фиксированных обновлениях, мне это нужно не только для тени, мне нужно, чтобы все мои физические тела в игре работали в фиксированное время.   -  person Knight0fDragon    schedule 08.07.2016


Ответы (1)


Я не уверен, что это может быть полезно для вас, я почти уверен, что вы знаете этот параметр, но, возможно, вы не заметили:

if let scene = GameScene(fileNamed:"GameScene") {
            // Configure the view.
            let skView = self.view as! SKView
            skView.showsFPS = true
            skView.showsPhysics = true
            skView.showsNodeCount = true

            skView.frameInterval = 1 // real devices
            #if (arch(i386) || arch(x86_64)) && os(iOS)
                skView.frameInterval = 2  // <- this one
            #endif 

            /* Sprite Kit applies additional optimizations to improve rendering performance */
            skView.ignoresSiblingOrder = true
            /* Set the scale mode to scale to fit the window */
            scene.scaleMode = .ResizeFill
            skView.presentScene(scene)
        }

Источники:

    /* Number of hardware vsyncs between callbacks, same behaviour as CADisplayLink. Defaults to 1 (render every vsync) */
        public var frameInterval: Int

Документация:

Это официальный Apple документ, в котором говорится:

Значение по умолчанию — 1, что означает, что ваша игра будет получать уведомления с частотой обновления экрана. Если для значения установлено значение больше 1, отображаемая ссылка уведомляет вашу игру с частотой, составляющей часть собственной частоты обновления. Например, установка интервала на 2 приводит к тому, что сцена вызывается через каждый второй кадр, обеспечивая половину частоты кадров.

Установка этого значения меньше 1 приводит к неопределенному поведению и является ошибкой программиста.

person Alessandro Ornano    schedule 10.07.2016
comment
К сожалению, это ничего не изменит, единственное, что вы делаете, это увеличиваете время между вызовами обновлений. Я действительно просто хочу фиксированное обновление без необходимости пересчета на основе дельта-времени (потому что это удваивает усилия на этом этапе, тратя впустую драгоценные циклы). По сути, игра должна думать, что дельта-время всегда составляет 16,6666666 мс. Сейчас, даже на очень быстром устройстве, дельта-время может меняться на несколько мс при каждом обновлении. - person Knight0fDragon; 11.07.2016
comment
Единственное, о чем я думаю, это исходники Cocos2D (в частности, CCScheduler.m), где вы можете найти подробную информацию о методе обновления cocos2d и всех исправлениях, применимых к этому, здесь: github.com/Maxim-Filimonov/conways_gol_ios/blob/ мастер/ - person Alessandro Ornano; 11.07.2016
comment
Cocoas2d это не набор спрайтов, я не использую какао 2d, проблема не в какао 2d. Цель состоит в том, чтобы заставить SKPhysics работать в режиме фиксированного обновления. (Технически, если я смогу заставить обновление Sprite Kit работать действительно последовательно, где dTime равно 16,6666, тогда это будет золото) - person Knight0fDragon; 11.07.2016
comment
Конечно, я знаю, этот код должен быть для обдумывания новой идеи, а не для простого копирования и вставки. - person Alessandro Ornano; 11.07.2016
comment
ну проблема в том, что это 2 разных фреймворка, я просто собираюсь списать это на то, что это невозможно, может быть, если исходный код SpriteKit будет выпущен, я мог бы сделать свой собственный SKView с исправленным обновлением - person Knight0fDragon; 11.07.2016
comment
Я надеюсь, что вы решите, друг, ваш вопрос довольно сложный и заслуживает внимания. - person Alessandro Ornano; 11.07.2016
comment
ага, в юнити у них оба обновления стиля есть, может в будущем он войдет в Sprite Kit, кто знает - person Knight0fDragon; 11.07.2016