必威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

Leave a Comment.