浅谈移动端 View 的显示过程

分享发现 · jack · Created at · Last by nini9595 Replied at · 541 hits
434 1549005614

作者:个推安卓开发工程师 一七

随着科技的发展,各种移动端早已成为人们日常生活中不可或缺的部分,人们使用移动端产品工作、社交、娱乐……移动端界面的流畅性已经成为影响用户体验的重要因素之一。那么你是否思考过移动端所展现的流畅画面是如何实现的呢?

本文通过对移动端View显示过程的简略分析,帮助开发者了解View渲染的逻辑,更好地优化自己的APP。

上图展示的是一个完整的页面渲染过程。通过上图,我们可以初步了解每一帧页面从代码布局的编写到展示给使用者,其背后的逻辑是如何一步一步执行的。

屏幕如何呈像

像素点

在电子屏幕中显示的图片,其实都是由一个个“小点”所组成的,这些“小点”被称为“像素点”。每一个像素点都有自己的颜色,每一张完整的图片都是由它们相连拼接形成的。

每个像素点一般都有 3 个子像素:红、绿、蓝,根据这三种原色,我们能够调制出各种各样的颜色。

大电视机

与现在的平板电视不同的是,以前的黑白电视机或者大背投彩电,总是带着大大的“后背”。“大后背”电视其实就是阴极射线管电视机,俗称显像管电视。其成像原理是电子枪发射出的电子束(阴极射线)通过聚焦系统和偏转系统,射向屏幕上涂有荧光层的指定位置。被电子束轰击的每个位置,荧光层都会产生一个小亮点,最终小亮点们将会组成一幅幅影像,显示在电视屏幕上。

这也是以前大电视机的屏幕都呈圆弧形的原因。因为越接近圆形,边长到中心的距离越相近,呈像越均匀。那为什么当磁铁贴近电视机时,会让电视机的成像出现问题呢?那是因为磁铁会干扰电子束的正常轨迹,并且在贴近屏幕的时候,也可能使得屏幕的荧光层磁化,出现一个个不正常的光斑。

下图展示的是摄像机慢放后,电子束的绘制过程。

LCD 和 OLED

随着科技的不断进步,电视、手机、电脑的体积越来越薄,射线管显像方式也逐渐被淘汰。目前在手机市场上占据主流地位的是 LCD 和 OLED 两种屏幕。

LCD 全称为 Liquid Crystal Display ,即液晶显示器。OLED 全称为 Organic Light-Emitting Diode ,即有机发光二极管。这两者之间存在显著的差别:

1. 两者成像原理不同
LCD 是靠白色的背光穿透彩色薄膜显色的,而 OLED 则是靠每个像素点自行发光。

2. 在耗电量方面
LCD的耗电量较高,即使只显示一个亮点,LCD 的背光源也需要一直发光,而且容易出现漏光现象。而OLED的每个像素都能独立工作,而且 可以自行发光,因此采用OLED的设备可以制作得更薄,甚至可以弯曲。

3.在制作方面
LCD使用的是无机材料, OLED 则需要使用有机材料,因此 OLED的制作费用更高,并且使用寿命不如 LCD 。

图形显示核心 GPU

与CPU相对比,GPU的计算单元更多,更擅长大规模并发计算,例如密码破解、图像处理等。CPU 则是遵循冯诺依曼架构存储程序顺序执行,在大规模并行计算能力上,受到的限制更大,因此更擅长逻辑控制。

应用程序编程接口 API (OpenGL)

在没有统一的 API 之前,开发者需要在各式各样的图形硬件上编写各种自定义接口和驱动程序,工作量极大。

1990 年 SGI(硅谷图形公司)成为了工作站 3D 图形领域的领导者,并将其 API 转变为一项开放标准,即 OpenGL。后来,SGI还促成了 OpenGL 架构审查委员会(OpenGL ARB)的创建。

垂直同步 Vertical Synchronization

当我们在使用手机 APP 的过程中,发现页面出现卡顿现象,那么极有可能是页面没有在 16ms 内更新导致的。实际上,人眼与大脑之间的协作无法感知超过 60fps 的画面更新。60fps 相当于是每秒 60 帧,那么每个页面需要在 1000/60 = 16ms 内更新为其他页面,才不会让我们感受到页面的卡顿。

而在没有 VSync 的情况下可能会出现以下情况:

如上图所示,在没有 VSync 的情况下,会出现需要显示第二帧时,其尚未处理完成的情况,因此Display 中显示的仍是第一帧。这会造成该帧显示时长超过16ms,从而导致页面卡顿的现象。

