iOS 崩溃:旋转后 MTLRenderPassDescriptor 为空
iOS crash: MTLRenderPassDescriptor null after rotation
我正在使用 Metal 编写 iOS 应用程序。在 MTKViewDelegate 绘制期间的某个时刻,我创建了一个渲染过程描述符并在屏幕上渲染东西,
let encoder = commandBuffer.makeRenderCommandEncoder(descriptor: renderPassDescriptor)
encoder.setViewport(camera.viewport)
encoder.setScissorRect(camera.scissorRect)
在绘制函数的开头,我有一个信号量,与 Xcode 中的 Metal 游戏模板中的代码相同,然后检查以验证视图大小没有改变。如果有,我会重新创建缓冲区,
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'
必须发生异常,因为我正在更新 "camera" inside mtkView,
func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {
camera.setBounds(view.bounds)
}
当我 运行 没有附加调试器时,它不会崩溃。
我想 mtkView 是异步调用的,我应该在调用 mtkView 时做一些事情来停止渲染,但是互斥量应该在库中,而不是在我的代码中?虽然 draw 和 mtkView 都是从同一个线程(调试器中的线程 1)调用的......如果我逐步调试在 draw 和 mtkView 中放置断点,似乎我手动同步并且它不会崩溃。我有点迷路...
完整的源代码在这里:https://github.com/endavid/VidEngine
有什么想法吗?
异常消息是提示。我因编码器为空而分心。我想一旦抛出异常它就会变成 null,但问题不在编码器中。
camera.setBounds(view.bounds) 中的代码没有更新 scissorRect...
我有一个 CADisplayLink 以不同的速率更新 CPU 对象,当 scissorRect 检测到变化时正在那里更新。
我在 mtkView() 中添加了对完整相机更新的调用,现在崩溃消失了:)
我可以解决这个问题,在 Scheme
中取消选中 "Debug executable"
我正在使用 Metal 编写 iOS 应用程序。在 MTKViewDelegate 绘制期间的某个时刻,我创建了一个渲染过程描述符并在屏幕上渲染东西,
let encoder = commandBuffer.makeRenderCommandEncoder(descriptor: renderPassDescriptor)
encoder.setViewport(camera.viewport)
encoder.setScissorRect(camera.scissorRect)
在绘制函数的开头,我有一个信号量,与 Xcode 中的 Metal 游戏模板中的代码相同,然后检查以验证视图大小没有改变。如果有,我会重新创建缓冲区,
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'
必须发生异常,因为我正在更新 "camera" inside mtkView,
func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {
camera.setBounds(view.bounds)
}
当我 运行 没有附加调试器时,它不会崩溃。 我想 mtkView 是异步调用的,我应该在调用 mtkView 时做一些事情来停止渲染,但是互斥量应该在库中,而不是在我的代码中?虽然 draw 和 mtkView 都是从同一个线程(调试器中的线程 1)调用的......如果我逐步调试在 draw 和 mtkView 中放置断点,似乎我手动同步并且它不会崩溃。我有点迷路...
完整的源代码在这里:https://github.com/endavid/VidEngine
有什么想法吗?
异常消息是提示。我因编码器为空而分心。我想一旦抛出异常它就会变成 null,但问题不在编码器中。
camera.setBounds(view.bounds) 中的代码没有更新 scissorRect... 我有一个 CADisplayLink 以不同的速率更新 CPU 对象,当 scissorRect 检测到变化时正在那里更新。
我在 mtkView() 中添加了对完整相机更新的调用,现在崩溃消失了:)
我可以解决这个问题,在 Scheme