device.makeCommandQueue () выдает фатальную ошибку: неожиданно найден ноль при развертывании необязательного значения - PullRequest
0 голосов
/ 07 апреля 2019

Эта строка

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 голосов
/ 08 апреля 2019

Судя по оставленным комментариям, вы пытаетесь запустить приложение iOS, которое использует Metal на macOS, с помощью симулятора iOS.

К сожалению, даже несмотря на то, что Metal поддерживается в macOS, на нем запущен Metal под симулятор iOS. не поддерживается.

А так как Metal не поддерживается, MTLCreateSystemDefaultDevice возвращает nil, что приводит к указанной вами ошибке.

Если вы хотите, чтобы ваш код выполнялся как на MacOS, так и на iOS,вам нужно написать приложение, чтобы оно было кроссплатформенным.Если это приложение, которое просто отображает материал на экране, без тонны пользовательского интерфейса, как игра, это должно быть довольно просто, поскольку Xcode предоставляет шаблон для кроссплатформенного проекта, использующего Metal.

...