我正在写一个iOS应用程序使用金属。在MTKViewDelegate抽签过程中的某个时刻,我创建了一个渲染通道描述符,并且在屏幕上呈现的东西,iOS崩溃:MTLRenderPassDescriptor null后旋转
let encoder = commandBuffer.makeRenderCommandEncoder(descriptor: renderPassDescriptor)
encoder.setViewport(camera.viewport)
encoder.setScissorRect(camera.scissorRect)
在我的绘制函数的开始,我有一个信号,在金属游戏模板中找到相同的代码中发现在Xcode中,然后检查以确认视图没有改变大小。如果有,我重新创建我的缓冲区,
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)调用的...如果我在debug和mtkView中加入断点调试,似乎我手动同步并且不会崩溃。我有点失落......
完整的源代码是在这里:https://github.com/endavid/VidEngine
任何想法?