>>分享Android开发相关的技术 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 19896 个阅读者 刷新本主题
 * 贴子主题:  UI渲染优化 回复文章 点赞(0)  收藏  
作者:sunshine    发表时间:2020-03-08 14:57:30     消息  查看  搜索  好友  邮件  复制  引用

                                                                                                      

CPU与GPU

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

蓝色的Control为控制器,用于协调控制整个CPU的运行,包括取出指令,控制其它模块的运行等。

橙色的ALU(Arithmetic Logic Unit)为算数逻辑单元,用于数学及逻辑运算;

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

CPU控制器比较复杂,ALU数量较少。因此CPU擅长各种复杂的罗技运算,但是不擅长数学尤其是浮点计算。

     例如使用16进制表示颜色,如果要修改颜色,只需要把16进制的值修改即可。所以GPU更多的是ALU。

XML布局显示至屏幕流程

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

首先在xml定义控件,包含一些宽高等信息,然后LayoutInflater将xml加载到内存中,交由CPU计算,生成位图,CPU将图形交给GPU, GPU栅格化之后交由显示器显示。

FPS

12 fps:画面帧率高于每秒12帧时,眼睛会认为它是连贯的;

24 fps:有声电影拍摄一般为每秒24帧

30 fps:早起动态电子游戏,一般会在每秒30帧左右;

60 fps:手机交互过程中,需要触摸和反馈,需要60帧才能达到不卡顿的效果;

     Android系统每16ms就会发送一个Vsync信号对UI进行一次渲染,如果每次都成功,就能达到60帧的效果。要达到60帧每秒,需要在16ms内完成xml的加载渲染等,如果16ms内没有完成,则会有卡顿的现象;

卡顿原因

过渡绘制
  1. 解决:取出不必要的背景色
  2. 布局视图扁平化
  3. 减少透明色的使用
UI线程复杂的运算
  1. 减少UI线程中的数据运算
频繁GC:
  • 频繁GC的原因:
  1. 内存抖动
  2. 瞬间产生大量的对象
  • 尽可能减少在for循环中new对象或在onDraw中创建对象
  • 尽量不要在循环中大量地使用局部变量

优化目标

CPU减少XML转换成对象的时间

GPU减少重复绘制

过渡绘制的概念

GPU每个16ms画一次,如果CPU传递过来的图形有重复的位置,会造成用户只能看到顶层画面,而底层画面则被遮盖,底层部分的绘制虽然用户无法看到,但同样也占据了计算资源,造成了不必要的浪费;这种情况就叫过渡绘制;

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

打开开发者选项中的调试GPU过渡绘制,不同的颜色代表不同的层次。红色过渡绘制最严重的。

典型过渡绘制的例子

扑克牌

点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

前面两张牌只能看到部分,但是缺绘制了全部内容。通过canvas裁剪,使前面两个只绘制展示的内容。

UI优化解决方案

布局中的背景是否需要;

是否可以删除多余布局;

自定义View是否进行了相应的裁剪;

布局是否够扁平化;

使用Merge标签排除多余一层ViewGroup容器;

使用ViewStub进行布局的懒加载;

                                                                                                                
----------------------------
原文链接:https://blog.csdn.net/CSDN_Mew/article/details/103980738

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-03-11 10:24:58 重新编辑]
  Java面向对象编程-->泛型
  JavaWeb开发-->使用Session(Ⅱ)
  JSP与Hibernate开发-->Java对象持久化技术概述
  Java网络编程-->ServerSocket用法详解
  精通Spring-->Vue CLI脚手架工具
  Vue3开发-->绑定表单
  Android网络编程之WebKit应用
  Android ListView滑动加载
  浅析Android的通知系统
  Android Broadcast receiver 编程
  Android SDCard UnMounted 流程分析
  Android定义的路径全局变量
  Android API 中Toast类的用法
  Android 消息推送
  Android UI学习 - TableLayout使用范例
  安卓隐藏标题栏方法
  总是听到有人说AndroidX,到底什么是AndroidX?
  Roboletric+Retrofit2单元测试
  Android 加载大图/多图,有效避免OOM
  Android Service学习之AIDL, Parcelable和远程服务-学习Andr...
  Android adb你真的会用吗?
  更多...
 IPIP: 已设置保密
树形列表:   
1页 2条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。