Android手写笔低延迟 - 3

464 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情

Android手写笔低延迟

利用低延迟图形和运动预测API创建自然的手写笔体验

续接上篇: Android手写笔低延迟 - 2

根据前面文章的阅读, 现在你知道了如何减少图形层的延迟, 让我们看看如何通过使用运动预测库减少感知的延迟来进一步提高响应性.

预测: 先人一步

运动预测库的目标是在渲染方面领先一步, 并通过基于数学预测驱动的卡尔曼滤波算法创建人工点, 进一步降低感知的延迟. 运动预测通过节省额外的几毫秒来改善用户体验, 并为墨水从手写笔中流出来的自然感觉做出贡献.

预测技术: 卡尔曼滤波算法

在不深入了解卡尔曼滤波算法如何工作的情况下, 重要的是要知道该算法是基于方向, 速度, 压力和时间来预测下一个点将在哪里.

该算法通过利用一组数据很少的方程, 并通过了解输入的变化和不确定性来进行非常快速的预测.

这种预测方法速度快, 内存效率高. 该算法被用来追踪飞机, 卫星, 以及现在Android上的手写笔运动. 其他预测技术可能会在不同的设备上使用, 这取决于OEM.

在Android平台预测动作

运动预测库将真实的用户输入作为MotionEvent对象. MotionEvent包含有关x和y坐标, 压力, 时间的信息......所有这些信息都被用来给运动预测器提供信息, 并预测下一个MotionEvent.

正如我们之前所看到的,触摸采样率在不同的设备上会有所不同. 触摸采样率越高, 提供给运动预测器的数据点就越快, 算法就能准确预测. 运动预测库能够检测采样率, 并利用它来更快地收集信息, 提高预测精度.

什么时候使用动作预测

运动预测库是基于MotionEvent的, 所以只要你在使用MotionEvent对象, 你就可以利用这个库了.

根据定义, 预测的运动事件是人为的, 不准确的. 使用预测的事件来减少感知的延迟, 但要确保预测的数据在收到后被替换成真实的数据.

运动预测库从安卓4.4(API级别19)及以上版本和运行安卓9及以上版本的ChromeOS设备都可以使用.

实现

运动事件预测器提供两个方法, record接收MotionEvent对象, predict返回MotionEvent.

/* Copyright 2022 Google LLC.	
   SPDX-License-Identifier: Apache-2.0 */
   
class InputView : View {
    
    // init motion predictor
    val motionEventPredicor: MotionEventPredicor = MotionEventPredictor.newInstance(this)

    setOnTouchListener
    {
        _, event ->
        // record MotionEvent
        motionEventPredictor.record(event)
    }

    // predict next MotionEvent
    val event = motionEventPredictor.predict()
    // then inject the motion event into your processing
}

更多细节请参见运动预测库文档.

与屏幕功能直接相关的性能

为了使触摸屏准确地记录指针输入, 系统必须经常检查屏幕的触摸情况. 触摸或手写笔采样率是系统检查屏幕的频率. 大多数屏幕的触摸采样率是屏幕刷新率的两倍. 例如, 在一个标准的60Hz的显示器上, 采样率将是120Hz. 换句话说, 屏幕会每隔8ms记录一次触摸输入.

手写笔的采样率甚至可以更高, 在ChromeOS上, 一些设备的手写笔采样率高达400Hz. 在这些屏幕上, 用户体验甚至更好, 因为屏幕的反应更灵敏.

总结

在这里, 我们探讨了两种方法, 以改善手写笔的体验, 并减少绘画, 素描或手写时的延迟. Jetpack低延迟图形库使应用程序能够更快地渲染. 此外, Jetpack运动预测库预测下一个MotionEvent, 以始终领先于渲染引擎一步.

结合起来, 这些创新的库可以帮助你实现一流的手写笔体验.

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情