为了使 CPU、GPU 生成帧的速度与 Display 保持一致,Android 系统每 16ms 就会发出一次 VSYNC 信号,触发 UI 渲染更新。

从上图中我们可以看出,每隔 16ms ,安卓会发出一个 VSync 信号,收到信号后 CPU 开始处理下一帧的的内容,GPU 在 CPU 处理结束之后,将会进行光栅化,此时屏幕上显示的是上一帧已经处理完成的页面。如此反复,就可以在页面中展示一幅幅的指定画面。而确保画面流畅的前提是CPU 和 GPU 处理一帧所花费的时间不能超过 16 ms,否则就会出现以下情况:

当CPU 和 GPU 处理一帧的时间超过了16 ms时,在第一个 Display 中,由于 GPU 处理 B 画面的时间过长,导致系统发出 VSync 信号时, Display不能及时地显示出 B 画面,而重复显示A页面,造成卡顿。

此外,在第二个 Display 中,由于 A Buffer 还在被 Display 所使用,不能在收到 VSync 信号后开始处理下一帧的页面,导致该时间段内 CPU 的闲置。为了避免这种时间的浪费,三缓存机制由此出现:

如上图所示,在三缓存机制中,当 A 缓存被 Display 使用、B 缓存被 GPU 处理时,系统会发出 Vsync 信号,并加入新的缓存 C ,用来缓存下一帧的内容。这种方式虽然不能完全避免 A页面的重复显示,但是能够让后面页面的显示更加平滑。

View 的绘制流程

View 的绘制是从 ViewRootImpl 的 performTraversals() 方法开始的,其整体流程大致分为三步,如下图所示:

measure

控件测量过程从 performMeasure() 方法开始。在该方法中childWidthMeasureSpec 和 childHeightMeasureSpec,分别是用来确定宽度和高度的。

MeasureSpec 是一个 int 值,它存储着两个信息:低 30 位是 View 的 specSize,高 2 位是 View 的 specMode。

specMode 有三种类型:

1.UNSPECIFIED

父视图对子视图没有任何限制,可以将视图按照开发者的意愿设置成任意的大小,在一般开发过程中不会用到。

2.EXACTLY

父视图为子视图指定一个确切的尺寸,该尺寸由 specSize 的值来决定。

3.AT_MOST

父视图为子视图指定一个最大的尺寸,该尺寸的最大值是 specSize。

观察 View 的 measure() 方法,可以发现该方法是被 final 修饰的,因此 View 的子类只能够通过重载 onMeasure() 方法来完成自己的测量逻辑。


在 onMeasure() 方法中:

调用 getDefaultSize() 方法来获取视图的大小:

该方法中的第二个参数 measureSpec 是从 measure() 方法中传递过来的:通过 getMode() 和 getSize() 解析获取其中对应的值,再根据 specMode 给最终的 size 赋值。

不过以上只是一个简单控件的一次 measure 过程,在真正测量的过程中,由于一个页面往往包含多个子 View ,所以需要循环遍历测量,在 ViewGroup 中有一个 measureChildren() 方法,就是用来测量子视图的:

measure 整体流程的方法调用链如下:

layout

在performTraversals() 方法的测量过程结束后,进入 layout 布局过程:

performLayout(lp,desiredWindowWidth,desiredWindowHeight);

该过程的主要作用即根据子视图的大小以及布局参数,将相应的 View 放到合适的位置上。

host.layout(0,0,host.getMeasuredWidth(),host.getMeasuredHeight());

如上,layout() 方法接收了四个参数,按照顺时针,分别是左上右下。该坐标针对的是父视图,以左上为起始点,传入了之前测量出的宽度和高度。之后,让我们进入到 layout() 方法中观察:

我们通过 setFrame() 方法给四个变量赋值,判断 View 的位置是否变化以及是否需要重新进行 layout,而且其中还调用了 onLayout() 方法。

在进入该方法后,我们可以发现里面是空的,这是因为子视图的具体位置是相对于父视图而言的,所以 View 的 onLayout 为空实现。

再进入 ViewGroup 类中查看,我们可以发现,这其实是一个抽象的方法,在这样的情况下, ViewGroup 的子类便需要重写该方法:

draw

绘制的流程主要如下图所示,该流程也是存在遍历子 View 绘制的过程:

需要注意的是,View 的 onDraw() 方法是空的,这是因为每个视图的内容都不相同,这个部分交由子类根据自身的需要来处理,才更加合理:

