Swift 每秒重新绘制NSView 60次的最佳方法?

Swift 每秒重新绘制NSView 60次的最佳方法?,swift,xcode,macos,core-graphics,nsview,Swift,Xcode,Macos,Core Graphics,Nsview,我的OSX应用程序中有一个视图,我需要每秒完全重画(理想情况下)60次。我目前正在使用NSView绘图功能中的核心图形进行绘图,如下所示: override func draw(_ dirtyRect: NSRect) { super.draw(dirtyRect) // Drawing code here. let context = NSGraphicsContext.current!.cgContext // Core Graphics drawing c

我的OSX应用程序中有一个视图,我需要每秒完全重画(理想情况下)60次。我目前正在使用NSView绘图功能中的核心图形进行绘图,如下所示:

override func draw(_ dirtyRect: NSRect) {
    super.draw(dirtyRect)

    // Drawing code here.
    let context = NSGraphicsContext.current!.cgContext
    // Core Graphics drawing calls using context
}
然后,在视图控制器ViewDidDisplay()中,我安排了一个计时器,强制视图每秒重画(大约)60次,这在工作时肯定是达到预期效果的糟糕方法

//ViewController.swift
override func viewDidAppear() {
    let timer = Timer.scheduledTimer(timeInterval: 0.016, target: self, selector: #selector(redrawView), userInfo: nil, repeats: true)

    super.viewDidAppear()
}

@objc func redrawView() {
    let v = view as! View
    v.redraw()
}

//View.swift
class View: NSView {
    func redraw() {
        DispatchQueue.main.async {
            self.setNeedsDisplay(self.frame) //this is because drawing calls apparently need to be in the main thread
        }
    }
有没有更好的方法(我肯定有)?从我(明显缺乏)对NSView及其绘图模型的了解来看,NSView似乎不是在不断重画的情况下制作的

我并不特别喜欢使用NSView,但我非常喜欢使用核心图形(金属不是一个选项,因为我已经在GPU上大量使用它)


非常感谢您的建议

只有当某些内容发生了需要重新绘制的更改时,才应该重新绘制,即使如此,如果您真的试图优化性能,也只需要重新绘制已更改的rect(“脏”rect)。每秒重画60次只是“为了它”有点。。。毫无意义。谢谢你的提示!最后,我的想法是,只有在发生变化时才重新绘制。只是在这种特殊情况下,每60秒就发生一次更改比不发生更改更为常见(即,每秒需要重新绘制60次是很常见的),因此我希望以最有效的方式“与显示刷新同步”进行此操作。此外,我也意识到只重新绘制“脏”矩形是一条路,并且总是尽可能地这样做。在这种情况下,脏rect总是整个视图。您应该检查一下,谢谢!我觉得CADisplayLink可能正是我所需要的,但还没有深入研究它。我会的!