instrument 之Core-Animation 性能调优(Color Hits Green and Misses Red)表格性能优化。

备注:有很多怪好的章说将shouldRasterize(光栅化)个人认为当仍PS内部专业术语来讲,个人了解。

莫知道发生没有产生伴不明白此字“栅”怎么读了,我特别百度了转,有四种植读法。

栅栏有四个读法:zhà,cè,shān,shi。

夫详细解释也:

栅 [zhà]:用竹木铁条等做成的阻拦物:~栏。~子。


[shān]:1.〔~极〕多极电子管因阴极的一个电极。2.〔光~〕产生单之衍射图像的光学仪器。

栅 [shi]:〔上~〕〔下~〕地名,均于中华广东省。

  • 关于CALayer的shouldRasterize(光栅化)

栅格化(PS专业术语)

栅(shān)格化,是PS遭逢之一个专业术语,栅格即像素,栅格化即将矢量图形转化为各图(栅格图像)。最基础之栅格化算法将大半边形表示的老三维气象渲染至二维表面。

被shouldRasterize后,CALayer会被光栅化为bitmap,layer的影子等功用呢会见让保存至bitmap中。

位图

看到这个位图术语比较茫然,然后自己问问了一下咱们企业的UI,才懂得这个术语。

自家的接头:图像尚未为栅格化之前任意拓宽,都非见面失帧。而栅格化化之后要随着放大的翻番在追加,失帧会随着倍数的增加而增加。故:栅格化本身便是可怜成一个永恒像从的图像。

1. 关于CALayer的shouldRasterize(栅格化)

@property BOOL shouldRasterize;

     When true, the layer is rendered as a bitmap in its local
coordinate  space (“rasterized”), then the bitmap is composited into the
destination (with the minificationFilter and magnificationFilter
 properties of the layer applied if the bitmap needs scaling).
Rasterization occurs after the layer’s filters and shadow effects are
applied, but before the opacity modulation. As an implementation  detail
the rendering engine may attempt to cache and reuse the bitmap from one
frame to the next. (Whether it does or not will have no affect on the
rendered output.) When false the layer is composited directly into the
destination whenever possible (however, certain features of the
compositing model may force rasterization, e.g. adding filters).
Defaults to NO. 

使用阴影时还要安装 shadowPath
就可知幸免离屏渲染大大提升性,但是使用不当也会促成性能的淘。

CALayer 有一个 shouldRasterize 属性,将这特性设置成 true
后就是翻开了光栅化。开启shouldRasterize后,CALayer会被栅格化为bitmap,layer的影等作用也会于保存到bitmap中,光栅化后会将图层绘制到一个屏幕外之图像,然后是图像将会让缓存起来并绘制到骨子里图层的
contents
和子图层,对于生诸多之子图层或者出复杂的力量使,这样做就会见比重绘有工作之兼具帧来更加迅速。但是光栅化原始图像需要时日,而且会消耗额外的内存。

故而:当我们打开栅格化后,需要专注4点问题。

  1. 倘我们创新都栅格化的layer,会导致大量底offscreen渲染。

    因此CALayer的栅格化选项之敞开也需我们仔细衡量采用状况。只能用在图像内容未换的前提下的:

            用于避免静态内容的繁杂特效的重绘,例如前面说到的UIBlurEffect

            用于避免多只View嵌套的复杂性View的重绘。

    而对此时常改变的内容,这个时不要被,否则会导致性能的荒废。

比如我们日程时应酬的TableViewCell,因为TableViewCell的重绘是蛮频繁的(因为Cell的复用),如果Cell的情不断变动,则Cell需要不停重绘,如果这时安装了cell.layer可栅格化。则会招致大气之offscreen渲染,降低图形性能。

自然,合理利用的话,是力所能及拿走广大属性的增进的,因为运用shouldRasterize后layer会缓存为Bitmap位图,对一些补给加了shawdow等功用的吃资源比较多之静态内容进行缓存,能够抱性的升迁。

  1. 决不过分使用,系统限制了缓存的深浅为2.5X Screen Size.

    如果过度施用,超出缓存之后,同样会招致大量的offscreen渲染。

  1. 深受栅格化的图纸如果超过100ms没有叫运,则会让移除

    因此我们当只是对连接不停下的图形展开缓存。对于不常使用的图样缓存是无意思,且耗费资源的。

  1. 当 UIView.layer.shouldRasterize = YES
    时,生成的位图会缓冲起来,如果TabelView 滑动的时候(UITableViewCell
    复用)使用缓存直接击中,就显得绿色,反之,如果不命中,这时便显红色。红色越多,性能进一步差.

测试demo

希冀被生出几乎独有意思之地方

 1. 内外微小幅度滑动时,一直是绿色

  1. 前后比生开间滑动,新面世的label一开是新民主主义革命,随后成绿色

  2. 倘若静止一秒钟,刚开头滑动时见面变换红。

眼看是因layer进行栅格化后渲染成各类图在缓存中。当屏幕出现滑动时,我们一直打缓存中读取而毋庸渲染,所以会见到绿色。当新的label出现经常,缓存中莫个是label的位图,所以会成为红色。第三沾比较主要,缓存中之目标有效期只出100ms,即要在0.1s内并未被使用就会自行从缓存中清理出。这就是是干吗停留一会儿又滑动就见面见到红色。

栅格化的缓存机制是相同把双刃剑,先勾勒副缓存还念博有或损耗比较多之时光。因此栅格化就适用于比复杂的、静态的效果。通过Instrument的调试发现,这里运用光栅化经常出现未命中缓存的动静,

总结:如果View的Frame和Content不经常变化,开启shouldRasterize = YES
,反的则不用开浪费性能,如果TableView滑动
Cell使用位图则是绿色,反的革命,绿色越多属性更加好,红色反之。

参考:

UIKit性能调优实战讲解

哪些是地写好一个界面

Mastering UIKit
Performance

What triggers “Color Copied Images” and “Color Hits Green and Misses
Red” in
Instruments?

WWDC
2014

当我们打开光栅化后,需要小心三碰问题。

比方我们创新都光栅化的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

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注