在UIKit中循环时,这应该在哪里渲染到MTKView?

Where should this render to MTKView while loop go in UIKit?

提问人:Ian Warburton 提问时间:10/29/2023 更新时间:11/2/2023 访问量:80

问:

关于教程...

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

有一个循环遍历每一帧并调用视图...whiledraw

while sampleBuffer != nil {
    
    ...

    displayView.draw()

    ...
}

这个循环应该去哪里?我已经尝试过了,经过一段时间的延迟和大量的打印输出,它似乎只显示最后一帧。就好像在完成之前看不到视图的更新一样。viewDidLoadviewDidLoad

UIKIT 金属

评论

1赞 DonMag 10/30/2023
正确。。。在完成之前,您看不到任何内容。我不知道结果应该是什么(我还没有完成链接的教程),但您可以尝试将其放入或在按钮点击上运行它,例如。viewDidLoadviewDidAppear()

答:

1赞 Jeshua Lacock 10/31/2023 #1

我想我会把它放进去或.然而,这是我第一次在这样的超紧密循环中看到绘制命令,而且似乎不太理想。viewWillAppear(_:)viewDidAppear(_:)

如果您想手动控制抽奖,我建议您改用。其目的是定时与屏幕的系统更新同步。您还可以设置首选帧速率,这很好。CADisplayLinkCADisplayLink

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()
}

评论

0赞 Ian Warburton 11/19/2023
对不起,我的错。这是一个副业。我让它工作,将循环复制到.我需要制作 和 类属性。现在我有低级视频。棒。感谢您的帮助。update(_ displayLink: CADisplayLink)sampleBuffertrackOutputreader