在我的Android中,30%的用户体验到渲染速度慢。我的应用程序有一个非常复杂的UI,所以我做了一个非常基本的项目来尝试解决这个问题。但事实证明,即使布局最简单,它也很慢。
布局是Android Studio提供的居中文本作为模板:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="slowrenderingtest.pichaipls.com.slowrenderingtest.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/timerView"
android:text="00:00"
android:textSize="40dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
使用布局的活动每秒都会更改一次文本(因为它是一个计时器):
Timer updateTicks = new Timer();
updateTicks.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Random r = new Random();
timerView.setText(String.format("%02d", r.nextInt(60))+":"+
String.format("%02d", r.nextInt(60)));
}
});
}
}, 100, 1000);
当我打开GPU分析时,这在一些较慢的设备(显然是我的用户的30%)上绘制每帧的16ms限制非常接近。只有一个TextView。但是这里有一个问题:当我第一次运行活动时,渲染时间很短但是几秒后他们就会开始射击。如果我一直触摸屏幕(屏幕上没有控件),渲染时间仍然很短。我猜这是由于CPU / GPU进入低功耗状态(因此渲染需要更长时间)。
我的问题是Android的生命体征。我一直看到关于缓慢渲染时间的警告(我认为任何超过5%的会话遇到缓慢渲染都会收到警告)但我不知道如何加快速度。我担心它可能会影响我应用的排名,但即使有这个非常简单的例子,也有太多Android用户设备速度很慢。
可以做些什么吗?
答案 0 :(得分:4)
我们遇到同样的问题很好,经过一番挖掘后我怀疑这是因为CPU闲置了吗?
我们的情况类似。我们有一个Runnable,我们使用Handler每秒更新一次TextView的文本。 TextView驻留在RecyclerView内的项目上。有趣的是,当我们滚动页面,或者有一些动画正在进行,或者与应用程序交互时(除了滴答声之外的其他任何事情),我们得到的不是16ms标记。但是让设备闲置并且bam,每帧占用30-50毫秒。
我们在SO中提到过different solutions类似的情况。就像将视图的宽度从wrap_content更改为match_parent一样。没有帮助解决这个问题。我们尝试将1000毫秒间隔更改为500,200,100,50,20,16,10,并且在使用16 / 10ms(CPU始终工作?)时才看到更好的结果。
发现有关CPU限制的this article。那么可能当CPU处于空闲状态时,需要更多时间来绘制帧?
如果您查看Android Studio中的CPU监视器,您会发现只要没有发生任何事情,CPU就会变为空闲状态。 (更高的是当有交互时,使用Nexus 5)。
但是看看GPU显示器,看起来与屏幕上的Profile GPU渲染条完全不同,没有帧实际跨越16ms标记!不确定哪个GPU监控是正确的。 (大黄色是在有互动的时候)。
答案 1 :(得分:0)
尝试在宽度上设置textView match_parent ...如果每秒更改一次文本,则表示TextView每次都需要计算它的大小。你会对结果感到惊讶......