Почему Metal не рендерит мой простой и понятный код окна? - PullRequest
0 голосов
/ 21 марта 2019

Я следовал этому учебнику.Я скачал источник и попытался «перевести» его на Swift.Это мой «переведенный» код:

import Cocoa
import AppKit
import MetalKit

import simd


class MetalViewController: NSViewController {

    @IBOutlet var inview: MTKView!
    override func viewDidLoad() {
        super.viewDidLoad()
        let _view: MTKView = self.inview
        _view.device = MTLCreateSystemDefaultDevice()
        let _renderer: Renderer=initView(view: _view)
        _view.delegate=_renderer as? MTKViewDelegate
        _view.preferredFramesPerSecond=60
    }
}
class Renderer: NSObject {
    init(device: MTLDevice){
        self._device=device
        self._commandQueue=_device.makeCommandQueue()!
        super.init()
    }
    func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {

    }
    func draw(in view: MTKView) {
        let color = Color(red: 1.0,green: 0.0,blue: 0.0,alpha: 0.0)
        view.clearColor = MTLClearColorMake(color.red, color.green, color.blue, color.alpha)
        let commandbuffer = _commandQueue.makeCommandBuffer()
        let renderpassdescriptor: MTLRenderPassDescriptor = view.currentRenderPassDescriptor!
        let renderencoder: MTLRenderCommandEncoder = (commandbuffer?.makeRenderCommandEncoder(descriptor: renderpassdescriptor))!
        renderencoder.endEncoding()
        commandbuffer!.present(view.currentDrawable!)
        commandbuffer!.commit()
    }

    var _device: MTLDevice
    var _commandQueue: MTLCommandQueue

}

struct Color{
    var red, green, blue, alpha: Double
}

func initView(view: MTKView) -> Renderer{
    var renderer: Renderer
    renderer=Renderer(device: view.device!)
    return renderer
}

Поэтому я поместил AAPLRenderer и AAPLViewControllers в один файл и сделал так, чтобы не было заголовочных файлов.Я связал представление с @IBOutlet с контроллером представления, потому что представление было NSView, и я не могу привести его к MTKView без получения ошибки времени компиляции.AppDelegate является оригинальным, и у меня нет основного файла.

В итоге я получаю окно, которое не показывает красный цвет, а скорее ничего не показывает.Я не понимаю, почему это происходит.Пожалуйста, помогите мне, спасибо.

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Я вижу две проблемы.

1) Свойство MTKView *1003* имеет значение weak var, что означает, что если вы не держите экземпляр вашего средства визуализации, оно будетбыть незамедлительным и никогда не получать ответные вызовы делегатов.Сохраняйте ссылку на ваш рендерер как свойство на вашем контроллере представления.

class MetalViewController: NSViewController {
    @IBOutlet var inview: MTKView!
    var renderer: Renderer!

    override func viewDidLoad() {
        // ...
        let view: MTKView = self.inview
        // ...
        renderer = initView(view: view)
        view.delegate = renderer
        // ...
    }
}

2) Поскольку класс Renderer явно не декларирует соответствие протоколу MTKViewDelegate, условное приведение при его назначениикак делегат представления терпит неудачу.Сделайте так, чтобы Renderer явно соответствовал протоколу, и удалите условное приведение, как показано выше.

class Renderer: NSObject, MTKViewDelegate
0 голосов
/ 21 марта 2019

Ну, это может быть что угодно. Но первое, что я хотел бы проверить, это то, что ваши настройки альфа для этого красного цвета должны иметь альфа = 1,0, а не альфа = 0,0.

...