查看答案
一段内存是有一个或者多个Page Memory
组成的,一个Page Memory
大小时16K
.Page Memory
刚申请的内存状态为Clean
,当存储数据之后状态变成Dirty
。
查看答案
iOS的内存类型分为三种
-
Clean Memory
可以被Page Out的内存空间,通常
.framework
中的_DATA_CONST_
段 -
Dirty Memory
被App写入输入的内存,同时是堆区的对象,图像解码空间,
.framwork
中的_DATA_
段和_DATA_DIRTY_
段。在.framework
使用单利初始化可以有效减少Dirty Memory
的占用 -
Compressed Memory
当内存吃紧的时候,系统会将不适用的内存压紧。比如用
Dictionary
缓存数据占用三页内存,当内存吃紧被压缩为一页,当再次使用,再次被释放成三页。
查看答案
因为在内存吃紧的时候,NSCache
会自动释放内存,但是Dirtionary
不会。
查看答案
500x500x8 / (1024 * 1024) ~= 0.95MB
查看答案
因为设备的刷新频率时一秒60次,那么每次屏幕渲染的时间就是1/60秒大约0.0167秒时间。这0.0167秒时间需要CPU计算和GPU渲染完成,当两个时间大于0.0167秒时候就会显示上一显示的内容。从而形成卡顿的现象,GPU渲染完毕,就会在下一侦显示。
查看答案
-
需要创建新的缓存区
-
离屏渲染的过程需要多次切换上下文
查看答案
- layer.shouldRasterize = YES
- 设置遮罩 layer.mask
- 设置圆角
- 设置阴影
查看答案
- 布局
- 显示
- 准备
- 提交
查看答案
- CPU
- 对象的创建和销毁
- 对象属性的调整
- 布局计算
- 文本的计算和排版
- 图像格式的转码和解码
- 图像的绘制
- GPU
- 纹理的渲染
查看答案
由CPU进行位图合成,交给GPU进行图层混合和纹理合成。GPU结果存放在缓冲区(Frame Buffer)中,再由视频控制器通过VSync信号在指定时间从缓冲区提取屏幕显示内容显示在显示器上。
查看答案
- 对象的创建
- 尽量用轻量的对象代替重量的对象 比如不需要交互的可以用
CALayer
代替UIView
- 尽量在子线程创建对象
- 尽量代码创建对象替代
StoryBoard
创建对象 - 懒加载创建对象
- 尽可能的对象重用
- 尽量用轻量的对象代替重量的对象 比如不需要交互的可以用
- 对象调整
- 尽量避免不必要
UIView
对象的调整 - 尽量避免移动
UIView
图层层次和添加或者移出
- 尽量避免不必要
- 对象销毁
- 尽可能在后台线程销毁对象
- 布局计算
- 尽量提前计算好视图布局
- 尽量布局复杂少用自动布局
- 布局可以考虑添加缓存机制
- 文本计算
- 大量文本可以在子线程用
[NSAttributedString boundingRectWithSize:options:context:]
计算文本的宽度 - 大量文本可以在子线程用
[NSAttributedString drawWithRect:options:context:]
绘制文本
- 大量文本可以在子线程用
- 文本渲染
- 显示大量文本时候,可以自定义文本控制,通过缓存绘制信息提升绘制效率
- 图片解码
- 在子线程将图片绘制在
CGBitmapContext
,在Bitmap
直接的创建图片
- 在子线程将图片绘制在
- 图像的绘制
- 图像的绘制可以放在后台线程中
查看答案
- 纹理的渲染
- 尽可能减少短时间内加载多张图片 比如多张图片合成一张
- 图片的大小和视图大小不要超出纹理尺寸上线
4096*4096
。
- 图层混合
- 尽量减少图层层次和数量
- 在不需要透明的视图标记
opaque
属性 - 可以将多张图片合成一张
- 图形生成
- 后台线程生成圆角图片代理
layer.corner
设置圆角 - 开启
layer.shouldRasterize
属性将绘制可以转交给CPU
分解压力
- 后台线程生成圆角图片代理