2016-11-05 69 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

取消選中「調試可執行」