在 Swift 中使用 NSRectFill 推送像素时出现性能问题
Performance problems while pushing pixels with NSRectFill in Swift
这是一个 Swift 游乐场,显示了洛伦兹吸引子的图像。我有三个问题。如果只有第一个问题得到回答,我会认为这个问题得到回答。
- 一开始并没有那么快,但在大约 8000-9000 次迭代之后,它变得非常慢。有什么想法吗?
- 为什么 drawRect 被调用了两次?
- 是否有任何推荐的方法来实现良好的像素推送性能?
// Change platform to OS X when opening Playground.
// alt + cmd + enter to show Assistant editor and see resulting image.
import Cocoa
import XCPlayground
let width = 600.0, height = 500.0
class CustomView: NSView {
override init(frame: NSRect) {
super.init(frame: frame)
}
required init?(coder: NSCoder) {
super.init(coder: coder);
}
override func drawRect(dirtyRect: NSRect) {
lorentzAttractor()
}
func lorentzAttractor() {
var x = 0.1 , y = 0.0, z = 0.0, t = 0.0
for i in 1...4242 {
let x1 = x + 0.01 * 10 * (y - x)
let y1 = y + 0.01 * (x * (28 - z) - y)
let z1 = z + 0.01 * (x * y - 2.66 * z)
x = x1
y = y1
z = z1
let phys_x = width / 2 + 12 * x
let phys_y = 25 + 8 * z
NSRectFill(NSMakeRect(CGFloat(phys_x), CGFloat(phys_y), 1, 1))
}
}
}
XCPShowView("Lorenz Attractor", CustomView(frame:
NSRect(x: 0, y: 0, width: width, height: height)))
问题是游乐场很烂。这是一个技术编程术语,所以我要领奖!
说真的,我 运行 你的代码作为一个实际的应用程序,并在调用 lorentzAttractor()
之前和之后记录时间,得到这个:
1420165414.02522
1420165414.03103
所以整个过程 运行 大约是百分之一秒。不可怕。 (编辑:我后来做了一些后续测试,在更受控的条件下,我们在发布时没有这样做,并且得到了稍微好一点的时间,始终约为 0.013 秒。)
回到我的真实观点:不要将游乐场用于任何事情。他们是魔鬼的杰作。当然不是为了测试任何东西的性能。游乐场与现实没有任何关系。
这是一个 Swift 游乐场,显示了洛伦兹吸引子的图像。我有三个问题。如果只有第一个问题得到回答,我会认为这个问题得到回答。
- 一开始并没有那么快,但在大约 8000-9000 次迭代之后,它变得非常慢。有什么想法吗?
- 为什么 drawRect 被调用了两次?
- 是否有任何推荐的方法来实现良好的像素推送性能?
// Change platform to OS X when opening Playground.
// alt + cmd + enter to show Assistant editor and see resulting image.
import Cocoa
import XCPlayground
let width = 600.0, height = 500.0
class CustomView: NSView {
override init(frame: NSRect) {
super.init(frame: frame)
}
required init?(coder: NSCoder) {
super.init(coder: coder);
}
override func drawRect(dirtyRect: NSRect) {
lorentzAttractor()
}
func lorentzAttractor() {
var x = 0.1 , y = 0.0, z = 0.0, t = 0.0
for i in 1...4242 {
let x1 = x + 0.01 * 10 * (y - x)
let y1 = y + 0.01 * (x * (28 - z) - y)
let z1 = z + 0.01 * (x * y - 2.66 * z)
x = x1
y = y1
z = z1
let phys_x = width / 2 + 12 * x
let phys_y = 25 + 8 * z
NSRectFill(NSMakeRect(CGFloat(phys_x), CGFloat(phys_y), 1, 1))
}
}
}
XCPShowView("Lorenz Attractor", CustomView(frame:
NSRect(x: 0, y: 0, width: width, height: height)))
问题是游乐场很烂。这是一个技术编程术语,所以我要领奖!
说真的,我 运行 你的代码作为一个实际的应用程序,并在调用 lorentzAttractor()
之前和之后记录时间,得到这个:
1420165414.02522
1420165414.03103
所以整个过程 运行 大约是百分之一秒。不可怕。 (编辑:我后来做了一些后续测试,在更受控的条件下,我们在发布时没有这样做,并且得到了稍微好一点的时间,始终约为 0.013 秒。)
回到我的真实观点:不要将游乐场用于任何事情。他们是魔鬼的杰作。当然不是为了测试任何东西的性能。游乐场与现实没有任何关系。