使用Swift中的NSRectFill推送像素时的性能问题

时间:2015-01-02 01:39:51

标签: cocoa swift swift-playground

这是一个Swift游乐场,展示了Lorenz Attractor的图像。我有三个问题。如果只有第一个问题得到解答,我会考虑回答这个问题。

  1. 开始时并不是那么快,但是在大约8000-9000次迭代之后,它变得极其缓慢。有什么想法吗?
  2. 为什么drawRect被调用两次?
  3. 是否有推荐的方法来获得良好的像素推送性能?
  4. // 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)))
    

    The Lorenz Attractor and the output of the code.

1 个答案:

答案 0 :(得分:0)

问题是游乐场很糟糕。这是一个技术编程术语,所以我要求我的奖品!

说真的,我把你的代码作为一个真实的应用程序运行,并在调用lorentzAttractor()之前和之后记录时间,并得到了这个:

1420165414.02522
1420165414.03103

所以整个事情按照100秒的顺序运行。不可怕。 (编辑:我后来做了一些后续测试,在更加可控的情况下,我们在发布时没有这样做,并且时间稍微好一些,持续约0.013秒。)

回到我的真实观点:不要将操场用于任何东西。他们是魔鬼的工作。当然不是为了测试任何东西的性能。游乐场与现实无关。