Android性能优化系列三:布局优化

UI绘制流程与原理CPU与GPU工作流程CPU的任务繁多,做逻辑计算外,还要做内存管理、显示操作,因此在实际运算的时候性能会大打折扣,在没有GPU的时代,不能显示复杂的图形,其运算速度远更不上今天复杂三维游戏的要求。即使CPU的工作频率超过2GH或更高,对它绘制图形提高也不大,这时GPU的设计就出来了。结构图对比如下:黄色:Control控制器,用于协调控制整个CPU的运行,包括取出指令、...
摘要由CSDN通过智能技术生成

CPU与GPU工作流程

CPU的任务繁多,做逻辑计算外,还要做内存管理、显示操作,因此在实际运算的时候性能会大打折扣,在没有GPU的时代,不能显示复杂的图形,其运算速度远更不上今天复杂三维游戏的要求。即使CPU的工作频率超过2GH或更高,对它绘制图形提高也不大,这时GPU的设计就出来了。结构图对比如下:

在这里插入图片描述
黄色:Control控制器,用于协调控制整个CPU的运行,包括取出指令、控制其他模块的运行等;

绿色:ALU(Arithmetic Logic Unit),是算术逻辑单元,用于运行数学、逻辑运算;

橙色:Cache和DRAM分别为缓存和RAM,用于存储信息。

从结构图可以看出,CPU的控制器较为复杂,而ALU数量较少,因此CPU擅长各种复杂的逻辑运算,但不擅长数学尤其是浮点运算。

结合到Android的UI绘制流程可以简单的理解为如下关系:

在这里插入图片描述

CPU计算画图的方法得到矢量图,而GPU通过像素填充,将矢量图转为位图,绘制显示出来。这个过程就是栅格化。

矢量图:又叫向量图,是用一系列计算机指令来描述和记录一幅图,一幅图可以理解为一些列由点、线、面等组成的子图,它所记录的是对象的几何形状、线条粗细和色彩等

位图:位图又叫点阵图或像素图,计算机屏幕上的图像是由像素构成的,每个点用二进制数据来描述其颜色与宽度等信息,这些点是离散的,类似于点阵,多个像素的色彩组合形成了图像,称之为位图
在这里插入图片描述

60Hz刷新频率的由来

  • 12fps:由于人类眼睛的特殊生理结构,如果所看画面之帧率高于每秒约10~12帧的时候,就会认为是连贯的
  • 24fps:有声电影的拍摄及播放帧率均为美秒24帧,对一般人而言已经算可接受
  • 30fps:早期的高动态电子游戏,帧率少于美秒30帧的话就会显得不连贯,这是因为没有动态模糊使流畅度降低
  • 60fps:在与手机交互的过程中,如触摸和反馈 60帧以下是能感觉出来的,60帧以上不能察觉变化
  • 当帧率低于60fps时感觉画面有卡顿迟滞现象

Android系统每隔16ms发出VSYNC信号(1000ms/60=16.66ms),触发对UI进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fps,这意味着计算渲染的大多数操作都必须在16ms内完成。这里只是简单的提一下,有个初步的认识,后续会专门用一篇文章来详细分析Android的屏幕刷新机制。

Layout Inspector
  • Android studio 自带工具
  • 查看视图层级结构
  • Tools—> Layout Inspector
Choreographer 检测丢帧(卡顿)
  • 获取FPS,线上使用,具备实时性
  • API 16之后
  • Choreographer.getInstance().postFrameCallback
public class MainActivity extends AppCompatActivity {
   
    private long mStartFrameTime = 0;
    private int mFrameCount = 0;
    private static final long MONITOR_INTERVAL = 160L; //单次计算FPS使用160毫秒
    private static final long MONITOR_INTERVAL_NANOS = MONITOR_INTERVAL * 1000L * 1000L;
    private static final long MAX_INTERVAL = 1000L; //设置计算fps的单位时间间隔1000ms,即fps/s;

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

        getFPS();
    }
    
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    private void getFPS() {
   
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
   
            return;
        }
        Choreographer.getInstance().postFrameCallback(new Choreographer.FrameCallback() {
   
            @Override
            public void doFrame(long frameTimeNanos) {
   
                if (mStartFrameTime == 0) {
   
                    mStartFrameTime = frameTimeNanos;
                }
                long interval = frameT
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值