《Android大型原生应用性能优化实践-吉妙通-吉妙通.pdf》由会员分享,可在线阅读,更多相关《Android大型原生应用性能优化实践-吉妙通-吉妙通.pdf(28页珍藏版)》请在三个皮匠报告上搜索。
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+单链表视角单链
7、表视角Tablenode 1node 2node nKey 相等的单向链表node 1.1node 2.2node 1.3KBits KBits 数据结构数据结构数据数据maskmaskshift_countshift_countholderholderA0 xFF000000240B0 x00FF0000160 x10000000C0 x0000FF0080 x109B0000D0 x000000FF00 x109B8C00要把四个数据 A(16),B(155),C(140),D(45)压缩进为一个 int(holder&mask)|(value shift_count)&mask);什么是
8、什么是 KBits KBits还原 B 数据可直接用 mask 进行&操作得到:B(0 x109b8c2d&0 x00ff0000)B(0 x109b8c2d&0 x00ff0000)实际的优化成果实际的优化成果三个组件的热启动自动化监控工具数据统计表:热启动首屏显示时间平均在 500ms500ms 左右。文字打开效率(热启动)文字打开效率(热启动)表格打开效率(热启动)表格打开效率(热启动)演示打开效率(热启动)演示打开效率(热启动)平均值平均值平均值高帧率渲染逻辑设计高帧率渲染逻辑设计渲染选型方案对比实际案例渲染机制详解更合适的更合适的文档渲染方案迭代选型文档渲染方案迭代选型UI 线程、渲
9、染线程,IO 线程等竞争与协作多线程竞争协作多线程竞争协作处理机制处理机制渲染选型方案对比渲染选型方案对比方案方案使用方法使用方法优点优点缺点缺点SurfaceView+SurfaceView+子线程子线程lockCanvaslockCanvasunlockCanvasAndPost()unlockCanvasAndPost()离屏渲染(本身的双缓存特性)离屏渲染(本身的双缓存特性)子线程渲染子线程渲染1.1.独立的独立的 Surface Surface,和其它界面的,和其它界面的配合上较差,配合上较差,2.2.双缓存在系统中,无法灵活控制双缓存在系统中,无法灵活控制View+Picture+
10、View+Picture+子线程子线程Picture Picture 为载体为载体 beginRecording(w,h)beginRecording(w,h)endRecording()endRecording()录制绘制指令,内存占用小录制绘制指令,内存占用小离屏渲染离屏渲染1.office 1.office 数据展示形式多样,数据数据展示形式多样,数据复杂,录制回放花屏难定位复杂,录制回放花屏难定位2.Picture 2.Picture 绘制指令回放问题绘制指令回放问题View+Bitmap+View+Bitmap+子线程子线程Bitmap Bitmap 为载体为载体 Canvas(Bi
11、tmap)Canvas(Bitmap)Canvas.draw(bitmap)Canvas.draw(bitmap)Bitmap Bitmap 直接记录了绘制结果直接记录了绘制结果主线程直接贴图显示主线程直接贴图显示2D 2D 绘制指令的适用性强绘制指令的适用性强1.1.注意内存问题注意内存问题2.RG2.RGB B565 565 和和 ARGB8888 ARGB8888 的灵活的灵活使用使用渲染渲染 Layer Layer 层级层级演示组件典型演示组件典型LayerLayer层级:层级:核心点:核心点:分层绘制,分级缓存原则:原则:尽量复用难点:难点:KbitsData 的时间平衡Render
12、layerRenderlayerData Transform Data Transform KBits DataKBits DataShapeLayerShapeLayerfillLayerfillLayerTextLayerTextLayerShapeCacheShapeCachePictureCachePictureCacheTextCacheTextCacheTextDataTextLayoutImagePoolInBitmapPoolPictureCreaterDataCoord增量渲染增量渲染ClientRectpreRect,curRectcalcDiffRect 求得 srcBm
13、p 可用区域相对dstBmp 贴图位置新一轮渲染中只 DiffRect 部分进行重绘,交集则直接利用 srcBmp 中的部分贴入如图所示一个典型的实例如图所示一个典型的实例局部更新局部更新碰撞检测实际案例实际案例1.将显示区域划分为活动区和静止区2.计算活动区坐标区域:和静止区无交集(A和B)和静止区有交集(A和C)3.贴图级更新和和缓存级更新典型场景:用户编辑状态原理原理典型场景典型场景线程的竞争协作线程的竞争协作线程锁线程锁直接暂停线程,让出资源。内核数据锁内核数据锁细粒度的数据读写控制,防止数据破坏。ThreadLocalThreadLocal允许缓存数据有一定的滞后性,保持排版渲染的一
14、致性。Idle Idle 机制机制在空闲情况下的预缓存处理,提升用户体验。线程的竞争协作线程的竞争协作上海品茶显示-IO 线程读取首屏后即暂停让出资源编辑数据-局部数据锁和排版 ThreadLocal 数据渲染队列-根据优先级对队列进行控制Idle 机制-RenderThread空闲预缓存渲染效率数据统计渲染效率数据统计三个数据分别是文字,表格和演示的滚屏效率统计结果数据。平均帧间隔均在 17ms17ms 左右很好的满足流畅度的要求文字滚屏效率(热启动)文字滚屏效率(热启动)表格滚屏效率(热启动)表格滚屏效率(热启动)演示滚屏效率(热启动)演示滚屏效率(热启动)平均值平均值平均值总结总结Android系统的更新完备的性能监控机制不断的更新迭代总结总结11总结总结22总结总结33|吉妙通