1、|吉妙通Android Android 大型原生应用大型原生应用性能优化实践性能优化实践Android Android 端端 WPS Office WPS Office 性能挑战性能挑战上万行的文字百万行列的数据文字排版与渲染数据内存操作与计算复杂多媒体数据的幻灯片数据加载和展示问题和挑战问题和挑战顺利解析加载复杂数据顺利解析加载复杂数据尽可能短时间展示尽可能短时间展示首屏首屏快速渲染后续数据展示快速渲染后续数据展示OOM?OOM?关键点挑战挑战挑战资源资源竞争竞争?关键点文档数据完整文档数据完整?关键点WPS WPS 在两条主要链路上的解决方案在两条主要链路上的解决方案大文档快速加载机制大文
2、档快速加载机制链路链路11高帧率渲染逻辑实现高帧率渲染逻辑实现链路链路22大文档快速加载大文档快速加载文档处理边读边排按需加载机制图片等大数据加载处理KBits 压缩型数据结构设计IOIO数据数据内存内存Office Office 文档格式文档格式现在常见的 docx,xlsx,pptx 等,我们称之为 OOXML 的文档格式,它实际是一个 ZIP 压缩文件包,里面包含 XML 文件,图片资源等。图表图表形状形状工作表工作表幻灯片母版幻灯片母版图片和图片和音视频资源音视频资源主题主题幻灯片幻灯片幻灯片版式幻灯片版式Office Office 基础架构基础架构应用交互逻辑层应用交互逻辑层数据逻辑
3、数据逻辑数据数据分类分类解析加载逻辑解析加载逻辑数据层计算层对象层API文字表格演示PDF排版、离屏渲染、缓存机制、局部更新UIUI Logic Logic排版渲染排版渲染内核引擎内核引擎IO IO 加载加载读出展示阅读读出展示阅读编辑更新保存编辑更新保存快速加载四原则快速加载四原则原则原则11原则原则22原则原则33原则原则44首屏优先读取分块按需加载多线程并发延迟处理边读边排实现机制边读边排实现机制关键词关键词区域:Rangestart,end)区域锁:RangeLockstart,end)读锁:ReadRangeLockstart,end)可被多个线程拥有写锁:WriteRangeLoc
4、kstart,end)只被一个线程拥有实际案例实际案例以文字组件为例,说明实际执行过程中的边读边排主要原理区域区域Range0,start)Range0,start)Rangestart,end)Rangestart,end)Range0,)Range0,)Range0,Range0,?=?_)边读边排边读边排R_5R_4R_3R_2R_1WriteWriteRangeRangeLockLock?=?_ +?=?_,)ReadReadRangeRangeLock0,Lock0,?=?_+?=?_)R_5R_4R_3R_2R_1WriteWriteRangeRangeLockLock?=?_ +
5、?=?_,)1.Read1.ReadRangeRangeLockLock,?=?_+?=?_)2.flow layout of Page_K2.flow layout of Page_K边读边排边读边排图片读取机制图片读取机制读取文件内容读取文件内容遇到图片数据遇到图片数据采集信息采集信息文档内容读完文档内容读完图片线程启动图片线程启动渲染线程渲染线程根据条件根据条件启动图片显示启动图片显示读取读取正文内容正文内容(像文字,表格 数据等)图片信息包括图片信息包括内容偏移量和内容偏移量和长度,文件类长度,文件类型等型等边读边排版,边读边排版,此时文档中的此时文档中的图片只是一个图片只是一个占位框
6、占位框将图片信息生将图片信息生成磁盘缓存文成磁盘缓存文件;减少重复件;减少重复解析整个文件解析整个文件屏幕可见范围以屏幕可见范围以及预判算法对磁及预判算法对磁盘图片生成内存盘图片生成内存缓存并渲染缓存并渲染图片加载机制图片加载机制大图片局部加载大图片局部加载BitmapRegionDecoder.decodeRegionBitmap Bitmap 重用重用 inBitmap inBitmap复用内存,提高性能缓存池设计:缓存池设计:二层结构(LRU双向链表+HashMap&单向链表)LRU LRU 视角视角HeadernodenodenodenodeHashMapHashMap+单链表视角单链