当设备停留但被触动时,Androidanimation的性能下降

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

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

以下是结果的链接。 Shake是当我旋转设备真的很快,没有no_shake是当它坐在我的桌子上。

我做了一个非常简单的testing应用程序,使用一个单一的翻译animation: 源代码 。

Systrace: 不要 动摇

CPU使用率: 在这里输入图像说明

GPU分析器: 在这里输入图像说明

看看抖动系统,帧率是平滑的,为什么HW_VSYNC_0和HW_VSYNC_ON_0行没有数据? 我怎样才能读取CPU频率(我已经启用了捕获跟踪的选项)。

关于这个问题,我的理论是这个设备可能会降低CPU频率。 我怎样才能读systrace这个? 我使用第三方应用程序来testing这个假设,这是真实的,如下所示。 那么,我能做些什么来避免这个问题呢?

在这里输入图像说明

为什么设备在做这个? 起初,我认为设备使用加速计数据来了解它是否没有被使用,然后降低了CPU频率。 但是,为了增加CPU频率,我不得不撼动设备。 像正常人一样拿着它不会增加CPU频率。

我知道这是很多问题,但是阅读了所有关于Androidgraphicspipe道的相关文章,我没有想法。

发生在运行Android 5.1的索尼Xperia Z3上的问题在运行Android 6的Nexus 5上,问题无法再现。

更新

性能问题似乎是由CPU / GPU限制引起的。 同样的设备,Xperia Z3在运行Android 4.4时,即使降低了时钟速度,根据Systrace的performance也会更好。 另外,晃动时速度不会增加。

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

Solutions Collecting From Web of "当设备停留但被触动时,Androidanimation的性能下降"

一些观察

移动设备,特别是基于高通芯片的移动设备,积极降低CPU时钟,以最大限度地降低功耗。 有时他们的政策有些过分 。 他们还尝试将活动核心数量减less到处理当前工作负载所需的数量。

查看systrace输出,只需在“CPU n”行处,可以看到“抖动”跟踪使所有四个内核都处于忙碌状态,而“无抖动”跟踪通常是使用2或3进行操作。当你没有晃动的时候,系统上的重量更轻。 根据CPU调节器的调节方式,可能会进行其他更改,例如时钟频率。

您可以通过将“freq”标签添加到systrace命令行来查看各种时钟值的更改。 您可能需要一个根植设备来获取此信息。 它应该显示对CPU时钟,GPU带宽和其他奥术项目的设置的更改。 请注意,它只会报告更改 ,所以您可能需要在录制开始后点击屏幕来鼓励它执行某些操作。

我相信你知道这一点,但是对于那些不这样做的人来说:如果某些事情需要执行N个CPU周期,并且CPU以100%的速度运行,那么任务将在T秒内完成。 如果CPU以50%的速度运行,则任务将在2 * T秒内完成。 测量CPU利用率的工具通过确定CPU在一定时间内运行的时间百分比与闲置时间的百分比来实现。 如果该工具监视1秒,并且该任务运行1秒,则这是100%利用率。 如果CPU时钟更高,任务在0.5秒内完成,则50%的利用率。 较低时钟的优势在于功耗是非线性的,所以在使用N个CPU周期的同时,较低的configuration会使电池消耗更less。 较低时钟的问题是执行时间较长,您的应用程序可能会丢帧。 这就是为什么触摸屏幕会提高时钟:CPU调速器知道你正在与设备交互,并configuration系统使交互尽可能平滑。

你应该忽略VSYNC的东西。 在一些设备上,SurfaceFlinger使用不同步的软件生成的VSYNC信号(谷歌“dispsync”的细节)。 它使用来自显示器刷新栅栏的反馈来决定是否漂移,并在必要时短时间重新打开硬件VSYNC重新同步。 (FWIW,有问题的线路在您发布的轨迹中确实有数据。)

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

也许你可以设置最小的CPU频率稍高。

希望这可以帮助。