在 NSView 上创建简单的动画循环
Creating simple animation loop on NSView
我尝试编写与 canvas 动画相关的简单内容。我的目标是在 NSView 上手动创建一些动画(例如连续旋转矩形,不允许核心动画框架在状态之间转换)。
我的做法是:
- 获取当前
CGContext
- 清除上下文并根据时间绘制一些旋转角度的路径
- 安排计时器强制 NSView 重绘(通过每 1/30 秒调用
.display()
问题是我不太确定这是正确的方法,因为它会在 CPU 上产生过多的开销。请问有没有其他正确的方法可以达到同样的效果?
找到了一些关于 needsDisplay
和 setNeedsDisplay
的信息来安排 draw
调用但是当我这样调用它时它不起作用 "tick" 消息只打印一次并且这意味着 draw
函数只被调用一次
class GraphView: NSView {
...
override func draw(_ dirtyRect: NSRect) {
print("tick")
super.draw(dirtyRect)
let ctx = NSGraphicsContext.current?.cgContext
self.drawdrawPrimitive(context: ctx!)
// tried both but none of them works
self.needsDisplay = true
self.setNeedsDisplay(dirtyRect)
}
}
找到解决方案:Apple 的 SpriteKit 处理所有更新并完全满足我的需要
我尝试编写与 canvas 动画相关的简单内容。我的目标是在 NSView 上手动创建一些动画(例如连续旋转矩形,不允许核心动画框架在状态之间转换)。
我的做法是:
- 获取当前
CGContext
- 清除上下文并根据时间绘制一些旋转角度的路径
- 安排计时器强制 NSView 重绘(通过每 1/30 秒调用
.display()
问题是我不太确定这是正确的方法,因为它会在 CPU 上产生过多的开销。请问有没有其他正确的方法可以达到同样的效果?
找到了一些关于 needsDisplay
和 setNeedsDisplay
的信息来安排 draw
调用但是当我这样调用它时它不起作用 "tick" 消息只打印一次并且这意味着 draw
函数只被调用一次
class GraphView: NSView {
...
override func draw(_ dirtyRect: NSRect) {
print("tick")
super.draw(dirtyRect)
let ctx = NSGraphicsContext.current?.cgContext
self.drawdrawPrimitive(context: ctx!)
// tried both but none of them works
self.needsDisplay = true
self.setNeedsDisplay(dirtyRect)
}
}
找到解决方案:Apple 的 SpriteKit 处理所有更新并完全满足我的需要