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

Pet*_*eas 8 android vsync surfaceflinger systrace

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

出乎意料的事情出现了.当设备静止不动时(即使我触摸屏幕)CPU使用率更高,systrace上的警报出现,GPU渲染分析器的红色部分更长.当我快速旋转或震动设备时,一切都很好.

以下是结果的链接.Shake是我快速旋转设备的no_shake时候,就是把它放在我的桌子上.

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

Systrace:没有动摇,摇晃

CPU使用率: 在此输入图像描述

GPU分析器: 在此输入图像描述

看一下帧速率平滑的shake systrace,为什么HW_VSYNC_0和HW_VSYNC_ON_0行没有数据?如何读取CPU频率(我在捕获跟踪时启用了该选项).

关于这个问题,我的理论是该设备可能会降低CPU频率.我怎么能在systrace中读到这个?我使用第三方应用来测试这个假设,如下所示.那么,我该怎么做才能避免这个问题呢?

在此输入图像描述

为什么设备会这样做?起初,我认为设备使用加速度计数据来了解它是否未被使用,然后降低了CPU频率.但是,为了增加CPU频率,我必须非常努力地摇动设备.像普通人一样握住它不会增加CPU频率.

我知道这是很多问题,但是在阅读了有关Android图形管道的所有相关文章之后,我的想法就出错了.

在运行Android 5.1的Sony Xperia Z3上出现此问题.运行Android 6的Nexus 5无法重现此问题.

更新

似乎性能问题是由CPU/GPU限制引起的.同样的设备,Xperia Z3,在运行Android 4.4时,即使它降低了时钟速度,它根据Systrace表现更好.此外,摇动时不会提高速度.

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

fad*_*den 4

一些观察...

移动设备,尤其是基于高通芯片的移动设备,会大幅降低 CPU 时钟以最大限度地降低功耗。有时他们的政策有点严厉。他们还尝试将活动核心的数量减少到处理当前工作负载所需的数量。

查看 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,有问题的行确实在您发布的跟踪中包含数据。