扩展知识

CPU(中央处理器)与GPU(图像处理器)

主要是设计目标不同,针对不同的应用场景。多缓存多分支,适用于复杂的逻辑运算,主要负责Measure,Layout,Record,Execute的计算操作。

CPU擅长逻辑控制和通用类型数据运算。CPU的运算速度取决于请了多么厉害的教授,教授处理复杂任务的能力高,但简单重复的任务,还是人多快。众核少缓存,适用于结构单一的数据处理,主要负责Rasterization(栅格化)操作。

GPU擅长大规模并发计算。GPU的运算速度取决于雇了多少小学生。

绿色的是计算单元,橙红色的是存储单元,橙黄色的是控制单元。

屏幕上显示的文字、图像等,都是通过屏幕上的像素点显示颜色来完成的。

Resterization栅格化是绘制那些Button,Shape,Path,String,Bitmap等组件最基础的操作。它把那些组件拆分到不同的像素上进行显示。这是一个很费时的操作,GPU的引入就是为了加快栅格化的操作。

CPU负责把UI组件计算成Polygons,Texture纹理,然后交给GPU进行栅格化渲染。 整个流程如下

FPS (Frames Per Second)每秒帧数 60FPS 用户看的话觉得动作是连续的,至少是每秒10-12帧的速度,而想达到流畅的效果,至少需要每秒24帧。这也是为什么电影片源通常都是24帧的原因。如果和手机交互,如触摸和反馈,低于60FPS会感觉卡顿,60FPS是最佳流畅度。

为了保证用户的视觉效果,所以Android系统每隔16ms(1000ms/60fps)发出VSYNC信号,触发对UI渲染。

如果渲染操作超过了16ms,那么用户在16ms * 2 看到的2帧画面相同,感觉界面卡顿,即丢帧现象。

卡顿分析(16ms主要做两件事)

  1. 将UI对象转换成Polygons,Texture纹理。(LayoutInflater将XML转换成JAVA对象给CPU)
  2. CPU传递数据给GPU、GPU进行绘制。

布局优化

  1. 减少布局元素的层级嵌套,删除多余布局。或更改布局组件。如使用ContraintLayout。(减少转换对象的时间)
  2. 减少布局中的背景。(减少GPU重复绘制)
  3. 自定义View是否进行裁剪。(减少GPU重复绘制)
public class ClipView extends View {Card[] cards;Paint paint;......@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Card card;Bitmap bitmap;for (int i = 0; i < cards.length - 1; i++) {card = cards[i];bitmap = BitmapFactory.decodeResource(getResources(), card.resId);canvas.drawBitmap(bitmap, card.x, 0, paint);
//            drawCards(canvas, bitmap, card.x, cards[i + 1].x);}card = cards[cards.length - 1];bitmap = BitmapFactory.decodeResource(getResources(), card.resId);canvas.drawBitmap(bitmap, card.x, 0, paint);}private void drawCards(Canvas canvas, Bitmap bitmap, int s, int e) {canvas.save();canvas.clipRect(s, 0, e, bitmap.getHeight());canvas.drawBitmap(bitmap, s, 0, paint);canvas.restore();}
}复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"><com.outman.example.androidtest.clip.ClipViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="#0000ff"android:layout_margin="10dp"/>
</LinearLayout>
复制代码

参考 www.jianshu.com/p/26000db61…

Android高级开发-布局渲染流程与优化相关推荐

  1. Android 高级开发 JNI NDK 介绍与使用

    Android 高级开发 JNI & NDK 介绍与使用 前言 对于没接触过的领域,即是挑战也是机遇,不仅能够提升自己的能力.还能够学习到新的技术知识 而学习新的技术的时候,最好是从头开始按照 ...

  2. camera (19)---Android 相机开发的基本流程

    [Android 相机]Android 相机开发的基本流程 https://blog.csdn.net/bluewindtalker/article/details/54563910 相机开发现在有2 ...

