CPU和GPU的工作原理
在屏幕成像的过程中,CPU和GPU起到了至关重要的作用
image.png- CPU
- 对象的创建和销毁
- 对象属性的调整frame,bound
- 布局的计算
- 文本的计算和排版
- 图片的格式转换和解码
- 图像的绘制(core graphics)
- GPU
纹理的渲染
屏幕成像的原理
image.png image.png解决卡顿的思路 尽可能的减少CPU和GPU的资源消耗, 缩短任务的处理时间,让它们能够更快的完成任务
- CPU
- 使用轻量级的对象, 比如用不到点击事件的地方使用CALayer 渠道UIView
- 不要频繁的调整视图的相关属性, 比如frame,bounds等尽可能的让多次相同的操作合并为一次
- 提前计算好需要的布局
- 尽可能的减少视图的层级
- 减少带透明度视图的数量
- 复杂页面使用纯代码布局, 减少autolayout的使用, 因为autolayout需要消耗更多的CPU资源
- 使用懒加载, 在需要用的时候时刻再去创建
- 耗时的操作放到子线程去处理, 比如图片的解码和绘制, 文本尺寸的计算和绘制
- GPU
- 尽量减少视图的数量和层级
- 减少带透明度的视图, 因为带透明度的视图重叠在一起往往需要更多的计算量
- 避免短时间内加载大量图片,尽可能的将多张图片合并成一张
- 尽量不要使用超大图片, GPU处理的最大纹理是4096*4096, 一旦超过这尺寸就要占用CPU资源进行处理
- 尽量避免出现离屏渲染,离屏渲染会在在屏幕外会新开辟一个缓冲区进行渲染, 当屏幕内缓冲区不够用后, 需要切换上下文环境到屏幕外缓冲区, 获取完帧数据之后又要切换上下文回到屏幕内缓冲区, 会造成大量的资源开销
那些操作会处理离屏渲染
光栅化 layer.shouldRasterize = YES
遮罩 layer.mask
圆角 layer.masksToBounds = YES, layer.cornerRadius > 0 可以通过CoreGraphics绘制圆角或者切圆角图片
阴影 layer.shadowxxx
如果设置了layer.shadowPath就不会产生离屏渲染
网友评论