device.makeCommandQueue()给出致命错误:展开一个可选值时意外找到nil

时间:2019-04-07 15:24:10

标签: metal

此行

commandQueue = device.makeCommandQueue()  

给出运行时错误

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value 


import UIKit
import MetalKit

enum Colors{
    static let ClearColor = MTLClearColor(red: 0.0,
                                          green: 0.21,
                                          blue: 0.4,
                                          alpha: 1.0)
}

class ViewController: UIViewController {

    var metalView: MTKView{
        return view as! MTKView
    }

    var device: MTLDevice!
    var commandQueue: MTLCommandQueue!

    override func viewDidLoad() {
        super.viewDidLoad()
        metalView.device = MTLCreateSystemDefaultDevice()
        device = metalView.device

        metalView.clearColor = Colors.ClearColor

        commandQueue = device.makeCommandQueue()
        let commandBuffer = commandQueue.makeCommandBuffer()

        let commandEncoder =
          commandBuffer?.makeRenderCommandEncoder(descriptor: metalView.currentRenderPassDescriptor!)

        commandEncoder?.endEncoding()
        commandBuffer?.present(metalView.currentDrawable!)
        commandBuffer?.commit()
    }

}

1 个答案:

答案 0 :(得分:0)

从您留下的评论来看,您正在尝试使用iOS模拟器在macOS上运行使用Metal的iOS应用程序。

不幸的是,即使macOS支持Metal,但在iOS模拟器下运行Metal也不支持。

由于不支持Metal,因此MTLCreateSystemDefaultDevice返回nil,这将导致您提到的错误。

如果您希望代码同时在macOS和iOS上运行,则需要编写应用程序,使其跨平台。如果它是一个仅在屏幕上呈现内容的应用程序,而没有像游戏一样的大量UI,则它应该非常简单,因为Xcode为使用Metal的跨平台项目提供了模板。