gpt4 book ai didi

android - 如何修复渲染缓慢 (Android vitals)

转载 作者:可可西里 更新时间:2023-11-01 19:02:06 26 4
gpt4 key购买 nike

我有一个应用程序在新的 Google Play 管理中心 - Android Vitals 慢速渲染部分中被列为底部 25%。我担心这个是因为 such articles这似乎表明,如果您的应用落在倒数 25%,Google Play 可能会对您的应用在 Play 商店排名中进行处罚。

但是,似乎无法为我的应用改进此指标。它播放音乐并有一个 SeekBar 和 TextView,就像任何音乐播放器一样每 250 毫秒更新一次。我制作了最小的基本程序来演示:

public class MainActivity extends AppCompatActivity {

int count;
SeekBar seekBar;
TextView textView;

Runnable runnable =
new Runnable() {
@Override
public void run() {
textView.setText(Integer.toString(count));
seekBar.setProgress(count);
++count;
seekBar.postDelayed(runnable, 250);
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

seekBar = (SeekBar) findViewById(R.id.seek);
textView = (TextView) findViewById(R.id.text);
seekBar.post(runnable);
}
}

完整项目在这里:https://github.com/svenoaks/SlowRendering.git

当我在类似于 Nexus 设备的硬件上运行这个程序时,我得到了这些结果
adb shell dumpsys gfxinfo com.example.xyz.slowrendering 命令:

Stats since: 19222191084749ns
Total frames rendered: 308
Janky frames: 290 (94.16%)
90th percentile: 32ms
95th percentile: 36ms
99th percentile: 44ms
Number Missed Vsync: 2
Number High input latency: 0
Number Slow UI thread: 139
Number Slow bitmap uploads: 0
Number Slow issue draw commands: 283

这意味着我几乎所有的帧都需要 16 毫秒以上的时间来渲染,我猜这是由于更新的周期性。据我所知,我测试过的所有其他音乐播放器应用程序也存在这个渲染缓慢的问题。我担心 Google 的算法会破坏我的应用排名,有什么方法可以提高我的分数吗?

最佳答案

您布局中的 TextView 导致了问题。因为它有 wrap_contentlayout width,这表示它的宽度必须等于内容的宽度(本例中的文本)。因此,每次调用 TextView.setText 时,都必须进行一次代价高昂的测量/布局传递。只需将 layout_width 设置为 match_parent 即可解决问题。

enter image description here

enter image description here

这是从 systrace 中截取的两张图片,它演示了在 1 帧中在 UI 线程上运行的工作。顶部的是使用 layout_width=wrap_content 完成的,底部的是使用 layout_width=match_parent 完成的。

我测试过以下两种方法可以提高帧率:

  • 如果您在 16 毫秒这样的较短跨度内发布可运行对象 (seekBar.postDelayed(runnable, 16)),您将获得平滑的 60fps: enter image description here

    P/s:我还不确定为什么。

  • 使用其他方式更新 count 值,而不是在 Runnable 中更新。使用 View.postOnAnimation(Runnable) 重新安排 Runnable。示例项目的结果是 60FPS。

编辑:两个使用 postOnAnimation(Runnable)

Runnable
Runnable runnable =
new Runnable() {
@Override
public void run() {
textView.setText(Integer.toString(count));
seekBar.setProgress(count);
seekBar.postOnAnimation(this);
}
};



Runnable updateCount = new Runnable() {
@Override public void run() {
++count;
seekBar.postDelayed(this, 250);
}
};

关于android - 如何修复渲染缓慢 (Android vitals),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44233870/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com