安卓渲染机制的整体流程

1.APP 在 UI 线程构建 OpenGL 渲染需要的命令及数据;

2.CPU 将数据上传(共享或者拷贝)给 GPU 。(PC 上一般有显存,但是 ARM 这种嵌入式设备内存一般是 GPU 、 CPU 共享内存);

3.通知 GPU 渲染。一般而言,真机不会阻塞等待 GPU 渲染结束,通知结束后就返回执行其他任务;

4.通知 SurfaceFlinger 图层合成;

5.SurfaceFlinger 开始合成图层。

总结

移动端技术发展很快,而画面显示优化是一个持续发展的实践课题,贯穿于每个开发者的日常工作中。未来,个推技术团队将继续关注移动端的性能优化,为大家分享相关的技术干货。

共收到 6 条回复
2
jixiaohua · #1 ·

个推的这个朋友,我是diycode 站长,加个微信? jixiaohua888

2Floor Deleted
3Floor Deleted
4Floor Deleted
5Floor Deleted
7842 1560847929
nini9595 · #6 ·

[size=4]雅汐 167 49 C杯 22歲【台灣純本土】 #預約制
高顏值,火辣身材,細腰翹臀
很會玩,服務很好,女神級別的人物
人很正皮膚保養很好
#兼職一天,喜歡的卡緊敲我預約[/size]
150546xly0lg22y0t717gf.jpg.thumb

150554mvfjhzwjifywpcjl.jpg.thumb

150600o3zc6z5ipn5ie5ce.jpg.thumb

[size=4]#超級敢玩嬌小全程無套騷尤物
牛奶 158,46,D杯,23歲დდდ
#嬌小淫蕩的無套妹超級敢玩,很騷很淫蕩,配合度高,尺度大,無套內射,後門,舔蛋蛋 舔屁眼,
清水溝,舔奶頭,深喉,顏射,乳交,足交, 最後在來一個火車便當 各種姿勢各種體位各種玩讓你享受不一樣的體驗,
☀☀把你女友在你女友或者老婆身上沒有玩到沒有享受到的,今天都可以找牛奶玩超有女友fu她的讓你欲罷不能。#現在可約‼‼‼[/size]
150605twccajxwj0x20z0c.jpg.thumb

150611arxl8b48zxy8r92b.jpg.thumb

150616qnv8az8aq1vwqqxa.jpg.thumb

150625u2f2mply1m6pryjx.jpg.thumb

150621oqzunuhm8nrzvxx6.jpg.thumb

[size=4]小星星優質外送茶聯絡方式:【籟nini9595】【Skype:bjx778】
【Kakao:5280888】【Telegram:nini9595】【官網:http://www.5280344.com
消費價格:北部4.5K起跳 中部3k起跳 南部3k起跳
外送地點:旅館 酒店 汽旅 vip可住家 外約
外送方式:現金交易 不轉帳 不刷卡 不買點數 不勉強消費可退換
年齡18~50歲〈正派經營、一律現金、絕.無.欺.騙〉
身高【150~176】=胸圍【A-B-C-D-E-F-H-G】
各類型的美女應有盡有,一律台灣美女、配合度及服務更是100%
依照您所需要的條件安排、現金消費、不加收任何費用、保證可換
新茶多、貨源足、素質優、安全隱密、絕不催趕《絕對是您最佳的選擇
★*全套服務:愛愛、口交、哈拉、洗澡 還要特別服務哦
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
●●營業時間:中午12:00---凌晨1:30【凌晨請提前預約】365天全年無休 隨時歡迎你們的關顧

