开发者社区 > 博文 > 简述大前端技术栈的渲染原理
分享
  • 打开微信扫码分享

  • 点击前往QQ分享

  • 点击前往微博分享

  • 点击复制链接

简述大前端技术栈的渲染原理

  • lu****
  • 2024-11-06
  • IP归属:北京
  • 1浏览
    大前端包括哪些技术栈

    大前端指的是涵盖所有与前端开发相关的技术和平台,应用于各类设备和操作系统上。大前端不仅包括Web开发,还包括移动端开发和跨平台应用开发,具体包括:

    • 原生应用开发:Android、iOS、鸿蒙(HarmonyOS)等;
    • Web前端框架:Vue、React、Angular等;
    • 小程序开发:微信小程序、京东小程序、支付宝小程序等;
    • 跨平台解决方案:React Native、Flutter、Taro、Weex等。
    什么是渲染
    • 渲染:在计算机中,渲染是指将计算机程序中的图形数据(三维模型、纹理、光源等)通过计算和图形处理技术,最终转化为图像的过程。这个过程不仅限于静态图像的生成,也包括动画和视频的渲染,以实现逼真的视觉效果。
    • 渲染原理:是指将代码转换为用户可以看到的UI界面的过程。如在Web前端领域,渲染原理主要涉及如何将HTML、CSS和JavaScript等代码转化为用户界面上的实际显示效果。这个过程通常包括解析、布局、绘制等步骤,具体根据不同的平台有不同的实现方式,渲染引擎也有所不同。‌
    Android渲染原理

    Android的渲染引擎负责将应用程序的用户界面渲染到屏幕上。其中的核心组件包括:

    • SurfaceFlinger‌:负责合并来自不同应用程序的图形输出,并将其组合成一个屏幕图像。它管理着EventControlThread、DispSyncThread等线程,以及处理VSYNC信号,确保UI的平滑显示‌;
    • Skia:Android的2D图形库,用于绘制应用程序的用户界面;Skia实现了Canvas系统,可以处理矢量图形、文本和位图等不同类型的绘图需求。
    • OpenGL ES/Vulkan: 两种主要的图形API,用于处理高性能的3D渲染;OpenGL ES是移动设备上常用的图形API标准,而Vulkan是较新的高效低开销图形API。
    • Hardware Composer (HWC):HAL(Hardware Abstraction Layer)组件,可与GPU和显示器直接交互;它处理来自SurfaceFlinger的图层,并决定如何高效地组合这些图层。
    • Gralloc:图形缓冲区分配器,它负责管理内存从不同的图形组件(如SurfaceFlinger、应用程序)之间的共享和分配。通过Gralloc,多个图形组件可以有效地在共享的缓冲区上进行绘制操作。
    • RenderThread:这是UI渲染pipeline的一个重要部分,特别是对于绘制复杂UI的应用程序;它运行在一个独立的线程上,以处理资源密集型的渲染任务,避免阻塞主线程。
    • Choreographer‌:通过内部的FrameDisplayEventReceiver接收VSYNC信号,统一处理InputEvent、Animation和Traversal等任务。它负责协调UI的绘制,确保在每个VSYNC信号到达时执行必要的绘制操作
    • GLSurfaceView: 提供一个OpenGL ES绘图表面,并且可以将OpenGL的绘图命令路由到相关的GL context中;通常用于实现高级别的3D图形渲染。
    • TextureView:可以在应用程序中作为一个UI组件来显示内容,如视频和其他动画,它内部使用Texture来高效管理。
    • WebView: 用于处理H5页面显示的组件,它内部不仅涉及HTML渲染,还包含图形渲染组件。

    View和ViewGroup是应用框架层的核心组件,View是界面的基本元素,而ViewGroup是View的容器。渲染引擎通过遍历View树,计算每个View的大小和位置,并将其绘制到屏幕上。主要涉及以下几个步骤:

    • 测量(Measurement):在这个阶段,渲染引擎会遍历View树,并调用每个View的onMeasure方法来计算其大小。这个过程会从上到下(从根View到子View)进行,以确保每个View都根据其父View的大小约束来确定自己的大小。
    • 布局(Layout):通过XML布局文件或者Java/Kotlin代码定义View层级,系统解析后会生成相应的View树,在测量阶段完成后,渲染引擎会进入布局阶段。在这个阶段,它会调用每个View的onLayout方法来确定其在屏幕上的位置。这个过程同样是从上到下进行的,以确保每个View都被放置在正确的位置上。
    • 绘制(Draw):渲染引擎会遍历View树,并调用每个View的onDraw方法来将其内容绘制到屏幕上。这个过程可能会使用到GPU加速来提高绘制效率。
    • 合并图层(Layer Merge):将不同视图的图层合并为最终的显示图像。
    • 显示到屏幕(Display to Screen):将合并后的图像显示到屏幕上。

    Android的渲染过程是自上向下的递归测量和布局过程,Android 系统的渲染管道充分利用了多线程、硬件加速和显示同步技术,确保流畅的用户体验。从应用程序定义的界面,经过 View 系统层的绘制,到 GPU 硬件加速实现,再到最终合成显示。这些组件共同承担了将应用程序的图形内容高效地显示到设备屏幕上的任务,确保图形渲染的高效性和稳定性。

    iOS渲染原理

    iOS 的渲染原理是核心组件的共同协作,实现高效且流畅的界面显示;主要核心组件包括:

    • UIKit/Core Animation层:UIKit 中的所有界面元素都是基于 UIView 和 CALayer 的,它们共同起作用来描述并管理视图的层级关系和属性(例如背景颜色、边框、阴影等);DisplayLink是解决屏幕刷新率问题,DisplayLink在每次屏幕刷新前会调用回调函数,保证整个渲染过程的刷新频率与屏幕刷新频率同步,确保帧率。
    • Core Animation:Compositing是在代码执行修改界面的属性之后,UIKit 会将这些修改提交给 Core Animation,后者会将这些属性变化组合在一起,并生成一个光栅化的视图图像。这些图像然后会被传递到合成器进行处理。Animation是Core Animation 负责处理动画效果,通过离屏渲染和硬件加速来提高性能,这样保证界面动画的流畅性和稳定性。
    • Render Server:Layer Tree是当应用程序将信息提交给 Core Animation,Core Animation 会将这些信息发送到一个叫作 Render Server 的后台进程。Render Server 会处理这个层级树(Layer Tree),并对其进行必要的合成和绘制操作。打包成二进制元数据,发送到GPU进行实际渲染,Render Server打包所有的Layer信息并发送到GPU进行实际的渲染处理。
    • Metal/ OpenGL ES:绘制指令是Render Server 将合成后的层(Layer)提交给 Metal 或 OpenGL ES,这些渲染框架会根据指令调度图形处理单元(GPU)进行实际的绘制操作。它们负责将高层次的绘图指令转换为低层次的 GPU 指令。
    • GPU 渲染:GPU 负责执行这些绘图指令,把每一帧绘制到屏幕缓冲区。GPU加速能够显著提高图形的绘制效率和性能。
    • VSync 和 Framebuffer:VSync(垂直同步)是为了避免屏幕撕裂现象,iOS 使用 VSync 机制。VSync 会在屏幕刷新期间触发通知,使应用程序和 Render Server 知道什么时候该提交新的一帧数据。
    • Framebuffer是GPU 完成渲染后,帧缓冲区 (Framebuffer) 中的内容被送到显示控制器,最终显示在屏幕上。

    整个过程是 CPU 和 GPU 的协作工作,分阶段地处理和优化每一帧的渲染,确保最终的显示效果流畅、精美;此外,通过使用硬件加速和高效的渲染算法,iOS 渲染系统能够在保持高性能的同时节省设备的电力消耗;而绘制流程主要包括布局、绘制和渲染,如下:

    • 布局阶段‌:在iOS中,布局是通过Auto Layout系统实现的,这是一个基于约束的布局系统,它根据视图及其子视图的约束条件计算位置和大小。当约束条件发生变化时,Layout Engine会重新计算视图的位置和大小,这个过程称为布局‌;布局阶段涉及到视图的层级关系设置,包括视图的位置、大小、背景色等属性。这个阶段还包括了计算和设置视图的frame,这是通过约束的计算来确定的‌。
    • 绘制阶段‌:绘制阶段涉及到将视图的内容绘制到屏幕上。这包括调用drawRect:drawLayer:inContext:等方法,这些方法在视图需要重绘时被调用‌。在这个阶段,视图会将其内容绘制到图层上。每个UIView对象都有一个layer属性,指向一个CALayer类的对象,视图会将自己绘制到这个图层上‌。
    • 渲染阶段‌:渲染阶段是将绘制好的图层内容呈现到屏幕上。这个过程涉及到图层的提交、核心动画的处理、OpenGL几何形状的设置以及最终的屏幕渲染‌。渲染阶段主要由GPU执行,而布局和绘制阶段主要由CPU处理。CPU和GPU的协同工作使得iOS设备的图形渲染高效且流畅‌。
    鸿蒙渲染原理

    鸿蒙系统(HarmonyOS)是华为开发的一种微内核操作系统,用于包括智能手机、平板、智能手表、物联网设备等。鸿蒙系统的渲染原理涉及多个方面,主要包括UI渲染、图形处理和硬件加速等。鸿蒙采用了分布式架构设计,可以实现一次开发,多端部署。

    鸿蒙的渲染流程包括以下几个步骤:

    1. ArkUI声明式UI:开发者使用ArkUI编写界面描述文件。
    2. 编译生成Render Node树:将ArkUI文件编译成中间表示形式Render Node树。
    3. 生成VNode树:将Render Node树转换为VNode树,用于虚拟DOM的管理和更新。
    4. 渲染合成:根据VNode树的数据结构和属性信息进行绘制操作,最终输出到屏幕上。

    鸿蒙的亮点在于提供了分布式UI能力,即可以在多个设备上进行协同渲染,让UI不仅局限于一个设备上运行,而是分布式地在多个终端设备上共同运行,从而提升性能和用户体验。

    Vue渲染原理

    Vue.js是一款JavaScript框架,用于构建用户界面;Vue的渲染原理基于虚拟DOM技术;当组件的状态发生变化时,Vue会创建一个新的虚拟DOM树来反映这些变化;然后,Vue会比较新老虚拟DOM树的差异,并计算出最小的修改量来更新实际的DOM结构,其渲染流程包括以下主要步骤:

    • 初始化当创建 Vue 实例时,Vue 会进行初始化,包括绑定数据、计算属性、方法和侦听器。响应式系统会将数据对象转换为响应式对象,并初始化模板编译器和渲染函数。
    • 解析模板:Vue首先会解析模板,并生成一个抽象语法树(AST)。这个过程中,Vue会将模板中的指令和属性转换为对应的AST节点。
    • 生成渲染函数:Vue根据AST生成一个渲染函数,该函数用于生成虚拟DOM树。渲染函数是一个JavaScript函数,用于生成VNode(Vue的虚拟DOM节点)并将其渲染到真实的DOM树上。
    • 执行渲染函数:当组件的状态发生变化时,Vue会重新执行渲染函数,生成一个新的虚拟DOM树。
    • 对比新旧虚拟DOM树:Vue会对比新旧虚拟DOM树的差异,找出需要更新的部分。这个过程通过Vue内部的“diff”算法实现,该算法会对比新旧虚拟DOM树的结构和属性,找出差异。
    • 更新DOM:根据差异更新真实的DOM树。Vue会最小化DOM操作的次数,只更新需要变化的部分,而不必重新渲染整个页面。

    Vue的渲染原理通过响应式系统和虚拟DOM协同工作,实现了高效的数据绑定和灵活的视图更新策略。我们只需关注数据的变化,Vue会自动处理视图的更新,大大提高了开发效率和用户体验。

    React渲染原理

    React的渲染原理有几个核心概念:Virtual DOM(虚拟DOM)、Reconciliation(协调)。

    • Virtual DOM:Virtual DOM是React用来描述真实DOM树的一个JavaScript对象树,其结构和真实的DOM树一一对应。当组件的状态(state)或属性(props)发生变化时,React不是直接操作真实的DOM树,而是在内存中创建一个新的Virtual DOM树。
    • Diffing 算法:React通过比较新旧Virtual DOM树的差异(使用Diff算法),来确定哪些部分需要更新,并只对更新的部分进行对应的DOM操作,从而提高了渲染效率。
    • Reconciliation:当组件状态或属性发生变化时,React需要调用Reconciliation算法来决定哪些DOM节点需要更新以及如何更新。Reconciliation算法的基本流程包括比较新旧Virtual DOM的根节点,判断是否可以复用,以及根据节点的类型和属性进行更新或替换。React采用递归遍历的方式来比较新旧Virtual DOM,这也是为什么更新操作不适合过于频繁的原因,因为递归遍历是一个高消耗的操作。

    React的渲染流程可以大致分为两个阶段:render阶段和commit阶段。

    • render阶段:在这个阶段,React会调合(reconcile)虚拟DOM,计算出最终要渲染出来的虚拟DOM。这个过程包括生成Fiber对象、收集副作用、找出哪些节点发生了变化,并打上不同的flags。Diff算法也是在这个阶段执行的。render阶段的工作都是在内存中进行的,计算出更新后的Fiber树,但在这个阶段并没有更新UI,视图不会有任何更改。
    • commit阶段:在这个阶段,React会根据上一步计算出来的虚拟DOM,同步地渲染具体的UI。渲染器(Renderer)会根据协调器(Reconciler)计算出来的虚拟DOM,同步地渲染节点到视图上。这个过程是同步执行的,不可以被打断。

    React的渲染原理通过Virtual DOM和Reconciliation算法,以及调度器、协调器和渲染器的协同工作,实现了高效、可靠的UI更新。

    小程序渲染原理

    小程序(这里以微信小程序为例,其它大同小异)的渲染原理主要如下:

    ‌微信小程序采用了双线程模型,将渲染和逻辑处理分离到不同的线程中,从而提高了渲染速度和效率。具体来说,渲染层负责页面的渲染和绘制工作,而逻辑层则负责处理小程序的业务逻辑和数据处理。

    • 渲染层:负责将WXML模板和WXSS样式解析并生成最终的页面。渲染层会构建DOM树和样式表,并通过底层的图形系统进行绘制和显示;
    • 逻辑层:使用独立的JSCore作为运行环境,执行小程序的JavaScript代码,处理用户的输入和事件,并更新页面的状态。逻辑层与渲染层之间通过特定的通信机制进行数据传输和事件通知。

    渲染流程主要包括解析和编译、预加载、页面渲染和绘制与显示,具体如下:

    • 解析和编译‌:当用户打开小程序时,小程序框架首先对小程序的代码进行解析和编译。这一过程包括将小程序的代码转换成可执行的指令,并生成对应的数据结构,如页面树和组件树。解析和编译过程需要消耗一定的时间,但在后续的页面渲染中能够大大提高效率。
    • 预加载‌:在解析和编译完成后,小程序框架进行预加载。预加载是指在用户进入具体页面之前,提前加载可能需要使用的资源,如图片、样式文件等。通过预加载,小程序能够在用户切换页面时减少加载时间,提高渲染速度。
    • 页面渲染‌:当用户进入具体页面时,小程序框架将页面树和组件树渲染到屏幕上。渲染过程包括计算每个组件的位置和尺寸、应用样式和布局,并生成最终的绘制指令。
    • 绘制与显示‌:小程序框架将渲染得到的绘制指令交给底层的图形系统进行绘制。图形系统会将指令转换成图像,并显示在屏幕上。

    微信小程序的渲染原理是一个基于双线程模型的高效渲染过程,通过渲染层和逻辑层的分离与协同工作,实现了页面的快速渲染和流畅的用户体验。

    ReactNative渲染原理

    React Native是基于React技术栈开发跨平台移动应用的一种框架;React Native的渲染原理主要涉及JavaScript线程与原生线程的交互,以及React的Virtual DOM(虚拟DOM)机制。其渲染原理如下:

    • JavaScript线程与原生线程的交互:React Native在JavaScript线程中运行JavaScript代码,包括React组件的渲染逻辑;当JavaScript线程计算出需要进行UI更新时,这些更新会被序列化并通过一个叫做Bridge的机制发送给原生线程;原生线程接收到更新后,会负责实际的UI绘制和更新操作,包括创建和更新原生UI组件。
    • Virtual DOM机制:React Native利用React的Virtual DOM机制来优化UI的更新;当组件的状态或属性发生变化时,React Native会在JavaScript线程中创建一个新的Virtual DOM树;然后,React Native会使用Diff算法比较新旧Virtual DOM树的差异,找出需要更新的部分;只有差异部分会被通过Bridge发送给原生线程进行更新,从而减少了数据传输量,提高了性能。

    React Native的渲染流程主要包括以下几个步骤:

    • 组件渲染:在JavaScript线程中,React Native组件的render方法会被调用,生成对应的Virtual DOM描述。这个描述会被React的渲染系统用来构建组件树。
    • Diff算法比较:当组件的状态或属性发生变化时,React Native会使用Diff算法比较新旧Virtual DOM树的差异。这个过程会找出需要更新的部分,并准备相应的更新指令。
    • 数据序列化与传输:更新指令会被序列化为原生线程可理解的数据格式。然后,这些数据会通过Bridge机制发送给原生线程。
    • 原生UI更新:原生线程接收到更新指令后,会解析这些指令并应用到实际的UI控件上。这包括创建新的原生UI组件、更新现有组件的属性或移除不再需要的组件等。
    • 渲染结果展示:经过原生线程的处理后,UI的更新会实时反映在移动设备的屏幕上。用户可以看到最新的界面效果,并根据需要进行进一步的交互。

    React Native的渲染原理和主要流程通过JavaScript线程与原生线程的紧密协作,以及Virtual DOM和Diff算法的优化,实现了在JavaScript中编写UI代码并在App原生环境中高效渲染的能力。这种机制不仅提高了应用的性能,还降低了跨平台开发的复杂性和成本。

    Flutter渲染原理

    Flutter是Google推出的开源UI框架,主要用于多平台的应用开发。其渲染原理是构建跨平台应用的关键部分,主要基于其独特的三层树结构:Widget树、Element树和RenderObject树(或称为渲染树)。这三层结构的设计旨在优化性能,减少不必要的重绘和重建。

    • Widget树:Widget是Flutter中用户界面的不可变描述,是构成Flutter应用程序的基本元素。Widget树是存放渲染内容的配置数据结构,创建非常轻量,在页面刷新的过程中随时会重建。
    • Element树:Element是Widget树和RenderObject树之间的中间层,负责将Widget树的变化抽象化,并管理RenderObject的复用。Element持有Widget的引用,并可以对其属性进行修改,而不是完全重建整个树。
    • RenderObject树(渲染树):RenderObject树用于应用界面的布局和绘制,保存了元素的大小、布局等信息。RenderObject的创建和销毁相对耗能,因此Element树会缓存RenderObject对象,以便在需要时复用。

    Flutter的渲染流程主要包括以下几个阶段:

    • 构建(Build):Flutter框架根据Widget树中的变化调用每个Widget的build方法;build方法返回一个新的Widget,表示当前Widget的最新状态;此阶段主要确定哪些Widget需要更新。
    • 布局(Layout):在构建阶段之后,Flutter框架执行布局过程;为每个需要更新的Widget确定其在屏幕上的位置和大小;调用每个Widget的layout方法,根据其约束条件(如最大宽度、最小高度等)计算出最佳的位置和大小。
    • 绘制(Paint):布局阶段完成后,Flutter框架执行绘制过程;根据每个Widget的布局信息将其绘制到屏幕上;调用每个Widget的paint方法,将Widget的内容绘制到一个离屏的Canvas上。
    • 合成(Compositing):在绘制阶段完成后,Flutter框架执行合成过程;将所有已绘制的Canvas组合成最终的显示图像;调用每个Widget的compositing方法,将它们的绘制结果合并到一起。
    • 显示(Display):合成阶段完成后,Flutter框架将最终的显示图像发送给硬件,将其显示在屏幕上。

    综上所述,Flutter的渲染原理通过三层树结构的设计和优化,实现了高效、流畅的跨平台应用界面渲染。

    Taro渲染原理

    Taro框架的核心思想是通过将Vue或React中编写的代码进行抽象和统一规范,然后映射到不同的平台上,通过组件化的方式实现统一代码覆盖多个平台。这种方式大大提高了代码的复用率和开发效率。主要如下:

    • 统一抽象规范:Taro框架定义了一套跨平台的组件、事件、CSS样式等规范,使得在编写React代码时,能够通过这些抽象出来的规范来编写,从而实现跨平台的兼容性。
    • 代码转换:Taro框架为不同的平台提供对应的代码转换工具,将抽象的React代码转换为应该在目标平台上运行的代码。这一步骤是Taro实现跨平台渲染的关键。
    • 统一API:将不同平台上的API进行兼容性处理和封装,使得在不同平台上的开发人员都可以通过同样的API进行开发。这样做不仅降低了开发难度,还提高了开发效率。
    • 差异化处理:针对不同的平台特性,Taro框架进行了特定平台的定制化开发,充分利用不同平台的特性,提供更多丰富的功能支持。这种差异化处理使得Taro框架在不同平台上都能发挥出最佳的性能。

    而渲染技术主要包括以下几个方面:

    • 虚拟DOM:React或Vue使用虚拟DOM来提高页面渲染的性能。虚拟DOM是在内存中维护的一个轻量级的JavaScript对象树,它表示了真实的DOM结构。通过比较新旧虚拟DOM的差异,然后只更新实际DOM中需要改变的部分,从而避免不必要的DOM操作,提高渲染效率。
    • 事件处理:Taro框架对事件处理进行了跨平台封装,使得开发者可以使用统一的API来处理不同平台上的事件。这种封装方式简化了事件处理的复杂度,提高了开发效率。
    • Prerender技术:Prerender是由Taro CLI提供的一种技术,用于提高小程序页面初始化的渲染速度。它通过将页面初始化的状态直接渲染为无状态的wxml,在框架和业务逻辑运行之前执行渲染流程,从而提高页面的加载速度。Prerender技术的实现原理与服务端渲染类似,但它是针对小程序端进行的优化。

    Taro框架的渲染原理主要基于React或Vue的跨平台渲染技术,通过统一抽象规范、代码转换、统一API和差异化处理等手段实现代码的跨平台复用和高效渲染;Taro还提供了Prerender等技术来优化页面加载速度,提升用户体验。基于这些技术使得Taro框架成为了一个功能强大、易用、跨平台兼容的开发框架。

    浏览器的渲染原理

    浏览器的渲染原理是一个复杂的过程,涉及到多个组件和线程的协作,才能确保网页能够正确、快速地显示在用户面前。浏览器渲染原理主要如下:

    • 浏览器的主要组件
      • 界面控件:包括地址栏、前进后退按钮、书签菜单等,这些是用户与浏览器交互的界面部分。
      • 浏览器引擎:它是浏览器的核心,负责协调各个组件的工作,处理用户的请求和操作。
      • 渲染引擎:它负责解析HTML、CSS,构建DOM树和Render树,最终将网页内容呈现给用户。
      • 网络组件:它负责发送HTTP请求,获取网页资源。
      • JS解释器:它用于解析执行JavaScript代码,实现网页的动态效果。
      • 数据存储持久层:它用于存储cookies、localStorage等数据。
    • 浏览器的多进程架构
      • 隔离性:每个标签页运行在独立的进程中,避免了一个标签页崩溃影响到其他标签页。
      • 安全性:不同进程之间不共享资源和地址空间,减少了安全隐患。
    • 浏览器的主要线程
      • GUI渲染线程:它负责渲染浏览器界面HTML元素,当界面需要重绘或回流时,该线程会执行。
      • JavaScript引擎线程:它负责解析执行JavaScript代码,与GUI渲染线程互斥,确保DOM操作的安全。
      • 定时触发器线程:它负责计时并触发定时事件。
      • 事件触发线程:它将事件添加到待处理队列中,等待JS引擎处理。
      • 异步http请求线程:它负责处理XMLHttpRequest请求,将状态变更事件放入JS引擎的处理队列中。
    • 渲染流程
      • 解析HTML,构建DOM树:当用户输入网址或点击链接时,浏览器会向服务器发送请求,获取网页的HTML文件。浏览器开始解析HTML文件,将其转换为浏览器能够理解和操作的文档对象模型(DOM)树。DOM树是由HTML标签和它们的层级关系组成的树状结构,表示了网页的结构和内容。
      • 样式计算(CSSOM树构建与渲染树生成):CSSOM树构建,浏览器解析CSS文件或<style>标签中的样式信息,将其转换为浏览器能够理解的样式表对象模型(CSSOM)树。CSSOM树表示了文档中所有元素的样式信息。渲染树生成:浏览器将DOM树和CSSOM树合并,形成渲染树(Render Tree)。渲染树是DOM树的一个可视化表示,只包含需要显示的节点和这些节点的样式信息。
      • 布局:浏览器根据渲染树中的信息,计算每个节点的几何信息(如位置、大小等),并生成布局树(Layout Tree)。布局阶段会确定页面上所有元素的位置和大小,确保它们能够按照预期的方式排列。
      • 分层:为了更高效地渲染页面,浏览器会对布局树进行分层处理,生成分层树(LayerTree)。拥有层叠上下文属性(如定位属性、透明属性、CSS滤镜、z-index等)的元素会被提升为单独的图层。分层有助于浏览器进行并行绘制,减少重绘和重排的开销。
      • 绘制:浏览器遍历分层树中的每个图层,使用图形库将图层的内容绘制成图像。绘制阶段会生成一个绘制列表,该列表包含了绘制每个元素所需的指令和顺序。绘制操作是由渲染引擎中的合成线程来完成的。
      • 合成显示:合成线程将图层划分为图块(tile),并将图块转换为位图(通过栅格化操作)。栅格化操作通常使用GPU来加速生成位图。一旦所有图块都被栅格化,合成线程就会生成一个绘制图块的命令(DrawQuad),并将该命令提交给浏览器进程。浏览器进程根据DrawQuad命令生成页面,并将其显示到屏幕上。
      • 交互处理:当用户与页面进行交互(点击、滚动、输入等)时,浏览器会更新渲染树,并重新进行布局和绘制。

    浏览器的渲染原理是涉及资源的加载、解析、构建DOM和CSSOM树、布局、绘制、合成以及交互处理等多个步骤;涉及多线程处理、缓存机制、‌DNS解析、‌TCP连接等,确保了网页的快速、稳定、高效渲染。

    它们的相同点与不同点
    • 相同点
      • 层次结构:所有技术栈都基于某种形式的树状结构来管理UI组件。
      • 测量和布局:渲染过程通常包含测量、布局、绘制阶段。
      • 更新机制:大多数框架都采用某种形式的Diff算法来优化DOM更新,以提高性能。
    • 不同点
      • 运行环境不同:APP运行在操作系统之上,具有更高的权限和更丰富的系统资源;H5页面是基于浏览器渲染,受到浏览器沙箱模型的限制;小程序受到宿主环境类浏览器环境的限制。
      • 渲染机制不同:APP渲染通常涉及到底层的图形渲染接口(如Skia、OpenGL等),可以直接与GPU交互;而浏览器渲染则主要依赖于HTML、CSS和JavaScript等前端技术,并通过浏览器引擎(如Blink、Gecko等)进行渲染。iOS和Android利用GPU进行硬件加速渲染,大大提升复杂UI的绘制性能。Web前端如Vue和React采用虚拟DOM和Diff算法来更新UI。小程序等跨平台框架通常需要在逻辑层与视图层之间进行桥接通信。Web和小程序通常依赖浏览器或宿主环境的渲染引擎。
      • 性能优化不同:APP渲染可以利用操作系统的特性进行更深入的性能优化(如硬件加速、内存管理等);而浏览器渲染则受到浏览器引擎和前端技术的限制,在性能优化上可能相对较弱。
      • 跨平台性不同:APP需要针对不同的操作系统和设备进行开发和适配;而浏览器渲染则具有更好的跨平台性,可以在不同的浏览器和设备上运行。
      • 协同渲染:鸿蒙OS的分布式UI能力允许跨设备协同渲染,而其他框架通常只在单个设备上进行渲染。

    综上所述,APP渲染、H5页面渲染、小程序渲染在多个方面存在多个区别。这些区别源于它们不同的运行环境、渲染机制、性能优化和跨平台性等因素。

    随着技术的发展,大前端的各种技术栈不断涌现,各自发展出了适合自身特性的渲染机制。不同技术栈在各自的应用领域都有独特的优势和适用场景,我们根据项目需求和团队情况选择合适的技术栈,可以更高效地实现高性能的UI和良好的用户体验。

    文章数
    2
    阅读量
    2