Android开发高手课
张绍文
前微信高级工程师,Tinker负责人
立即订阅
12609 人已学习
课程目录
已完结 61 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 焦虑的移动开发者该如何破局?
免费
导读 (1讲)
导读 | 如何打造高质量的应用?
模块一 高质量开发 (25讲)
01 | 崩溃优化(上):关于“崩溃”那些事儿
02 | 崩溃优化(下):应用崩溃了,你应该如何去分析?
03 | 内存优化(上):4GB内存时代,再谈内存优化
04 | 内存优化(下):内存优化这件事,应该从哪里着手?
05 | 卡顿优化(上):你要掌握的卡顿分析方法
06 | 卡顿优化(下):如何监控应用卡顿?
06补充篇 | 卡顿优化:卡顿现场与卡顿分析
07 | 启动优化(上):从启动过程看启动速度优化
08 | 启动优化(下):优化启动速度的进阶方法
09 | I/O优化(上):开发工程师必备的I/O优化知识
10 | I/O优化(中):不同I/O方式的使用场景是什么?
11 | I/O优化(下):如何监控线上I/O操作?
12 | 存储优化(上):常见的数据存储方法有哪些?
13 | 存储优化(中):如何优化数据存储?
14 | 存储优化(下):数据库SQLite的使用和优化
15 | 网络优化(上):移动开发工程师必备的网络优化知识
16 | 网络优化(中):复杂多变的移动网络该如何优化?
17 | 网络优化(下):大数据下网络该如何监控?
18 | 耗电优化(上):从电量优化的演进看耗电分析
19 | 耗电优化(下):耗电的优化方法与线上监控
20 | UI 优化(上):UI 渲染的几个关键概念
21 | UI 优化(下):如何优化 UI 渲染?
22 | 包体积优化(上):如何减少安装包大小?
23 | 包体积优化(下):资源优化的进阶实践
24 | 想成为Android高手,你需要先搞定这三个问题
模块二 高效开发 (9讲)
25 | 如何提升组织与个人的研发效能?
26 | 关于编译,你需要了解什么?
27 | 编译插桩的三种方法:AspectJ、ASM、ReDex
28 | 大数据与AI,如何高效地测试?
29 | 从每月到每天,如何给版本发布提速?
30 | 数据评估(上):如何实现高可用的上报组件?
31 | 数据评估(下):什么是大数据平台?
32 | 线上疑难问题该如何排查和跟踪?
33 | 做一名有高度的移动开发工程师
模块三 架构演进 (9讲)
34 | 聊聊重构:优秀的架构都是演进而来的
35 | Native Hook 技术,天使还是魔鬼?
36 | 跨平台开发的现状与应用
37 | 移动开发新大陆:工作三年半,移动开发转型手游开发
38 | 移动开发新大陆:Android音视频开发
39 | 移动开发新大陆: 边缘智能计算的趋势
40 | 动态化实践,如何选择适合自己的方案?
41 | 聊聊Flutter,面对层出不穷的新技术该如何跟进?
42 | Android开发高手课学习心得
练习Sample跑起来 (8讲)
练习Sample跑起来 | 热点问题答疑第1期
练习Sample跑起来 | 热点问题答疑第2期
练习Sample跑起来 | 热点问题答疑第3期
练习Sample跑起来 | 热点问题答疑第4期
练习Sample跑起来 | ASM插桩强化练习
练习Sample跑起来 | 唯鹿同学的练习手记 第1辑
练习Sample跑起来 | 唯鹿同学的练习手记 第2辑
练习Sample跑起来 | 唯鹿同学的练习手记 第3辑
特别放送 (7讲)
Android JVM TI机制详解(内含福利彩蛋)
专栏学得苦?可能是方法没找对
专栏学得苦?可能你还需要一份配套学习书单
Native下如何获取调用栈?
聊聊Framework的学习方法
Android工程师的“面试指南”
程序员修炼之路 | 设计能力的提升途径
结束语 (1讲)
结束语 | 移动开发的今天和明天
Android开发高手课
登录|注册

21 | UI 优化(下):如何优化 UI 渲染?

