Pluto 是 iOS 上的一个排版渲染引擎,通过 JSON/JS 文件可以很方便地描述界面元素,开发效率很高,并且在流畅度,内存等方便有保证。pluto.oa.com 上有更多详细资料。

Qzone Feed 业务复杂,样式很多。每次新增一种 Feed 样式,开发工作量很大,需要跟版本。样式之间耦合严重,每改一种样式,另一种样式可能会受影响。

基于这样的背景下,Feed Team 急需一个比较成熟的渲染引擎,他至少需要解决以下问题:

1、提升开发效率。

2、样式之间独立,不互相耦合。

3、新增和修改 Feed 样式不需要跟版本。

4、无论采取什么方案,列表的滑动流畅度必需保证至少跟现有的一样。

基于这样的需求,我们重新盘点了市面上比较成熟的排版渲染引擎 ComponentKit,新的开发框架比如 React Native,甚至参考 Android 的排版系统。都难以同时解决上述问题,最终决定我们自己来做一个,一个专注性能和开发效率的排版引擎,Pluto。目前 Pluto 已经应用于 QQ,Qzone 上大部分的空间 Feed 样式,关于 Pluto 和这些现有的排版渲染引擎对比的细节,我后面会说明,我们先来看看 Pluto 用起来是怎么样的。

首先需要一个排版描述:

以上排版数据的结果如下,左边是一个图片控件,右边是文字控件。

想必看到这个 demo,大家应该知道 Pluto 是什么东西了。上面的 JSON 文件阅读起来也非常自然,直接。接下来要解决的问题比较多。这里重点描述点击事件、模板、重用、扩展。分别解决热更新,开发效率,性能优化、功能扩充,四个方面的问题。

点击事件

Pluto 还可以通过 json 描述绑定事件响应的 js 脚本,比如以下 json 文件:

图片组件被点击的时候,可以找到相应的 js 文件,调用 onClick 方法。

模版

一开始的例子中,使用一个 JSON 表达了一个 UI 排版,假如有很多类似的界面元素同时存在,就有很多重复数据的 JSON 文件。这个时候就需要模版特性。比如列表中的每个 Cell,都共享同一个模版,只是填充的数据不一样。以下例子中,将 "imageName" 替换成"${image}",而不是一个具体的图片。然后提供一个字典映射,每一个数据项映射不同的数据,产生不同的视图。

重用

重用是 Pluto 在设计之初就比较重点考虑的一个因素,也是不同于其他引擎的最大的特色。可以说有了这个特性,才能应用在列表等有高性能要求的场景。重用指的是,在 UITableView 等列表控件,在滑动的时候,不同列表项复用同一个 Cell,Cell 里面的视图数据可以重复使用,核心是为了减少创建视图和修改视图树的次数。值得强调的是,Pluto 里面对视图的重用优化,是已经内置的功能,调用方不需要额外操作。

实现原理如下图所示,每个 Pluto 生成的视图中,会包含一个复用池,当使用复用特性时,视图不会被销毁,而是被回收,回收时,其子视图会被放入复用池内,(这里的子视图是一个视图树,即也包含了子视图的子视图)并隐藏起来。复用时,就只需恢复显示,调整宽高,数据等,比创建视图的成本低很多。

扩展

Pluto 内置了一些渲染控件,比如 文字(TextItem),图片(ImageItem),按钮(ButtonItem)。如果这些组件不满足需求,还可以通过扩展组件来完成封装。实现自定义控件的大概流程如下:

在 demo 里面有演示,包含了实现一个自定义视图的更多细节。

特点分析

这里梳理一下 Pluto 的一些特点。

快速:Pluto 的排版性能与直接书写的排版代码性能相差不大。目前在手机 QQ 上跟其他列表相比,流畅度领先。(当然,比 Auto Layout 性能好很多)异步:Pluto 的整个排版,文字渲染流程,都是可以在工作线程执行的,并且线程安全。不会影响用户操作。

描述型排版:Pluto 接收的排版信息是一个字典,二手手机号码买卖平台描述型的表达排版信息,不需要写逻辑代码。做成描述型的好处是:

