一直以来 iOS 的触摸输入操作的延迟都为人诟病,如果你常用绘图应用,你应该也有过类似的体验: 当你在屏幕上描绘线条,如果速度较快,那么线条就总是在手指触摸位置的后面一段距离追赶。在 iOS 9 中苹果针对这一问题做了改善,从手势的获取,到屏幕的显示,各个环节都做了性能优化来减少时间延迟。

关于其他 iOS 9 的特性与功能,有兴趣的朋友可以参考我博客中的 iOS 9 适配系列

Low Latency 低延迟

对于低延迟的使用,苹果提供了这样的代码:

// For lowest latency (default):
layer.presentsWithTransaction = false;

// For synchronizing with CA:
layer.presentsWithTransaction = true

也就是说,如果用 OpenGL ES 渲染,将 CAEAGLLayerpresentsWithTransaction 属性设值为 false 即可降低延迟,当然你也可以不设置,因为 false 是它的默认值;如果用 Metal 渲染则只需将 MTKViewpresentsWithTransaction 属性设值为 false;如果你不知道我在说什么,请关闭浏览器。

除了 Core Animation 性能的增强外,苹果还引入 Touch Coalescing 和 Touch Prediction 来提升显示效果。

Touch Coalescing 触控合并

在 iOS 9 之前,应用触摸扫描频率、渲染帧率、应用代码扫描频率均为 60Hz,而在 iPad Air 2 中,点扫描(Touch Scan)触摸扫描频率为 120Hz,也就是说有 iPad Air 2 中一半的点被丢弃了。而通过 Touch Coalescing,即可将没被直接响应的点合并到响应的触摸事件中。

for touch in touches {
  let line = lineForTouch(touch)
  for coalescedTouch in event.coalescedTouchesForTouch(touch) {
       addTouchSample(coalescedTouch, toLine: line)
  }
}

Touch Prediction 触控预测

Touch Prediction 的功能正如它的名字,也即预测后续触摸点的大致走向。

for touch in touches {
	let line = lineForTouch(touch)
	for predictedTouch in event.predictedTouchesForTouch(touch) {
	   addTouchSample(predictedTouch, toLine: line)
	}
}