  3. Android高级开发专题晋升班

    Android高级开发专题晋升班 适用人群:1-3年以上经验的开发者丨学员平均薪酬20K/月 转载于:https://www.cnblogs.com/lythonliu/p/6285531.html

  4. Android游戏开发-布局管理

    Android游戏开发-布局管理 2012/5/16 星期三 下午   我们都知道,系统控件一般都会搭载进布局里的,在Android呢,提供了5种布局类型,通过这五种布局之间的相互组合可以构建各种复杂 ...

  5. android高级开发强化实战,高级Android开发强化实战[PDF][215.59MB]

    内容简介 本书收集了约20个关于高级Android开发的进阶实例,这些实例都是对在日常开发中遇到的问题的抽象,涉及整个Android开发的各个技术栈.本书从常见的问题入手,引导读者逐步地掌握进阶的各个 ...

  6. android高级开发面试!五年Android开发者小米、阿里面经,Android篇

    最近我在接受采访时被问到我关于成为一名伟大的程序员见解.这是一个有趣的问题,我认为我们都可以是伟大的程序员,无论我们的天赋如何,如果我们遵循一些规则的话--我相信--这应该是常识.实际上,这些规则并不 ...

  7. android视频自定义渲染,十、Android视频框架PlayerBase#渲染流程

    IPlayer接口中的两个渲染方法 public interface IPlayer { void setDisplay(SurfaceHolder surfaceHolder); void setS ...

  8. Android应用开发编译框架流程与IDE及Gradle概要

    1 背景 建议阅读本文之前先阅读<Android Studio入门到精通>和<Groovy脚本基础全攻略>及<Gradle脚本基础全攻略>三篇博客作为背景知识,这样 ...

  9. android开发app!Android高级开发岗必问知识点,使用指南

    前言 网上关于启动优化的文章多不胜数,内容千篇一律,大都是列举一些耗时操作,采用异步加载.懒加载等. 而在面试过程中,关于启动优化的问题,如果只是很表面地回答耗时操作应该放在子线程,显然太过于普通,无 ...

最新文章

  1. 染成茜色的坂道 汉化版攻略
  2. CISCO RS 的常用命令
  3. Matlab问题汇总!
  4. Apache的详细安装教程和遇到的问题解决方案
  5. DelayQueue源码
  6. nginx location配置详解
  7. 如何解析属性文件(properties)获取键值对的值?
  8. 努力做一名认真踏实的工程师
  9. oracle存储过程function,oracle 存储过程跟function
  10. 爬虫-01-基础入门-字符串基础知识-节符串与字节转换
  11. delphi7 安装delphi 5 delphi 6控件
  12. CAN笔记(2) CAN特点
  13. 于一次JSON格式错误 之 手把手带你走一波FastJSON将对象转成JSON字符串流程
  14. 【车间调度】基于matlab多层编码遗传算法求解车间调度问题【含Matlab源码 035期】
  15. Mac最好用的SSH工具———SecureCRT使用以及下载
  16. 基于Java的仓库管理系统
  17. avr 运行 linux,linux(ubuntu9.04)安装avr编译环境
  18. 阿里本地生活电话面试
  19. PHP面试题2021和2022面试、跳槽必备大全!
  20. 计算机网络(学习过程中--持续更新)

热门文章

  1. 蓝桥杯 基础练习 芯片测试
  2. Python爬虫入门之使用Redis+Flask维护动态代理池
  3. Centos7 安装Jdk1.8u172
  4. 下载网络图片显示在Android手机上
  5. [转]magento2项目上线注意事项 切换到产品模式
  6. LeetCode刷题(4)
  7. Android添加拍照功能,Android相机开发(二): 给相机加上偏好设置
  8. Mysql更新计数器_MySQL实现计数器如何在高并发场景下更新并保持数据正确性
  9. Oracle 升级(10.2.0.1 -- 10.2.0.4) 包含升级包
  10. 表单的提交方式POST和GET