Я испытываю огромные проблемы с производительностью с iOS9, и я просто не могу понять, что делать. Я прочитал много сообщений - здесь и здесь, но их предлагаемые решения не помогают или не имеют большого значения.
Моя игра прошла от 60 кадров в секунду на старом iPad 2 (iOS 8.4) до < 15 кадров в секунду на новом iPad mini (iOS 9).
Я пытаюсь выработать главного виновника. Я почти уверен, что один из них - SKCropNodes. Обычно я делаю несколько SKCropNodes в моей сцене (6-18). Это никогда не было проблемой в iOS8, но, похоже, iOS9, в то время как он лучше справляется с обрезкой, также ест производительность.
Если я обрабатываю узлы обрезки как обычные SKSpriteNodes, я получаю, возможно, 5 кадров в секунду на старых устройствах и до 30 на более новом iPhone 6. У меня нет альтернативы использованию узлов обрезки, но это не может быть всей проблемой.
Я подумал, что, возможно, неправильный атлас текстуры используется, т.е. одно из гораздо большего разрешения. Однако заставить мое устройство использовать очень маленький атлас не имеет никакого значения.
Я использую Texture Packer для создания своих атласов с вариантами масштабирования для разных устройств. Я заметил, что XCAssets теперь имеет возможность добавить атлас Sprite (я не могу найти никакой документации об этом). Это не подходит для моей игры, так как я использую 100 спрайтов. Я попытался добавить свои атласы в XCAssets, но по какой-то причине он не будет использовать варианты масштабирования. Тем не менее, при низких результирующих текстурах он все еще работает ужасно.
Я попытался установить
skView.ignoresSiblingOrder = YES;
и заданы все мои значения zPosition, но все равно никакого эффекта. Я также добавил расширение .png к каждому имени изображения (первоначально проблема, которая означала, что они не будут отображаться.)
У меня есть некоторые SKEffectNodes в моих сценах, но удаление и добавление их не похоже на эффект.
Я не понимаю, как одно и то же оборудование и тот же код могут производить такие сильно разные результаты. Очевидно, Apple изменила что-то, связанное с рендерингом, оказавшим неблагоприятное воздействие. Они также, похоже, не намерены исправлять эти проблемы. Я знаю о проблемах, которые были там в течение нескольких месяцев - задолго до выхода iOS9.
Я работаю над этой игрой уже 2 года и только что выпустил ее перед iOS9. Теперь он страдает от ужасного выступления и регулярных сбоев.
Кто-нибудь понял, что именно сделал Apple, чтобы убить производительность? Если бы я знал это, я мог бы хотя бы попытаться обойти это... Спасибо.
UPDATE
Ниже приведены некоторые цифры для одной и той же сцены с абсолютным максимальным количеством узлов, которые игра будет генерироваться за один раз.
iOS 8, iPad 2, ~ 200 узлов, ~ 100 ничьих, 58,7 - 60 кадров в секунду
iOS 9, iPhone6, ~ 280 узлов, ~ 216 ничьих, около 20 кадров в секунду
Я предполагаю, что различие в количестве узлов связано с разными размерами экрана. Если я изменил сцену на iPhone 6, чтобы получить эквивалентные значения, FPS все равно около 24.
ОБНОВЛЕНИЕ 2
Используя проект Xcode-шаблона Sprite Kit и меняя космический корабль на SKCropNode, содержащий космический корабль, на iOS 8 я могу добавить 100 кораблей без проблемы с частотой кадров. На iOS 9, в том же проекте, я могу добавить около 25, прежде чем частота кадров упадет до < 30.
iOS 8 на iPad2:
iOS 9 iPhone 5:
С точки зрения использования текстурного атласа, как и в моем комментарии, я не могу гарантировать, что что-то будет нарисовано из того же атласа. Моя игра содержит персонализированные символы, с активами из ряда атласов (каждая из которых содержит ~ 100 текстур). Одновременно может отображаться до 9 символов. Я понимаю, что это не самая эффективная с точки зрения ничьей, но у меня никогда не было проблемы до iOS9...
Обновление 3
Я представил ошибку Apple, включая мою примерную программу. Я также воспользовался одним из моих запросов технической поддержки. Пока что ничего от Apple.