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

相关文章