关于这个教程...
它描述了如何从视频文件加载帧并将它们一个接一个地绘制到 Metal 视图中。
有一个
while
循环迭代每个帧并在视图上调用 draw
...
while sampleBuffer != nil {
...
displayView.draw()
...
}
这个循环应该去哪里?我在
viewDidLoad
中尝试过,经过一段延迟和大量打印输出后,它似乎只显示了最终帧。就好像在 viewDidLoad
完成之前您无法看到视图的更新。
我想我会把它放在
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()
}