最近我注意到滚动的性能在减慢。我追踪了问题,发现原因是使用由UIFont(descriptor:size:)构造器创建的字体。我将该构造器更改为UIFont(name:size:),问题得到了解决。
我在一个项目中隔离了这个问题。代码如下:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var firstLabel: UILabel!
@IBOutlet weak var secondLabel: UILabel!
@IBAction func onStartTest(sender: AnyObject) {
startMeasurement()
let firstFont = UIFont(name: "Marker Felt", size: 16)
firstLabel.font = firstFont
finishMeasurement("UIFont(name)")
startMeasurement()
let secondFontDescriptor = UIFontDescriptor(name: "Marker Felt", size: 16)
let secondFont = UIFont(descriptor: secondFontDescriptor, size: 16)
secondLabel.font = secondFont
finishMeasurement("UIFont(descriptor)")
}
}
private var time: UInt64 = 0
public func startMeasurement() {
time = mach_absolute_time()
}
public func finishMeasurement(name: String) {
let duration = mach_absolute_time() - time
print("* \(name) \(duration)ns")
}
这些是我的一些测量结果:
iPhone 4S - iOS 9.0.2
* UIFont(name) 111,300ns
* UIFont(descriptor) 112,420,263ns
iPhone 6S - iOS iOS 9.2
* UIFont(name) 134,247ns
* UIFont(descriptor) 17,047,707ns
Simulator - iOS 9.2
* UIFont(name) 1,971,106ns
* UIFont(descriptor) 485,208,205ns
Simulator - iOS 8.1
* UIFont(name) 9,946,584ns
* UIFont(descriptor) 1,957,802,431ns
我做错了什么吗?
UIFont(descriptor:size:)
的性能问题,而调用UIFont(name:size:)
的等效方法速度要快[125-200]倍。也许我使用UIFontDescriptor的方式不对。 - Alvivi