张绍文 2019-02-07
孔子曰:“温故而知新”,在学习如何优化 UI 渲染之前,我们先来回顾一下在“卡顿优化”中学到的知识。关于卡顿优化,我们学习了 4 种本地排查卡顿的工具,以及多种线上监控卡顿、帧率的方法。为什么要回顾卡顿优化呢?那是因为 UI 渲染也会造成卡顿,并且肯定会有同学疑惑卡顿优化和 UI 优化的区别是什么。
在 Android 系统的 VSYNC 信号到达时,如果 UI 线程被某个耗时任务堵塞,长时间无法对 UI 进行渲染,这时就会出现卡顿。但是这种情形并不是我们今天讨论的重点,UI 优化要解决的核心是由于渲染性能本身造成用户感知的卡顿,它可以认为是卡顿优化的一个子集。
从设计师和产品的角度,他们希望应用可以用丰富的图形元素、更炫酷的动画来实现流畅的用户体验。但是 Android 系统很有可能无法及时完成这些复杂的界面渲染操作,这个时候就会出现掉帧。也正因如此我才希望做 UI 优化,因为我们有更高的要求,希望它能达到流畅画面所需要的 60 fps。这里需要说的是,即使 40 fps 用户可能不会感到明显的卡顿,但我们也仍需要去做进一步的优化。
那么接下来我们就来看看,如何让我们的 UI 渲染达到 60 fps?有哪些方法可以帮助我们优化 UI 渲染性能?

UI 渲染测量

取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Android开发高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(11)

  • syz
    美团关于Litho的一篇文章,推给大家做参考。作为小白觉得看的清晰https://tech.meituan.com/2019/03/14/litho-use-and-principle-analysis.html
    2019-05-21
    4
  • 刘伟
    老师你好,有个问题想要请教一下

    你在这篇文章里面提到了 异步创建

    我尝试在子线程调用了如下代码,没按照文中的说法替换子线程 Looper的MessageQueue

    View v = new View(MainActivity.this);
    v.invalidate();
    v.setLayoutParams(new ViewGroup.MarginLayoutParams(200, 200)); v.setBackgroundColor(Color.RED);

    然后在主线程中添加到LinearLayout !代码正常运行,界面也正常显示。
    查看源码之后,检查线程是在ViewRootImpl中做的,而这个方法会在view invalidate 以后调用,我在子线程中调用的时候,因为还没有添加到 LinearLayout 中,所以不会触发ViewRootImpl 中方法的调用。 (翻了一下 5.0 和 8.0 的源码)

    那么你在文章中提到的 替换子线程的消息队列作用是什么呢?

    分割线---------------

    但是上面不替换消息队列的情况对WebView 不起作用,子线程创建WebView的时候必须替换。
    替换成之后,WebView 可以正常创建的了

    然而在主线程中添加到布局容器时候还是提示在非UI线程操作了View. 不知道老师使用这种方法的时候有没有遇到类似的问题。

    再割-----------------

    关于这个问题在stackoverflow上也有个类似的提问~

    https://stackoverflow.com/questions/5284513/constructing-views-in-a-non-ui-thread-and-consuming-in-the-ui-thread





    作者回复: 如果不替换,是某一些情况会报错

    2019-03-01
    1
    2
  • Dimple
    存储优化、网络优化、耗电优化到现在的UI优化,深深的把我刺激到了。以前搞的Android都只是为了实现而实现,以后我一定要好好规划规划,把这些优化都用起来。
    2019-04-30
    1
  • Carlo
    用flutter痛苦啊。还不如开发native app。各种坑。就一个facebook integration就产生了很多bug。

    作者回复: 随着flutter框架的成熟和各大公司的配套实践方案,后面应该会好很多

    2019-03-25
    1
  • 你好,目前应用碰到进入主界面卡顿黑屏现象比较严重,需要怎么定位问题吗,本人已根据排除法去定位相关代码,但是定位到结果存在概率性,需要怎么去定位到真正的问题呢?麻烦帮忙说下处理方案

    作者回复: 如果本地可以复现,利用卡顿优化中的traceview或者systrace定位是最高效的

    2019-02-07
    1
  • 人海中一只羊
    关于UI异步创建会抛出异常的那部分,能否举个例子?
    2019-11-16
  • EdwdChen
    请教一下,文中提及 flutter 是使用 skia 来进行渲染的,但是前一篇文章提到 skia 是软件渲染,这是不是意味着 flutter 虽然方便但是 ui 渲染上性能还是没有原声组件好呢?
    2019-09-09
  • neo
    值得粗读完,精细学习一阵子的高手课。
    2019-07-08
  • ForzaJuve
    涨见识,开眼界
    2019-03-19
  • 刘伟
    开拓眼界~每一个点深入都是一个大领域

    作者回复: 对的,由于边幅有限,大家都需要结合课后资料进一步学习

    2019-02-19
  • 哈珀朋友
    老哥RenderScript说得太简单了,原本以为会针对后端编译器LLVM做分析呢

    作者回复: 主要受边幅限制,这块大家在课后可以扩展阅读即可

    2019-02-07
收起评论
11
返回
顶部