小星星外送茶活動大優惠: 籟nini9595 sy:bjx778
1.消費一次不管金額大小免房費 免車資 送絲襪
2.消費金額8k送絲襪+免車資+3000優惠卷+9折會員卡
3.消費金額10k送絲襪+原味內褲消費第二節直接半價
3.消費金額20k送超級VIP(永久7折)免費試車10k小模+免費進入約炮群
4.消費金額30k送黃金VIP(永久半價)免費試車15k小模2小時無線次數
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
【包夜套餐】 籟nini9595 sy:bjx778
1.買六節【6小時-免費送2H】送3000抵用卷
2.買九節【9小時-免費送3H】送5000抵用卷+半價*2
3.買十二節【12小時-免費送4H】+永久半價+黃金VIP
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
【加時套餐】 籟nini9595 sy:bjx778
1.兩節送一節/兩節送兩節/三節送一節/三節送兩節
2.喝茶續杯半價
3.還可約姐妹花母女雙胞胎3P妹妹喲
【北中南套餐都可以挑選,詳情諮詢我喲】
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
台灣外送茶選妃官網【http://www.5280344.com/forum.php
平價茶【3-7k】【http://www.5280344.com/forum.php?mod=forumdisplay&fid=71
優質茶【7-12k】【http://www.5280344.com/forum.php?mod=forumdisplay&fid=70
高檔茶【12-80k】【http://www.5280344.com/forum.php?mod=forumdisplay&fid=69
台北外送茶選妃官網【http://www.5280344.com/forum.php?mod=forumdisplay&fid=39
台中外送茶選妃官網【http://www.5280344.com/forum.php?mod=forumdisplay&fid=40
高雄外送茶選妃官網【http://www.5280344.com/forum.php?mod=forumdisplay&fid=41
新竹外送茶選妃官網【http://www.5280344.com/forum.php?mod=forumdisplay&fid=47
彰化外送茶選妃官網【http://www.5280344.com/forum.php?mod=forumdisplay&fid=48
台南外送茶選妃官網【http://www.5280344.com/forum.php?mod=forumdisplay&fid=49
台灣北中南優惠茶單【http://www.5280344.com/forum.php?mod=forumdisplay&fid=50
真實客評售後區【http://www.5280344.com/forum.php?mod=forumdisplay&fid=45
吃魚喝茶新手區【http://www.5280344.com/forum.php?mod=forumdisplay&fid=36
安全旅館推薦區【http://www.5280344.com/forum.php?mod=forumdisplay&fid=37
男女兩性知識區【http://www.5280344.com/forum.php?mod=forumdisplay&fid=60
情色成人小說區【http://www.5280344.com/forum.php?mod=forumdisplay&fid=46
幽默笑話開心區【http://www.5280344.com/forum.php?mod=forumdisplay&fid=51
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
外送地區: 籟nini9595 sy:bjx778

