ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – 最基本布局的慢渲染

2019-06-22 13:14:40  阅读:129  来源: 互联网

标签:android performance


在我的Android vitals中,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分析时,这非常接近于在一些较慢的设备上绘制每个帧的16ms限制(显然是我的用户的30%).只有一个TextView.但是这里有一个问题:当我第一次运行活动时,渲染时间很短但是几秒后它们就会出现.如果我一直触摸屏幕(屏幕上没有控件),渲染时间仍然很短.我猜这是由于CPU / GPU进入低功耗状态(因此渲染需要更长时间).

我的问题是Android的生命体征.我一直看到有关缓慢渲染时间的警告(我认为任何超过5%的会话遇到缓慢渲染都会收到警告)但我不知道如何加快速度.而且我担心它可能会影响我的应用程序的排名,但即使有这个非常简单的例子,也有太多的Android用户使用慢速设备.

可以做些什么吗?

解决方法:

我们有同样的问题是好的,经过一些挖掘我怀疑它是由于CPU闲置?

我们的情况类似.我们有一个Runnable,我们使用Handler每秒更新一次TextView的文本. TextView驻留在RecyclerView内的项目上.有趣的是,当我们滚动页面,或者有一些动画正在进行,或者与应用程序交互时(除了滴答声之外的其他任何事情),我们得到的不是16ms标记.但让设备闲置和bam,每帧占用30-50毫秒.

我们尝试在SO中提到different solutions类似的情况.就像将视图的宽度从wrap_content更改为match_parent一样.没有帮助解决这个问题.我们尝试将1000ms间隔更改为500,200,100,50,20,16,10,并且在使用16 / 10ms时(CPU始终工作?)只能看到更好的结果.

找到了关于CPU限制的this article.因此,当CPU处于空闲状态时,可能需要更多时间来绘制帧?

如果您在Android Studio中查看CPU监视器,您会发现只要没有发生任何事情,CPU就会变为空闲状态. (更高的是当有交互时,使用Nexus 5).
enter image description here

但是看看GPU监视器,看起来与屏幕上的Profile GPU渲染条完全不同,没有帧实际跨越16ms标记!不确定哪个GPU监控是正确的. (大黄色是在有互动的时候).
enter image description here

标签:android,performance
来源: https://codeday.me/bug/20190622/1263865.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有