性能的总结笔记

1.界面卡顿原因

屏幕成像的过程如下图:

image.png

按照60FPS的刷帧率,每隔16ms就会有一次 VSync 到来(垂直同步信号)。VSync 到来意味着要将 GPU 渲染好的数据拿出来显示到屏幕上,但是下图中红色区域中,由于CPU + GPU 的处理时间在 VSync 之后,所以此时红色框右边的时间段显示的始终是上一帧的画面,因此出现卡顿现象。所以实际开发中无论是 CPU 还是 GPU 消耗资源较多都可能造成卡顿现象。

image.png

2.帧率优化

Color Blended Layers(red)

png 图片是支持透明的,对系统性能也会有影响的。最好不要设置透明度,因为透明的图层和其他图层重叠在一块的部分,CPU 会做处理图层叠加颜色计算,这种处理是比较消耗资源的。

Color Copied Images (cyan)

苹果的 GPU 只解析 32bit 的颜色格式。

如果一张图片,颜色格式不是 32bit ,CPU 会先进行颜色格式转换,再让 GPU 渲染。 就算异步转换颜色,也会导致性能损耗,比如电量增多、发热等等。解决办法是让设计师提供 32bit 颜色格式的图片。图片颜色科普文章:图片的颜色深度/颜色格式(32bit,24bit,12bit)

Color Misaligned Images 像素对齐(yellow)

iOS设备上,有逻辑像素(point)和 物理像素(pixel)之分,像素对齐指的是物理像素对齐,对齐就是像素点的值是整数。UI 设计师提供的设计稿标注以及中的 frame 是 逻辑像素。GPU在渲染图形之前,系统会将逻辑像素换算成 物理像素。point  和 pixel 的比例是通过[[UIScreen mainScreen] scale] 来制定的。在没有视网膜屏之前,1point = 1pixel;但是2x和3x的视网膜屏出来之后,1point = 2pixel 或 3pixel。

逻辑像素乘以 2 或 3 得到整数值就像素对齐了,反之则像素不对齐。像素不对齐会导致 GPU 渲染时,对没对齐的边缘进行插值计算,插值计算会有性能损耗。

原图片大小和视图控件大小不一致,图片为了对应在控件的相应的位置就需要做一些计算,然后确定图片的位置,该种情况也比较消耗资源。一般可以通过绘制指定尺寸大小、不透明的图片来优化性能。

Color Off-screen Rendered (yellow)

cornerRadius 属性只应用于 layer 的背景色和边线。将 masksToBounds 属性设置为 YES 才能把内容按圆角形状裁剪。同时设置 cornerRadius 和 masksToBounds = YES ,并且屏幕中同时显示的圆角个数过多,就会明显感觉到卡顿和跳帧,只是设置 cornerRadius 并不会触发此种现象。当使用圆角,阴影,遮罩的时候,图层属性的混合体被指定为在未预合成之前不能直接在屏幕中绘制,所以就需要屏幕外渲染被唤起。使用离屏渲染的时候会很容易造成性能消耗,因为在 OpenGL 里离屏渲染会单独在内存中创建一个屏幕外缓冲区并进行渲染,而屏幕外缓冲区跟当前屏幕缓冲区上下文切换是很耗性能的。iOS9 之后系统设置圆角不再产生离屏渲染。设置 shadow***相关阴影属性也会产生离屏渲染,解决方法是设置阴影路径 shadowPath。

无法避免离屏渲染的时候可尝试使用光栅化来进一步做优化。光栅化是指将图转化为一个个栅格组成的图象。shouldRasterize = YES 在其他属性触发离屏渲染的同时,会将光栅化后的内容缓存起来,如果对应的layer 及其 sublayers 没有发生改变,在下一帧的时候可以直接复用,从而减少渲染的频率。当使用光栅化时,可以在 Core Animation 开启 Color Hits Green and Misses Red 来检查该场景下光栅化操作是否是一个好的选择。绿色表示缓存被复用,红色表示缓存在被重复创建。如果光栅化的层变红得太频繁那么光栅化对优化可能没有多少用处,反之就可以开启。

3.内存数据擦除

敏感数据不想一直保留在内存中,可以通过特定的 API 擦除内存中的数据,比如 NSString:

1

2

3

4

5

6

7

8

9

@implementation NSString (MemoryClear)

/**

 内存数据及时擦除

 */

-(void)memoryClearStirng{

    const char*string = (char *)CFStringGetCStringPtr((CFStringRef)self,CFStringGetSystemEncoding());

    memset(&string, 0, sizeof(self));

}

@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值