渲染兼容性与支持度优化
Office 格式总计3千多个属性点,属性与属性之间可以嵌套和组合,经过嵌套和组合之后,文档显示效果的多样性呈指数级上升。一方面我们对已支持属性的代码实现高度抽象,另一方面得益于大量用户的问题反馈,经过团队8年来持续打磨, 渲染兼容性及支持度效果受到广泛认可。
性能与稳定性优化
稳定的渲染管线,离不开优秀的引擎线程模型设计。基于团队设计的模型,并结合多层 cache 来保证渲染管线的流畅,我们解决了整个管线的卡顿问题,提升了打开速度和渲染速度。
移动端浏览文档,是一个快速的消费场景,用户超过7s无法打开文档,流失率大大增加。Office 文档引擎在设计之初,我们的目标即是在移动终端将体验和性能做到极致。目前文档浏览引擎在打开速度,打开成功率,都已经达到了业界领先水平。
打开速度:大小文档均可以“秒开”,平均打开耗时约500ms。
打开成功率:总文件稳定维持在 99.96%+。
内存优化
Office 引擎的内存优化
压缩包流式解析(按需解压缩,非完整解压)。
SAX 解析 XML(按需解析文档):XML 解析部分完整段落数据后,或者表格(大表格)解析的行数超过一定值后,直接触发排版,无需等待完全解析数据后再排版,优先把当前页内容显示出来。
OLE 动态加载:Office 03格式中,OLE 格式数据存放是无序的,自研的排版引擎对应 OLE 格式的文件是基于 poi 来做解析。原生 poi 会将整个文件全部加载到内存中,然后再做解析,这样会大大影响首次显示的速度。自研引擎根据 OLE 数据的特点,对数据进行按需加载解析,大大缩短首次上屏时间。
大图采样解析显示。
分块绘制渲染:文档字号普遍偏小,用户在使用过程中有对文字进行缩放的强需求,这会导致绘制上屏的 bitmap 变大,当用户滑动换页时,如同时需要上屏的大 bitmap 过大,会引起渲染卡顿。经过团队分析,我们对渲染的 page 进行分块绘制,将一页分割成多个小块,保证渲染上屏的 bitmap 不会出现超大的情况,降低硬解纹理上屏耗时。经过对程序内存的优化和长期监控,如今引擎的内存损耗已降到最低。
PDF 引擎的内存优化
渲染结果 LRU 缓存:避免短时间内重复渲染。
Page LRU 缓存:缓存最近的 Page,避免重复加载 Page 及加载过多 Page 时出现内存溢出。
渐进渲染:超大 Page 渲染很耗时,设置渲染回调周期,渲染多少上屏多少,避免长时间空白,让用户有渲染进度感知。
图片缓存限制:超多图片对象的页面渲染可能导致内存问题,通过限制图片缓存,及时释放渲染完成的图片,避免所有图片都 load 进内存,造成内存溢出。
漫画类文档(Page 尺寸超大)关闭图片抗锯齿,加速上屏。
排版优化
Office 在排版处理上是非常复杂的,尤其是 word 排版,遇到环绕shape发生碰撞后需要对已排数据进行重排。自研 Office 引擎的排版会根据碰撞将每个 line 分成不同的 range,然后再根据 range 的有效宽度,对文字内容进行排版。大体流程如下:
乱码和文本显示优化
PDF 引擎是基于线上开源引擎的自研引擎,对兼容性和渲染能力做了极致的优化。引擎对 PDF1.0-1.7 全版本支持,对乱码和打不开问题做了问题分类和针对性优化。内置字体缺失、损坏、定位失败等问题是导致乱码和文本显示空白的直接原因,针对这些问题,通过兼容系统本地字体实现文本的正常渲染。
文档引擎的高级能力
查找:通过查找功能,可以快速定位到关注点。
选择复制粘贴:可以快速提取自己所需的内容。
导出长图:支持将文档导出成长图,一键分享。
格式转换:支持 Office 转图片,Office 转 PDF 等。
打印:手机也可以打印 Office 文档,摆脱电脑的束缚。
查看文档内图片:提取文档内图片原始图片,无损更清晰。
页面跳转:支持快速跳转到指定页,支持跳转到上次阅读位置,保持流畅的阅读体验。
适应屏幕:自动适应屏幕,关注文本内容,避免眼部疲劳。
安全至上
本地文档解析的文档主要来自端内,或者端通过网络传输到端的文件。文件的输入主要是 Android File 的形式。为满足某些移动安全的场景,实现文档不落地的需求,也可以通过 InputStream 流的形式实现。客户端通过 SDK 接口打开文件,会把 File 或者 Stream 通过 SDK 进行排版解析和渲染上屏,从而达到在 App 内打开文档的效果。无需跳转其他客户端,无需云端转码。
接入简单
支持 SDK 静态集成,接口简单,无需部署服务器,调用仅需传入一个本地文档路径,提供默认 UI 展示并支持自定义 UI 定制。