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

Pixel Format Error with SceneKit + SpriteKit Overlay on iPhone X

当 运行 在 iPhone X (iOS 11.1.2) 上使用 Metal 渲染器时,我遇到了一个严重的 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 上?

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

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

一个有效的解决方法是禁用 Metal API 验证(在“编辑方案”>“选项”中)。

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

尝试在应用程序的 Info.plist 文件中将 SCNDisableWideGamut 设置为 YES。这个对我有用。 (归功于 )