2016-11-05 122 views
0

我正在写一个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

任何想法?

回答

0

异常消息是提示。编码器空了,我分心了。我猜它会在抛出异常后变为空,但问题不在编码器中。

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

我已经添加到里面mtkView(全相机更新的调用),现在崩溃消失了:)

0

我可以解决这个问题,该计划enter image description here

取消选中“调试可执行”