界面卡顿优化原理和预排版异步渲染
在重度使用图片的界面,经常会发生掉帧和短时间内内存爆增。掉帧是一个体验问题,然后内存问题也有可能导致我们应用切后台后,被系统习惯性的干掉,返回应用后总是冷启动。如果设计到一些其他重要业务场景,有的时候不友好且容易产生一些莫名其妙的异常。
针对于界面的优化主要有
预排版:对于有cell和重度排版计算的页面,将耗时如请求json和json转model、组件高度、位置等计算放在异步线程去操作。如果放在UI主线程中,当页面滚动涉及到重新布局排版的时候计算类的不仅要重新计算,还会阻塞UI主线程。所以开辟子线程,提前算好,在布局的时候直接获取使用,能减轻主线程耗时。
预编码解码:这个主要针对图片,利用苹果提供的下采样方式,能将一张图片的内存占有从100多m直接优化到10m左右。这种方式在编解码方面做了很多优化,当加载的数据得到优化,不仅仅是减少了时间,也解决了在浏览多张图片时,内存瞬间暴增的问题。
离屏渲染优化:当gpu渲染好贞数据时,会将渲染的数据放入贞缓存区frameBuff中,然后视频控制器中的电子枪会将缓存区的数据扫描读取到视频控制器,完成后发出垂直同步信号,此时再将图片内容提交给显示器。这个是针对于简单图片的过程。但是如果图片层级多,处理比较多,gpu在渲染时并不会将图片完成的处理完,而是处理个别层级的图片后,开辟一个新的内存空间出来,在新的内存区域继续完成没有进行完的图层渲染,等待所有操作完成后再继续后续操作,此过程就叫做离屏渲染。目前已知的增加阴影、遮罩、圆角(特定的操作方式,如果设计到layer视图的content区域和任意一个其他层级)等都能增加图层渲染的复杂度,导致离屏渲染,增加耗时和多余内存开销。
异步渲染:UIView是CALayer的一个代理,相比于CALayer,UIView是在它的基础上为我们绑定了响应者和封装了一些基础的操作。我们所有的渲染绘制操作都在layer层完成。我们在使用UIView组件的时候,计算和渲染的整个过程都在主线程完成。所以此中方式的核心思想就是通过在异步线程中绘制layer和手动绑定对应的事件来减轻主线程的负担,无需等待,多线程同时渲染多个组件,达到加速目的。