- 关于CALayer的shouldRasterize(光栅化)
开启shouldRasterize后,CALayer会被光栅化为bitmap,layer的阴影等效果也会被保存到bitmap中。
当我们开启光栅化后,需要注意三点问题。
如果我们更新已光栅化的layer,会造成大量的offscreen渲染。
因此CALayer的光栅化选项的开启与否需要我们仔细衡量使用场景。
① 用于避免静态内容的复杂特效的重绘
② 用于避免多个View嵌套的复杂View的重绘。
而对于经常变动的内容,这个时候不要开启,否则会造成性能的浪费。
例如我们日程经常打交道的TableViewCell,因为TableViewCell的重绘是很频繁的(因为Cell的复用),如果Cell的内容不断变化,则Cell需要不断重绘,如果此时设置了cell.layer可光栅化。则会造成大量的offscreen渲染,降低图形性能。
当然,合理利用的话,是能够得到不少性能的提高的,因为使用shouldRasterize后layer会缓存为Bitmap位图,对一些添加了shawdow等效果的耗费资源较多的静态内容进行缓存,能够得到性能的提升。
- 光栅化使用示例代码:
#import "DemoCell.h"
#import "YYWebImage.h"
@implementation DemoCell
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
// 利用 KVC 修改 imageView 的类型
[self setValue:[[YYAnimatedImageView alloc] init] forKey:@"imageView"];
// 1. 栅格化,美工的术语:将 cell 中的所有内容,生成一张独立的图像
// 在屏幕滚动时,只显示图像
self.layer.shouldRasterize = YES;
// 栅格化,必须指定分辨率,否则默认使用 * 1,生成图像!
// 所以避免因为屏幕缩放比导致图像模糊,可以手动设置rasterizationScale为当前屏幕的缩放比
self.layer.rasterizationScale = [UIScreen mainScreen].scale;
// 2. 异步绘制!如果 cell 比较复杂,可以使用!
self.layer.drawsAsynchronously = YES;
}
return self;
}
@end
除了Cell栅格化与异步绘制外,还需注意以下几点:
1.行高一定要缓存
2.不要动态创建子视图
- 所有子视图都要遇见创建
- 如果不需要显示可以设置hidden
3.所有的子视图都要应该添加到contentView上
4.所有的子视图都必须制定背景颜色
5.所有的颜色都不要使用alpha