Ошибка формата пикселей с наложением SceneKit + SpriteKit на iPhone X

У меня неприятная проблема с приложением SceneKit при запуске на iPhone X (iOS 11.1.2) с помощью средства визуализации Metal. В приложении для ключа plist SCNDisableLinearSpaceRendering установлено значение YES, чтобы получить такую ​​же цветопередачу в iOS 9 и более поздних версиях. Он также имеет наложение SpriteKit 2D, добавленное через overlaySKScene.

В релизных сборках iPhone X показывает странные цвета в наложении, но не в 3D-сцене. Сбой отладочных сборок с журналом ошибок:

- [MTLDebugRenderCommandEncoder validateFramebufferWithRenderPipelineState:]: 1196: неудачное утверждение `Для прикрепления цвета 0 пиксельный формат конвейера рендеринга (MTLPixelFormatRGBA8Unorm_sRGB) не соответствует pixelFormat_Format (MTLPix) фреймбуфера.

Насколько я понимаю, формат пикселей 2D и 3D сцен различен. Я понятия не имею, как я могу это изменить. Какие-либо предложения?

Ошибка будет отображаться только на iPhone X, а не на симуляторе или любом другом устройстве, которое я тестировал (4s, 5s, 6 Plus, 6s, 7, iPad Pro 1G). Когда я использую рендерер OpenGL ES, все в порядке. Когда я выключаю SCNDisableLinearSpaceRendering, все работает и с Metal Renderer, но 3D-цветопередача, конечно, сильно отличается.

Если у вас iPhone X, вы можете воспроизвести это, создав новый проект из шаблона Game и добавив этот код в viewDidLoad ():

let overlaySize = CGSize(width: 100, height: 100)
let overlay = SKScene(size: overlaySize)
let sprite = SKSpriteNode(color: UIColor.blue, size: overlaySize)
overlay.addChild(sprite)
scnView.overlaySKScene = overlay

Мне также было бы очень интересно услышать, происходит ли это и на iPhone 8/8 Plus?


person Dorian Roy    schedule 27.11.2017    source источник
comment
вы видели stackoverflow.com/questions/39522086/   -  person Knight0fDragon    schedule 27.11.2017
comment
@ Knight0fDragon нашел обходной путь, но знаете ли вы о каких-либо недостатках? stackoverflow.com/questions/49246043/   -  person Crashalot    schedule 13.03.2018
comment
Отключение проверки API просто помогает вам с аварийными сборками отладки. Но изменение цвета все равно произойдет. Насколько я знаю, релизные сборки все равно не вылетят (я столкнулся с этой ошибкой, когда мое приложение уже работало).   -  person Dorian Roy    schedule 13.03.2018
comment
@DorianRoy Assert игнорируется при выпуске, поэтому проблема все еще существует, просто ошибка исчезнет   -  person Knight0fDragon    schedule 13.03.2018


Ответы (3)


Одно из возможных решений - отключить проверку Metal API (в меню «Редактировать схему> Параметры»).

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

person Crashalot    schedule 12.03.2018

Тем временем я видел, как люди сообщали о нескольких других проблемах SceneKit с iOS 11. Я считаю, что это ошибка в iOS 11. Я подал радар месяц назад, но проблема все еще существует в 11.2.5.

Мой текущий обходной путь - использовать средство визуализации OpenGL ES вместо Metal.

person Dorian Roy    schedule 24.01.2018
comment
Можно ли использовать OpenGL только для коротких анимаций в наложении SpriteKit и Metal для всего остального? Пытаюсь также обойти эту ошибку, но хотелось бы сохранить Metal, где это возможно. Как вы перешли на OpenGL? - person Crashalot; 13.03.2018
comment
1) Нет. Вы можете использовать только один рендерер за раз. - person Dorian Roy; 13.03.2018
comment
2) Вы выбираете средство визуализации в свойстве RenderAPI вашего SCNView. - person Dorian Roy; 13.03.2018
comment
Я читал, что если вы не вызовете presentScene и вместо этого вручную назначите переменную сцены для представления, эта проблема исчезнет. Кто-нибудь может это проверить? - person Knight0fDragon; 13.03.2018
comment
@ Knight0fDragon не уверен, как это произошло, но мы перенесли весь код в новый проект набора сцен, и код волшебным образом начал работать ... переменная сцены, чего бы это ни стоило, всегда назначалась вручную. - person Crashalot; 13.03.2018
comment
@Crashalot тогда, возможно, они исправили проблему с новым проектом - person Knight0fDragon; 13.03.2018
comment
@ Knight0fDragon, как это исправить на уровне проекта? Спасибо за быстрый ответ! - person Crashalot; 13.03.2018
comment
Поскольку в настройках используется правильное цветовое пространство для spritekit и scenekit - person Knight0fDragon; 13.03.2018

Попробуйте установить для SCNDisableWideGamut значение YES в файле Info.plist приложения. Меня устраивает. (кредит http://stackoverflow.com/questions/49988314/scnview-present-alternative)

person babibo    schedule 26.09.2018