浅谈移动端 View 的显示过程

  • 时间:
  • 浏览:3

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

measure 整体流程的法律法律依据调用链如下:

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

时需注意的是,View 的 onDraw() 法律法律依据是空的,这是因为每个视图的内容有的是相同,这个 每种交由子类根据自身的时需来处理,才更加合理:

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

4.通知 SurfaceFlinger 图层合成;

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

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

2.EXACTLY

调用 getDefaultSize() 法律法律依据来获取视图的大小:

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

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

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

在performTraversals() 法律法律依据的测量过程随后随后开始 后,进入 layout 布局过程:

在进入该法律法律依据后,我们都都能这样发现上面是空的,这是因为子视图的具体位置是相对于父视图而言的,所以 View 的 onLayout 为空实现。

如上图所示,在三缓存机制中,当 A 缓存被 Display 使用、B 缓存被 GPU 处理时,系统会发出 Vsync 信号,并加入新的缓存 C ,用来缓存下一帧的内容。这个 法律法律依据我嘴笨 这样完全处理 A页面的重复显示,否则都都可不能能让上面页面的显示更加平滑。

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

如上图所示,在这样 VSync 的情况下,会再次无缘无故出现时需显示第二帧时,其尚未处理完成的情况,否则Display 中显示的仍是第一帧。这会造成该帧显示时长超过16ms,从而因为页面卡顿的问题图片。

再进入 ViewGroup 类中查看,我们都都能这样发现,这我我嘴笨 是一另还还有一个抽象的法律法律依据,在一另还还有一个的情况下, ViewGroup 的子类便时需重写该法律法律依据:

从上图中我们都都能这样看出,每隔 16ms ,安卓会发出一另还还有一个 VSync 信号,收到信号后 CPU 随后随后开始 处理下一帧的的内容,GPU 在 CPU 处理随后随后开始 事先,因为进行光栅化,此时屏幕上显示的是上一帧因为处理完成的页面。这样反复,就能这样在页面中展示一幅幅的指定画面。而确保画面流畅的前提是CPU 和 GPU 处理一帧所花费的时间这样超过 16 ms,否则就会再次无缘无故出现以下情况:

2.CPU 将数据上传(共享因为拷贝)给 GPU 。(PC 上一般有显存,否则 ARM 这个 嵌入式设备内存一般是 GPU 、 CPU 共享内存);

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

3.通知 GPU 渲染。一般而言,真机不让阻塞等待歌曲 GPU 渲染随后随后开始 ,通知随后随后开始 后就返回执行否则 任务;

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

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

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

3.在制作方面

LCD使用的是无机材料, OLED 则时需使用有机材料,否则 OLED的制作费用更高,否则使用寿命不如 LCD 。

performLayout(lp,desiredWindowWidth,desiredWindowHeight);

在电子屏幕中显示的图片,我我嘴笨 有的是由一另还还有一个个“小点”所组成的,哪几种“小点”被称为“像素点”。每一另还还有一个像素点有的是被委托人的颜色,每一张完全的图片有的是由它们相连拼接形成的。

控件测量过程从 performMeasure() 法律法律依据随后随后开始 。在该法律法律依据中childWidthMeasureSpec 和 childHeightMeasureSpec,分别是用来选折 速率和速率的。

我们都都通过 setFrame() 法律法律依据给还还有一个变量赋值,判断 View 的位置否有变化以及否有时需重新进行 layout,否则其中还调用了 onLayout() 法律法律依据。

此外,在第还还有一个 Display 中,因为 A Buffer 还在被 Display 所使用,这样在收到 VSync 信号随后来随后开始 处理下一帧的页面,因为该时间段内 CPU 的闲置。为了处理这个 时间的浪费,三缓存机制由此再次无缘无故出现:

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

