Переменная Metal Device (MTLDevice) становится нулевой после инициализации - PullRequest
0 голосов
/ 25 сентября 2019

В моем проекте Metal Swift (iOS / MacOS) есть класс визуализации, который представляет собой MTKViewDelegate.Я извлекаю MTLDevice с помощью MTLCreateSystemDefaultDevice (), однако после init он становится равным nil?Интересно, я пропустил причуду Свифта или Металла здесь.Примерно так выглядит код:

class Renderer: NSObject, MTKViewDelegate {

    var device: MTLDevice!
​
    init(metalView: MTKView) {
        guard let device = MTLCreateSystemDefaultDevice() else
        {
            fatalError("GPU not available")
        }
​        metalView.device = device
        if device != nil {
            print (“device not nil”)
        }
    }
​
    func draw(in view: MTKView) {
        if device == nil {
            print (“device is nil here”)
        }
    }
}

В моем ViewController я делаю

guard let metalView = view as? MTKView else {
   fatalError("Metal View not setup")
}
renderer = Renderer(metalView: metalView)

То, что я вижу, происходит:

device not nil
device is nil here
device is nil here
device is nil here
device is nil here

с частотой 60 Гц на каждомвызов вызова

РЕДАКТИРОВАТЬ: отредактированный код, чтобы прояснить, что устройство фактически назначается переменной в глобальной области видимости (metalView).

1 Ответ

1 голос
/ 25 сентября 2019

Согласно вашему коду, вы не назначаете локальное устройство для неявно развернутой глобальной переменной устройства.Для устранения проблемы назначьте локальное устройство глобальному.

guard let device = MTLCreateSystemDefaultDevice() else
        {
            fatalError("GPU not available")
        }
self.device = device
...