【新北】三重 土城 汐止 新莊 板橋 永和 瀘州 中和 五股 泰山 新店 八里-林口-淡水-龜山萬壽路
【台北】大同 大安 士林 中山 中正 內湖 文山 北投 松山 信義 南港 萬華
【新竹】新竹《東區》竹北
【彰化】員林鎮 鹿港鎮 埔心鄉 和美鎮 溪湖鎮 田尾區 南投市 草屯區 田中鎮 彰化市
【台中】東區 南區 西區 北區 中區 南屯區 西屯區 北屯區 大里 大雅 烏日 豐原 沙鹿 太平
【高雄】左營 三民 苓雅 新興 前鎮 前金 鼓山 楠梓 小港 鳳山
【台南】東區 北區 南區 中西區 永康區-仁德區[/size]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
空姐 模特兒 演藝明星 女主播 護士 女軍官 AV女優 運動員 女學生 促 狂野型 淫蕩型 服務型 外貿型 氣質型 美腿型 甜美型 大奶型 高檔型 特別型 火辣 台北/新竹/台中/彰化/南投/高雄市區 住家、飯店、商汽旅(見到妹妹/滿意金消費) ╭適時點杯台灣好tea╮★╭新鮮出爐ㄉ好茶等你來泡!!絕對驚艷![應有盡有~任君挑選☆服務超優] 臺北/臺中/高雄/彰化/新竹/茶訊論壇/鐘點情人外送茶/找茶喝/找魚論壇/高價正妹外送茶/高價辣妹外送/高價清純學生妹/高價麻豆外送/高價混血正妹外送/出差外叫小姐/外送到府 籟nini9595成人愛愛論壇 大家來找茶 伊利 玩美情人 男人幫 QK情色休閒俱樂部 重車論壇 一夜情 瀘州指壓 成人圖片 李宗瑞 陳自搖 口爆 幼幼 成人貼圖 吳亞馨 中出 顏射 太子 找魚論壇 陳自搖 鬆島楓茶.叫女人.飯店叫辣妹.外約電話.外送人妻辣媽.汐止.瀘州.三重.新莊.南港.林口.龜山外送茶.台北舒壓按摩全套服務外送.援交妹網站.全套服務網站.台北外送茶.外送住家.一夜情.外送鐘點情人外送茶坊台北新竹彰化台中高雄南投彰化旅館飯店叫小姐找炮友最佳選擇地方甜美誘人+性感魅惑+情趣狂野+籟nini9595官網http://5280344.com/情趣比基尼+激情貓裝+性感丁字褲+絲襪/網襪/吊襪帶+俏麗女僕裝+百變護士裝+百變學生服+空姐/OL制服#爆操三點式 #4p #A片 #E罩 #G罩 #一夜情 #一條龍 #丁字褲 #上床 #下體 #中學生 #籟nini9595官網http://5280344.com #人妻 #俱樂部 #做愛 #偷偷 #偷吃 #偷情 #偷拍 #偷食 #兔女郎 #內射 #全裸 #出差 #出水 #初夜 #動漫 #原味?褲 #?? #口交 #口爆 #叫雞 #可愛 #台中 #台北 #台妹 #台模 #台? #台灣 #偷拍 #吃精 #名模 #后入 #吞精 #吸蛋 #啪啪啪 #國中生 #國模 #外國 #外送 #夜店 #大奶奶 #大胸 #大腿 #女主播 #女學生 #女教師 #女模 #女神 #女秘書 #妖精 #嫖妓 #嫩女 #嫩模 #嫩穴 #?生妹 #宅男 #安全套 #寂寞 #射精 #小奶 #小母狗 #籟nini9595官網http://5280344.com #少婦 #巨乳 #平胸 #幼齒 #影片 #後入 #性愛 #情婦 #成人電影 #打炮 #打飛機 #抖音 #按摩 #接吻 #援交妹 #摳穴 #摳逼 #操逼 #旅館 #日本妹 #明星 #校花 #極品 #模特 #模特兒 #歐美 #母狗 #比基尼 #泡澡 #泰妹 #淋浴 #混血 #潮吹 #烏克蘭 #無套 #無碼 #熟女 #爆乳 #發騷 #白嫩 #白富美 #直播 #眼鏡妹 #稚嫩 #空姐 #童? #約炮 #美乳 #美胸 #美鮑 #翹臀 #肛交 #脫衣秀 #藝人 #蘿莉 #裙底 #裸拍 #裸體 #調教 #足交 #跳蛋 #車模 #辣妹 #辣模 #酒店 #野模 #陰道 #電愛 #韓妞 #韓模 #顏射 #飢渴 #騷貨 #高中生 #高挑 #高潮 #黑絲籟nini9595 官網http://www.5280344.comB吃魚網 ... 情人.茶魚網.QK休閒娛樂網.天空論壇.卡提諾論壇. 樂之軒.宅男女神|排行榜|周韋彤|?梓萱|柳岩|pk|台灣|?馨予伊利討論區.伊魚網 e魚網.茶魚飯後.捷克論壇..台灣壇.小女人論壇.吃魚喝茶網anglebaby高圓圓唐嫣許雅涵波多野結衣送茶南投外送茶莊員林外送茶莊嘉義外送茶台南外送茶高雄外送茶莊,按摩美容護膚 桑拿全套外送台北新莊雅緹找小姐/板橋金色年代一夜情交友西門町找小姐喝茶服務台北士林板橋土城喝茶留言版純兼職外送美女外送GTO台中外送茶台北援交外約全套服務,台中,彰化,南投,新竹,台灣外送茶莊,台中茶裏王,桃色誘惑嘉義,台南,高雄一夜情人外約上百位佳麗兼職點點,蘇菲,水靈,溫蒂,小果,歪歪,amy,薇薇,依晨,冰冰,依依,莫琳,虞姬,珊珊,小Q,海倫,夏娃,念念,語嫣,珍欣,米琪,S姐,葉子,娜美,小辣椒,可可,米雪,灣灣,欣萱,笑笑,圓圓,米蘭,羅琳,阿雅,維尼,海薇,千惠,蝴蝶,小舞,糖萱,天心米外送茶坊台北外送茶坊,台中外送茶,高雄外送茶,美女外約服務/台中/高雄/新竹/彰化/南投/全臺外送本土兼職妹妹茶莊極品俱樂部嚴選絕色經典,成人性愛慾茶園,找茶討論區,最強催情唯美貼圖外送,高檔平價 好茶淫照聊天是尋夢園美女外送,情趣用品八大行業指油壓全套,哪裡有好茶,motel,hotel性感絲襪芭比baby小果論壇第一手貓都卡提諾喝茶台北新竹台中高雄彰化外送茶一夜情籟nini9595鐘點情人A片自慰大奶妹日本妹茶/外送茶/ 喝茶/外送茶/論壇慾茶園 壹週刊/北區喝茶外送茶論壇 PLUS 台灣外送茶eyny PC交 愛情公寓天空找炮夜遊區一夜情台南茶高雄茶打炮 大奶正妹 尋夢園

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up