我的应用程序每帧更改一些非常简单的视图(旋转,平移)的属性。根据Android性能文章的建议,我使用了systrace来检查我是否丢帧。
出乎意料的事情出现了。当设备静止不动时(即使我触摸屏幕)CPU使用率更高,systrace上的警报出现,GPU渲染分析器的红色部分更长。当我快速旋转或震动设备时,一切都很好。
以下是结果的链接。 Shake
是我快速旋转设备的时候,no_shake
是我坐在桌子上的时候。{/ p>
我制作了一个非常简单的测试应用程序,它使用单个翻译动画:source code。
看看震动系统,帧速率是平滑的,为什么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时钟会在触发时增加(即使应用程序没有改变方向) 。因此,我认为监控此手势的原因是为了加快可能的方向变化。
答案 0 :(得分:3)
一些观察......
移动设备,特别是那些基于Qualcomm芯片的移动设备,可以积极地减少CPU时钟,从而最大限度地降低功耗。有时他们的政策是bit heavy-handed。他们还尝试将活动核心数量减少到处理当前工作负载所需的数量。
查看systrace输出,只需在“CPU n”行,您可以看到“抖动”跟踪使所有四个核心保持忙碌,而“无抖动”跟踪通常与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,有问题的行做在你发布的踪迹中有数据。)
答案 1 :(得分:0)