当设备保持静止但被触摸时 Android 动画的性能下降

Performance drop of Android animation when device stays still but is touched

我的应用更改了每帧一些非常简单的视图(旋转、平移)的属性。根据 Android 性能文章的建议,我使用了 systrace 来检查我是否丢帧。

发生了一些真正出乎意料的事情。当设备静止不动时(即使我触摸了屏幕),CPU 使用率更高,出现 systrace 警报,GPU 渲染分析器的红色部分更长。当我快速旋转或摇动设备时,一切正常。

下面是结果的链接。 Shake 是我快速旋转设备的时候,no_shake 是它留在我桌子上的时候。

我制作了一个非常简单的测试应用程序,它使用单个翻译动画:source code

系统跟踪:no shake, shake

CPU用法:

GPU 分析器:

查看shake systrace,frame-rate是平滑的,为什么HW_VSYNC_0和HW_VSYNC_ON_0行没有数据?我如何读取 CPU 频率(我在捕获跟踪时确实启用了该选项)。

关于这个问题,我的理论是设备可能降低了 CPU 频率。我如何在 systrace 中读取它?我使用第 3 方应用程序来测试这个假设,它是正确的,如下所示。那么,我该怎么做才能避免这个问题呢?

为什么设备会这样做?起初我以为该设备使用加速度计数据来了解它是否未被使用,然后它降低了 CPU 频率。但是,为了增加 CPU 频率,我必须非常用力地摇动设备。像正常人一样拿着它不会增加CPU频率。

我知道有很多问题,但是在阅读了所有关于 Android 图形管道的相关文章后,我的想法就没有了。

问题发生在 Sony Xperia Z3 运行 Android 5.1 Nexus 5 上无法重现问题 运行 Android 6.

更新

看来性能问题是由CPU/GPU节流引起的。同样的设备,Xperia Z3,当 运行 Android 4.4 时,尽管它降低了时钟速度,但根据 Systrace,它的性能更好。另外,摇动时不会增加速度。

关于增加 CPU 速度所需的摇动手势,我注意到当我尝试将设备从纵向旋转到横向或反之时,然后触发 CPU 时钟增加(即使应用程序不改变方向)。所以,我认为 监视此手势的原因是为了加快可能的方向变化

使用一些 CPU 超频应用程序,例如 SetCPU(您需要 root)并将 CPU 的调速器设置为在闲置时不会对 CPU 降频的设置,例如性能。

也许您可以将最低 CPU 频率设置得高一点。

希望对您有所帮助。

一些观察...

移动设备,尤其是那些基于高通芯片的设备,积极降低 CPU 时钟以最大限度地降低功耗。有时他们的政策是 bit heavy-handed。他们还尝试将活动内核的数量减少到处理当前工作负载所需的数量。

查看 systrace 输出,就在 "CPU n" 行,您可以看到 "shake" 跟踪使所有四个内核都处于忙碌状态,而 "no shake" 跟踪通常使用 2 或 3 做。所以当你不摇动它时,系统上的负载会更轻。根据 CPU 调节器的调整方式,它可能会进行其他更改,例如时钟频率。

您可以通过将 "freq" 标记添加到 systrace 命令行来查看各种时钟值的变化。您可能需要获得 root 权限的设备才能获取此信息。它应该显示 CPU 时钟、GPU 带宽和其他神秘项目设置的更改。请注意,它仅报告 更改,因此您可能需要在录制开始后点击屏幕以鼓励它做一些事情。

我相信你知道这一点,但对于那些不知道的人:如果某件事需要 N CPU 个周期来执行,并且 CPU 在 100% 时是 运行速度,任务将在 T 秒内完成。如果 CPU 是 运行,速度为 50%,任务将在 2*T 秒内完成。衡量 CPU 利用率的工具通过确定 CPU 在给定时间段内 运行 与空闲时间的百分比来实现。如果工具观察 1 秒,任务运行 1 秒,则利用率为 100%。如果 CPU 时钟更高并且任务在 0.5 秒内完成,则利用率为 50%。较低时钟的优点是功耗是非线性的,因此当您以任何一种方式使用 N CPU 周期时,较低和较慢的配置消耗的电池较少。较低时钟的问题在于执行时间会更长,而且您的应用最终可能会丢帧。这就是触摸屏幕会提高时钟的原因:CPU 调控器知道您正在与设备交互,并配置系统以使交互尽可能顺畅。

你应该忽略 VSYNC 的东西。在某些设备上,SurfaceFlinger 使用异相软件生成的 VSYNC 信号(google "dispsync" 了解详细信息)。它使用来自显示刷新栅栏的反馈来决定它是否漂移,并会在必要时短暂地重新打开硬件 VSYNC 以重新同步。 (FWIW,有问题的行 do 在您发布的跟踪中有数据。)