● 方便维护,不易出错(因为不包含代码)。

● 方便缓存。

● 可以是写成 JSON 格式,通过本地读取,或者后台下发来排版。

● 不可变数据: 在整个排版引擎中,排版数据是不可变的,这意味着很容易维护、测试、缓存、复用以及做到线程安全等等。

缓存和复用:由于排版数据是不可变的,所以内部会进行缓存,这样可以加快整个显示流程。渲染部分则会尽量复用已存在的控件,加快渲染。同时同一个视图的排版数据更新,也会内部做差异化对比,排版流程中也会尽可能地复用旧的排版信息。

模版体系:Pluto 有完整的模版功能。同样的样式只需要书写一次,形成模版,然后根据情况往模版填充不同的数据,可以生成不同的视图。模版之间也可以通过组合来复用。

图文混排:Pluto 支持基础控件的混排,比如 Text 标签,Image 标签,也支持自定义标签和自定义控件。

对比分析

在对比分析之前,我们先 review 一下 Pluto 的使用主场景:一个可以无限加载更多 Feed 的 Feed 列表,要求内存,CPU,流畅度都有不错的表现。

针对这个场景,对比分析现有主流的界面开发库,分别是 Xcode 自带的 Storyboard/Xib,Facebook 主导的开源组件 ReactNative、ComponentKit,以及本文的 Pluto。

● storyboard 是一个可视化的 UI 编辑工具,开发效率比较高。性能上,控件都使用了原生控件,所以性能会差一些。也不支持异步排版,影响流畅度。生成的文件是使用 XML 描述,理论上是可以动态下发,但是 XML 格式不公开,各个版本也不保证兼容,所以比较难做到动态下发。

● React Native 使用 JS+HTML 的方式进行开发,开发效率很高。也有很高的动态性和跨平台特性。但是性能比较捉急,在速度上,内存使用上有一些问题,很难在 Feed 流这种性能要求比较高的地方。

● ComponentKit 跟 Pluto 其实很类似,区别最大的地方在于 Component 不支持 JSON/XML 这种静态表达样式的功能,以及事件动态绑定的功能。在动态性和可维护性方面,会弱很多。我们有思考过在 ComponentKit 的基础上增加 JSON 表达样式的功能。但是 ComponentKit 直接使用了原生视图,并没有一个中间的虚拟视图层,所以性能上也是问题。改造成本太高。

● Pluto 相比 React Native 来说,组件不够丰富,使用 JSON 可以让开发效率在描述排版方面接近 React Native;性能相比其他组件来说很不错;支持异步保证了主线程的流畅度;动态性跟 React Native 一样,不能新增控件,控件都是本地预埋。比较依赖本地代码的逻辑,不能修改本地代码的已有逻辑,但是可以替换一部分。当然,逻辑只能预埋的话,也不会有审核风险。

梳理表格如下:

via:

WeTest

