UIKit 中的 while 循环应该在哪里渲染到 MTKView?

问题描述 投票:0回答:1

关于这个教程...

它描述了如何从视频文件加载帧并将它们一个接一个地绘制到 Metal 视图中。

有一个

while
循环迭代每个帧并在视图上调用
draw
...

while sampleBuffer != nil {
    
    ...

    displayView.draw()

    ...
}

这个循环应该去哪里?我在

viewDidLoad
中尝试过,经过一段延迟和大量打印输出后,它似乎只显示了最终帧。就好像在
viewDidLoad
完成之前您无法看到视图的更新。

uikit metal
1个回答
0
投票

我想我会把它放在

viewWillAppear(_:)
viewDidAppear(_:)
中。不过,这样的紧环还是第一次见,感觉不太理想。

如果您想手动控制绘图,我建议使用

CADisplayLink
CADisplayLink
的目的是定时与屏幕的系统更新同步。您还可以设置首选帧速率,这很好。

weak var displayLink: CADisplayLink?

func createDisplayLink() {
    displayLink?.invalidate() // in case existing timer
    let displayLink = CADisplayLink(target: self, selector: #selector(update(_:)))
    displayLink.add(to: .main, forMode: .common) 
    displayLink.preferredFramesPerSecond = 30 // Optional set desired frame rate 
    self.displayLink = displayLink
}

@objc func update(_ displayLink: CADisplayLink) {
    displayView.draw()
}

func viewWillAppear(_ animated: Bool) {
    // You can create it earlier, but I prefer here 
    createDisplayLink() 
}

func viewWillDisappear(_ animated: Bool) {
    // Stop rending when view disappears
    displayLink?.invalidate()
}
© www.soinside.com 2019 - 2024. All rights reserved.