我正在寫一個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
任何想法?