【问题标题】:Pixel Format Error with SceneKit + SpriteKit Overlay on iPhone XiPhone X 上 SceneKit + SpriteKit 叠加的像素格式错误
【发布时间】: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


【解决方案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://stackoverflow.com/questions/49988314/scnview-present-alternative

    【讨论】:

      猜你喜欢
      • 2017-03-12
      • 2012-02-24
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 2013-08-23
      • 1970-01-01
      相关资源
      最近更新 更多