iPhone X 上 SceneKit + SpriteKit 叠加的像素格式错误

Posted

技术标签:

【中文标题】iPhone X 上 SceneKit + SpriteKit 叠加的像素格式错误【英文标题】:Pixel Format Error with SceneKit + SpriteKit Overlay on iPhone X 【发布时间】:2018-05-11 02:28:28 【问题描述】:

在使用 Metal 渲染器在 iPhone X (ios 11.1.2) 上运行 SceneKit 应用程序时,我遇到了一个令人讨厌的问题。该应用程序将 plist 键 SCNDisableLinearSpaceRendering 设置为 YES,以便在 iOS 9 和更高版本上获得相同的颜色渲染。它还通过overlaySKScene 添加了一个 SpriteKit 2D 叠加层。

在发布版本中,iPhone X 在叠加层中显示奇怪的颜色,但在 3D 场景中没有。调试构建崩溃并显示错误日志:

-[MTLDebugRenderCommandEncoder validateFramebufferWithRenderPipelineState:]:1196: 断言失败`对于颜色附件 0,渲染管道的像素格式 (MTLPixelFormatRGBA8Unorm_sRGB) 与帧缓冲区的像素格式 (MTLPixelFormatBGR10_XR) 不匹配。'

我的理解是 2D 和 3D 场景的像素格式不同。我不知道我该如何改变它。有什么建议吗?

该错误只会显示在 iPhone X 上,而不是模拟器或我测试过的任何其他设备(4s、5s、6 Plus、6s、7、iPad Pro 1G)上。当我使用 OpenGL ES 渲染器时,一切都很好。当我关闭 SCNDisableLinearSpaceRendering 时,一切都适用于 Metal 渲染器,但 3D 色彩渲染当然有很大不同。

如果您有 iPhone X,您可以通过从游戏模板创建一个新项目并将此代码添加到 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 上?

【问题讨论】:

你看到***.com/questions/39522086/… @Knight0fDragon 找到了一种解决方法,但您知道有什么缺点吗? ***.com/questions/49246043/… 禁用 API 验证只会帮助您处理崩溃的调试版本。但是颜色偏移仍然会发生。据我所知,发布版本无论如何都不会崩溃(当我的应用程序已经上线时,我遇到了这个错误)。 @DorianRoy Assert 在发布时被忽略,所以问题应该仍然存在,只是错误消失了 【参考方案1】:

一种有效的解决方法是禁用 Metal API 验证(在 Edit Scheme > Options 中)。

不确定有什么缺点,但至少应用不会因此崩溃。

【讨论】:

【参考方案2】:

与此同时,我看到有人报告 iOS 11 的其他几个 SceneKit 问题。所以我认为这是 iOS 11 中的一个错误。我在一个月前提交了一个雷达,但问题在 11.2.5 中仍然存在。

我目前的解决方法是使用 OpenGL ES 渲染器而不是 Metal。

【讨论】:

是否可以将 OpenGL 用于 SpriteKit 叠加层中的一些简短动画,而将 Metal 用于其他所有内容?也尝试解决此错误,但希望尽可能保留 Metal。您是如何切换到 OpenGL 的? 1) 不可以。一次只能使用一个渲染器 2) 您在 SCNView 的 renderingAPI 属性中选择渲染器 我已经读到,如果您不调用 presentScene 而是手动将场景变量分配给该问题消失的视图。有人可以验证吗? @Knight0fDragon 不知道这是怎么发生的,但是我们将所有代码放到了一个新的场景包项目中,代码神奇地开始工作......场景变量,不管它的价值是什么,都是并且总是手动的已分配。【参考方案3】:

尝试在应用程序的 Info.plist 文件中将 SCNDisableWideGamut 设置为 YES。这个对我有用。 (感谢http://***.com/questions/49988314/scnview-present-alternative)

【讨论】:

以上是关于iPhone X 上 SceneKit + SpriteKit 叠加的像素格式错误的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 SceneKit 中的 SpriteKit 覆盖拉伸?

SceneKit 中的低帧率

Swift SceneKit 也不是圆形球体

SceneKit中的相机旋转

有没有办法链接 SceneKit 动画?

SceneKit - 获取相机的方向