8

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

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

以下是结果的链接。Shake是我真正快速旋转设备no_shake的时候,是它被放在我桌子上的时候。

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

Systrace:不摇

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

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

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

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

在此处输入图像描述

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

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

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

更新

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

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

4

2 回答 2

4

一些观察...

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

查看 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 周期时,较低和较慢的配置消耗的电池更少。较低时钟的问题是执行时间较长,并且您的应用程序最终可能会丢帧。这就是触摸屏幕提高时钟的原因:CPU 调控器知道您正在与设备交互,并配置系统以使交互尽可能顺畅。

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

于 2015-11-05T17:21:45.653 回答
0

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

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

希望这可以帮助。

于 2015-11-05T14:49:46.983 回答