Значительное падение частоты кадров при возобновлении просмотра в Spritekit.

Я заметил значительное падение частоты кадров (частота кадров падает на 5-10 кадров в секунду) при возобновлении просмотра в SpriteKit. Я попробовал это с пустым проектом (шаблон игры Spritekit). Вот код:

if(!self.view.paused){
        self.view.paused = YES;
        NSLog(@"Paused");
    }else{
        NSLog(@"Unpaused");
        self.view.paused = NO;
    }

Если поставить сцену на паузу, все работает, как и ожидалось, и кадры стабильны со скоростью 60 кадров в секунду. Я тестирую это на устройстве.

if(!self.paused){
        self.paused = YES;
        NSLog(@"Paused");
    }else{
        NSLog(@"Unpaused");
        self.paused = NO;
    }

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


person Whirlwind    schedule 17.07.2015    source источник


Ответы (1)


Я предполагаю, что он временно падает после отмены паузы? Или это всегда низкий fps после снятия паузы. Это происходит только на iOS 8 или iOS 9. Можете ли вы попробовать iOS 9? Я убежден, что это может происходить потому, что после отмены паузы Sprite-Kit требуется немного, чтобы «разогреть» цикл рендеринга. Вы можете попробовать профилировать в инструментах и ​​посмотреть, что происходит.

Что касается решения, вы можете попробовать временно уменьшить speed вашего SKPhysicsWorld после отмены паузы, чтобы физика не прыгала, потому что Sprite Kit имеет переменный временной шаг, и, к сожалению, это нельзя изменить. Если скачут действия, можно попробовать понизить speed своего SKScene. В идеале вы, вероятно, должны сделать и то, и другое.

Кроме того, если вам нужно беспокоиться только о действиях, вы можете попробовать только приостановить свою сцену вместо SKView (но имейте в виду, что ваш метод обновления будет работать). Или попробуйте временно приостановить свою сцену, а затем снова приостановить ее после отмены приостановки SKView.

Помимо этого, на самом деле вы ничего не можете сделать, чтобы исправить это, кроме как попытаться подготовиться к пропущенным кадрам. Обязательно сообщите об этом в Apple, если вы еще этого не сделали.

Ниже приведена ссылка на класс для всех этих свойств.

SKView-пауза

Если значение YES, содержимое сцены фиксируется на экране. Никакие действия не выполняются и симуляция физики не выполняется.

SKScene - скорость

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

SKScene — приостановлено

Если значение YES, узел (и все его потомки) пропускаются, когда сцена обрабатывает действия.

SKPhysicsWorld - скорость

Значение по умолчанию — 1,0, что означает, что симуляция выполняется с нормальной скоростью. Значение, отличное от значения по умолчанию, изменяет скорость, с которой проходит время в моделировании физики. Например, значение скорости 2,0 указывает, что время в моделировании физики проходит в два раза быстрее, чем время моделирования сцены. Значение 0,0 приостанавливает симуляцию физики.

person Epic Byte    schedule 17.07.2015
comment
Я тестирую на iOS 8... Это происходит временно, и fps становится стабильным через секунду или меньше... И да, я получил хорошие результаты при приостановке сцены и использовании дополнительного свойства BOOL для управления обновлением: выполнение. Чего я еще не пробовал, так это поиграть со свойством скорости (в physicsWorld)... Я попробую это и сообщу вам о результатах... - person Whirlwind; 17.07.2015
comment
Нет, никакой разницы, насколько я могу судить. Обратите внимание, что это происходит даже с пустым проектом, а не только в игре (где используются действия). Я думаю, я могу заполнить радар для этого на всякий случай. Я предполагаю, что это связано с прогревом двигателя Spritekit :) при снятии паузы с просмотра, как вы сказали. По крайней мере, приостановка сцены работает, как и ожидалось. Спасибо за ответ. - person Whirlwind; 17.07.2015
comment
@Whirlwind Ааа, это очень плохо. Я попытаюсь проверить позже и посмотреть, смогу ли я придумать другое решение. Я также могу попробовать запустить на iOS 9, и я дам вам знать, исправили ли они это. - person Epic Byte; 17.07.2015
comment
Было бы неплохо, если бы вы это сделали. Спасибо! - person Whirlwind; 17.07.2015