【发布时间】: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 上?
【问题讨论】:
-
@Knight0fDragon 找到了一种解决方法,但您知道有什么缺点吗? stackoverflow.com/questions/49246043/…
-
禁用 API 验证只会帮助您处理崩溃的调试版本。但是颜色偏移仍然会发生。据我所知,发布版本无论如何都不会崩溃(当我的应用程序已经上线时,我遇到了这个错误)。
-
@DorianRoy Assert 在发布时被忽略,所以问题应该仍然存在,只是错误消失了
标签: ios sprite-kit scenekit metal iphone-x