gpt4 book ai didi

iOS崩溃: MTLRenderPassDescriptor null after rotation

转载 作者:行者123 更新时间:2023-11-30 12:55:34 25 4
gpt4 key购买 nike

我正在使用 Metal 编写一个 iOS 应用程序。在 MTKViewDelegate 绘制期间的某个时刻,我创建一个渲染 channel 描述符并在屏幕上渲染内容,

let encoder = commandBuffer.makeRenderCommandEncoder(descriptor: renderPassDescriptor)
encoder.setViewport(camera.viewport)
encoder.setScissorRect(camera.scissorRect)

在我的绘制函数开始时,我有一个信号量,与 Xcode 中的 Metal 游戏模板中的代码相同,然后进行检查以验证 View 的大小没有更改。如果有,我重新创建缓冲区,

    let w = _gBuffer?.width ?? 0
let h = _gBuffer?.height ?? 0
if let metalLayer = view.layer as? CAMetalLayer {
let size = metalLayer.drawableSize
if w != Int(size.width) || h != Int(size.height ){
_gBuffer = GBuffer(device: device, size: size)
}
}

一切工作正常,旋转在我的 iPhone6 上工作正常。然而,当我尝试使用 iPad Pro 时,当我尝试旋转设备时,它总是会生成 SIGABRT。调试器告诉我编码器为空。我也在控制台中得到了这个异常,

MTLDebugRenderCommandEncoder.mm:2028: failed assertion `(rect.x(1024) + rect.width(1024))(2048) must be <= 1536'

必须发生异常,因为我正在 mtkView 内更新“相机”,

func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {
camera.setBounds(view.bounds)
}

当我在没有附加调试器的情况下运行时,它不会崩溃。我猜 mtkView 是异步调用的,我应该在调用 mtkView 时做一些事情来停止渲染,但是互斥锁应该在库中,而不是在我的代码中?虽然draw和mtkView都是从同一个线程(调试器中的线程1)调用的...如果我在draw和mtkView中设置断点进行单步调试,似乎我手动同步并且它不会崩溃。我有点迷失了...

完整的源代码在这里:https://github.com/endavid/VidEngine

有什么想法吗?

最佳答案

异常消息是提示。我因编码器为空而分心。我猜一旦抛出异常它就会变成空,但问题不在编码器中。

camera.setBounds(view.bounds) 中的代码没有更新 scissorRect...我有一个 CADisplayLink,它以不同的速率更新 CPU 对象,并且当检测到更改时,scissorRect 正在那里更新。

我在 mtkView() 内添加了对完整相机更新的调用,现在崩溃已经消失了:)

关于iOS崩溃: MTLRenderPassDescriptor null after rotation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40437089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com