更新TextView时渲染速度慢

时间:2017-06-16 17:14:53

标签: android

在控制台的新Android Vitals部分中,我收到警告,超过60%的会话受到缓慢的UI渲染时间的影响(错过Vsync:1.02%,慢UI线程:14.29%,慢速绘制命令:96.84 %)。我在测试设备上打开了GPU分析(使用应用程序的生产版本),我看到以下TextView更新导致渲染时间超过16毫秒(大约24-30毫秒):

updateTimer = new Timer();
updateTimer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                timeLeftView.setText(timeLeftString);
            }
        });
    }
}, 100, 500);

当我注释掉textView更新时,屏幕上没有任何内容被更改,并且探查器不会创建任何新栏。

一个线索是当使用计时器打开活动时,计时器的前3-4次更新在大约8ms时呈现,但随后它们上升到大约24-30ms。

另一个线索是当我触摸屏幕的任何部分时,渲染时间会回落到8ms左右几秒钟,然后再次拍摄到24-30ms。当我停止触摸时,渲染时间会再次回落几秒钟,然后再次拍摄。

所以我想知道的是:

  1. 这种简单的TextView更新是否正常会导致渲染时间过长?
  2. 这是什么搞乱了我的Android命脉?因为它只运行两次。问题可能在其他地方吗?上面的代码是唯一能够在GPU分析中创建高标准的代码,应用程序的其他元素工作正常,具有多个textview和图像的长列表视图具有大约8ms的渲染时间。
  3. 我可以做些什么来减少这些抽奖时间?我已经尝试删除TextView布局中的居中和重力,以及wrap_content(如另一个答案所示),但都没有任何效果。除此之外,我不确定该怎么做。

2 个答案:

答案 0 :(得分:1)

如果你在你的xml中放了很多层,它将强制android多次渲染(如果你有很多层,重构你的代码!!)。 我强烈推荐这个阅读:https://developer.android.com/training/improving-layouts/index.html

关于多次渲染TextView,渲染速度取决于您运行应用程序的设备!

答案 1 :(得分:1)

几乎每个建议都试过。

最后通过将可运行的频率从500ms增加到50ms或更短来解决它。问题是可运行的低频让CPU / GPU进入低功耗状态,因此抽取时间更长。通过增加可运行和绘制的频率,CPU / GPU不会进入低功耗状态并且帧被绘制得更快。是的,它对电池的负担更多,但并不像屏幕上的电池那么多。没有任何用户抱怨任何方式和Android生命体征现在很高兴。

此外,看看设备制造商的默认/官方应用程序是如何工作的(包括谷歌本身),这正是他们处理TextView更新的方式。例如谷歌的时钟应用程序(倒数计时器,而不是秒表)每秒更新TextView~60次,即使每秒一次也是最需要的,也是最节俭的。