与现在的平板电视不同的是,事先的黑白电视机因为大背投彩电,无缘无故带着大大的“后背”。“大后背”电视我我嘴笨 而是 阴极射线管电视机,俗称显像管电视。其成像原理是电子枪发射出的电子束(阴极射线)通过聚焦系统和偏转系统,射向屏幕上涂有荧光层的指定位置。被电子束轰击的每个位置,荧光层一定会产生一另还还有一个小亮点,最终小亮点们因为组成一幅幅影像,显示在电视屏幕上。



在 onMeasure() 法律法律依据中:

2. 在耗电量方面

LCD的耗电量较高,即使只显示一另还还有一个亮点,LCD 的背光源也时需无缘无故发光,否则容易再次无缘无故出现漏光问题图片。而OLED的每个像素都能独立工作,否则 能这样自行发光,否则采用OLED的设备能这样制作得更薄,甚至能这样弯曲。

当CPU 和 GPU 处理一帧的时间超过了16 ms时,在第一另还还有一个 Display 中,因为 GPU 处理 B 画面的时间过长,因为系统发出 VSync 信号时, Display这样及时地显示出 B 画面,而重复显示A页面,造成卡顿。

随着科技的不断进步,电视、手机、电脑的体积这样薄,射线管显像法律法律依据也逐渐被淘汰。目前在手机市场上处在主流地位的是 LCD 和 OLED 并有的是屏幕。

5.SurfaceFlinger 随后随后开始 合成图层。

上图展示的是一另还还有一个完全的页面渲染过程。通过上图,我们都都能这样初步了解每一帧页面从代码布局的编写到展示给使用者,其转过身的逻辑是怎么能能一步一步执行的。

1.UNSPECIFIED

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

在这样统一的 API 事先,开发者时需在各式各样的图形硬件上编写各种自定义接口和驱动线程池池,工作量极大。

不过以上而是 一另还还有一个简单控件的一次 measure 过程,在真正测量的过程中,因为一另还还有一个页面往往含有多个子 View ,所以时需循环遍历测量,在 ViewGroup 中一另还还有一个 measureChildren() 法律法律依据,而是 用来测量子视图的:

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

MeasureSpec 是一另还还有一个 int 值,它存储着一另还还有一个信息:低 300 位是 View 的 specSize,高 2 位是 View 的 specMode。

而在这样 VSync 的情况下因为会再次无缘无故出现以下情况:

这也是事先大电视机的屏幕都呈圆弧形的因为。因为越接近圆形,边长到中心的距离越相近,呈像越均匀。那为哪几种当磁铁贴近电视机时,会让电视机的成像再次无缘无故出现问题图片呢?那是因为磁铁会干扰电子束的正常轨迹,否则在贴近屏幕的事先,也因为使得屏幕的荧光层磁化,再次无缘无故出现一另还还有一个个不正常的光斑。

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

如上,layout() 法律法律依据接收了还还有一个参数,按照顺时针,分别是左上右下。该坐标针对的是父视图,以左上为起始点,传入了事先测量出的速率和速率。事先,我们都都都进入到 layout() 法律法律依据中观察:

1. 两者成像原理不同

LCD 是靠白色的背光穿透彩色薄膜显色的,而 OLED 则是靠每个像素点自行发光。

我们都都有的是使用手机 APP 的过程中,发现页面再次无缘无故出现卡顿问题图片,这样极有因为是页面这样在 16ms 内更新因为的。实际上,人眼与大脑之间的合作协议无法感知超过 300fps 的画面更新。300fps 大慨是每秒 300 帧,这样每个页面时需在 30000/300 = 16ms 内更新为否则 页面,才不让我们都都都感受到页面的卡顿。

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

父视图对子视图这样任何限制,能这样将视图按照开发者的意愿设置成任意的大小,在一般开发过程中不让用到。

3.AT_MOST

观察 View 的 measure() 法律法律依据,能这样发现该法律法律依据是被 final 修饰的,否则 View 的子类这样够通过重载 onMeasure() 法律法律依据来完成被委托人的测量逻辑。