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

时间:2017-11-27 18:54:16

标签: ios sprite-kit scenekit metal iphone-x

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

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

- [MTLDebugRenderCommandEncoder validateFramebufferWithRenderPipelineState:]:1196:断言失败`对于颜色附件0,渲染管道的pixelFormat(MTLPixelFormatRGBA8Unorm_sRGB)与帧缓冲区的pixelFormat(MTLPixelFormatBGR10_XR)不匹配。&# 39;

我理解这一点的方式是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上是否也会出现这种情况?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

尝试在应用程序的Info.plist文件中将docker-machine ssh default touch /var/acme.json chmod 600 /var/acme.json 设置为YES。这个对我有用。 (贷记http://stackoverflow.com/questions/49988314/scnview-present-alternative