background image
当流畅度越小的时候说明当前程序越卡顿。
如何得到流畅度(SM: SMoothness)
接着上面的结论,如果在这样的机制下每次 Loop 运行之前进行通知,记个数就
好了。
很 幸 运 我 们 在 新 的 Android 的 那 一 套 机 制 中 找 到 了 一 个 画 图 的 打 杂 工
Choreographer 这个对象。根据 Google 的官方 API 文档描述中,它是用来协调
animations、input 以及 drawing 时序的,并且每个 Loop 共用一个 Choreographer
对象。
结论
通过如上原理分析可以得出结论:
1) Android 4.1 引入了 VSync 机制后,可以通过其 Loop 来了解当前 App 最高绘制
能力。
固定每隔 16.6ms 执行一次(这个值是一个静态变量,会根据系统版本不同而采用
不同的值,
目前测试版本是 16.6ms 这样最高的刷新的帧率就控制在 60FPS 以内);
如果没有以上事件的时候同样也会运行这样一个 Loop;
这个 Loop 在 1s 之内运行了多少次,即可以表示当前 App 绘制的最高的能力,也
就是 Android App 卡顿的程度;
另外,在一次 Loop 时如果执行时间超过了 16.6ms,那么用多于 16.6ms 的时间
除以 16.6ms,即是当前 App 的丢帧(SF: Skipped Frame)。
2) 可以在 Choreographer 的回调 FrameCallback 中,按秒计数表示当前 App 的流
畅程度,即流畅度 SM(SMoothness)。
采用这样方式就可以在 App 内部观测当前 App 的流畅度了。并且在丢帧的地方
打印 traceView,就可以知道丢帧的大概原因,大概位置。定位代码问题。
TestBird