Pluto - iOS 上一个高性能的排版渲染引擎相关推荐

  1. 了解3D世界的黑魔法 - 纯Java构造一个简单的3D渲染引擎

    前言 当今用于游戏和多媒体的3D渲染引擎在数学和编程的复杂性上足以令大多数人望而生畏,从编程接口的OpenGL再到逼真到令人叹为观止的UE5(虚幻五)引擎,后者单单引擎本身(不含调试)的大小就达到了将 ...

  2. 线上报名 | 高性能深度学习推理引擎 TensorRT 实战编程讲解

    NVIDIA TensorRT™ 是一种高性能深度学习推理优化器和运行时提供低延迟和高通量的深度学习推理的应用程序.使用 TensorRT,您可以优化神经网络模型,精确地校准低精度,并最终将模型部署到 ...

  3. OSG三维渲染引擎之OSG简介

    参考书籍<OpenSceneGraph三维渲染引擎设计与实践>,作者王锐,钱学雷 一.场景图形 1.概念 场景图形(Scene Graph)是一种经常用于计算机游戏和图形学相关软件的数据结 ...

  4. 高性能跨平台渲染引擎系列一: 跨平台渲染引擎简介

    引言: 一直工作比较忙,很久就想写点东西做个备忘,拖延至今.本系列也期望督促自己坚持记录分享,文中如有笔误或者理解偏差,欢迎各位指正交流.也期望未来基于该系列文章的相关代码同步到git上,最终完成一款 ...

  5. 基于 Flutter 的 Web 渲染引擎「北海」正式开源!

    简介: 阿里巴巴历时 3 年自研开发的 Web 渲染引擎北海(英文名:Kraken)正式开源,致力打造易扩展,跨平台,高性能的渲染引擎,并已在优酷.大麦.天猫等业务场景中使用. 作者 | 染陌 来源 ...

  6. 优酷播放体验优化实战(四)--“三高”音频渲染引擎设计

    一. 背景 随着高清在用户观影过程中的深度普及,人们已经不仅仅满足于视的享受,更需要听的保证.如何稳定保障音质,甚至增加更多的音效玩法需要一套强大的系统将数据传输.音频实时处理技术.音频输出有效地整合 ...

  7. 浏览器渲染引擎学习总结

    简单介绍浏览器渲染引擎情况 很多人就只会用浏览器,不知道浏览器的工作原理或者说浏览器最核心的东西,浏览器的内核是最核 心的东西,也叫做渲染引擎,那这个东西到底是干嘛的呢,下面本教程就为大家好好介绍一下 ...

  8. 浏览器是怎样工作的:渲染引擎,HTML解析

    2019独角兽企业重金招聘Python工程师标准>>> 渲染引擎 渲染引擎的职责是--渲染,也就是把请求的内容显示到浏览器屏幕上. 默认情况下渲染引擎可以显示HTML,XML文档以及 ...

  9. OSG三维渲染引擎编程学习之十七:“第二章:OSG数学基础” 之 “2.7 世界坐标系、物体坐标系、摄像机坐标系”

    第二章 OSG数学基础 OSG是一个优秀的三维渲染引擎,三维渲染涉及到大量的3D数学知识.3D数学是一门和计算机几何相关的科学,研究怎样用数值的方法来解决几何问题,因此,掌握并灵活运用3D数字知识是O ...

最新文章

  1. 小米miui系统怎么关闭文件管理里的热门视频和表情?
  2. 蓝桥杯国赛-数正方形-java
  3. Python入门100题 | 第012题
  4. Easy Slider: 功能强大简单易用的jQuery滑动门插件
  5. Error loading WebappClassLoader解决方法
  6. 卸载有卸载密码和安全策略的OFFICESCAN客户端(破解)
  7. python通讯录管理系统设计_通讯录程序设计报告
  8. 良心推荐11款可以称得上“神器”的Windows工具集合
  9. Excel中关于数组函数的研究
  10. 程序、进程、作业的联系
  11. Markdown语法介绍(详细)
  12. android studio资源二进制,我如何从二进制转换为Java中的十进制(使用android studio)...
  13. 迷你四足机器人制作_从0到1
  14. 温柔末世,慢慢到来的末日
  15. 语法糖(Syntactic sugar)/ 语法盐(syntactic salt)
  16. Access数据类型和SQL数据类型
  17. 关于Markdown编辑器
  18. java利用redis的setIfAbsent和incr,实现自增,限制总数
  19. 好用的一些功能性网站
  20. Flink 中的木桶效应:单个 subtask 卡死导致整个任务卡死

热门文章

  1. 【Data Mining】机器学习三剑客之Numpy常用用法总结
  2. 主要技术指标简介_期货常用技术指标(五)布林线
  3. html安卓关闭输入面板,tabletpc输入面板关闭不了怎么办(tablet pc输入面板关闭方法)...
  4. 深度学习-Tensorflow2.2-卷积神经网络{3}-卫星图像识别卷积综合实例(二分类)-13
  5. python 深度 视差 计算_OpenCV-Python教程:49.立体图像的深度图
  6. 三、linux目录浏览管理及维护
  7. 货郎问题:回溯法和限界分支法
  8. docker overview
  9. BZOJ1036 (其实这只是一份板子)
  10. (持续更新)webstorm快捷键及术语翻译