关于离屏渲染

会造成 offscreen rendering的原因有:

============================

  • Any layer with a mask (layer.mask)

  • Any layer with layer.masksToBounds being true

  • Any layer with layer.allowsGroupOpacity set to YES and layer.opacity is less than 1.0

  • Any layer with a drop shadow (layer.shadow*).

  • Any layer with layer.shouldRasterize being true

  • Any layer with layer.cornerRadius, layer.edgeAntialiasingMask, layer.allowsEdgeAntialiasing

1.阴影绘制:


使用ShadowPath来替代shadowOffset等属性的设置。
两种不同方式来绘制阴影:

  • 不使用shadowPath
*imageViewLayer = cell.imageView.layer;
1
2
3
4
5
6
7
imageViewLayer.shadowColor = [UIColor blackColor].CGColor;
imageViewLayer.shadowOpacity = 1.0;
imageViewLayer.shadowRadius = 2.0;
imageViewLayer.shadowOffset = CGSizeMake(1.0, 1.0);
```

+ **使用shadowPath**

imageViewLayer.shadowPath = CGPathCreateWithRect(imageRect, NULL);

1
2
3
4
5

#### 2.裁剪图片为圆:
--------------------------------------------------

+ **使用CornerRadius:**

CALayer *imageViewLayer = cell.imageView.layer;

imageViewLayer.cornerRadius = imageHeight / 2.0;

imageViewLayer.masksToBounds = YES;

利用一张中间为透明圆形的图片来进行遮盖,虽然会引起blending,但性能仍然高于offerScreen。
```

3. 关于blending


前面提到了用透明圆形的图片来进行遮盖,会引起blending。blending也会耗费性能。

:) 笑。如果阅读这篇文章的读者看到这里,是不是觉得已经无眼看下去了。哈哈,我自己学习总结到这里也是感受到了长路慢慢,但是我们仍然还是要不断上下求索的。 :)

好了 接下来让我们来认识一下Blending.

什么是Blending?
在iOS的图形处理中,blending主要指的是混合像素颜色的计算。最直观的例子就是,我们把两个图层叠加在一起,如果第一个图层的透明的,则最终像素的颜色计算需要将第二个图层也考虑进来。这一过程即为Blending。

会导致blending的原因:

layer(UIView)的Alpha < 1

UIImgaeView的image含有Alpha channel(即使UIImageView的alpha是1,但只要image含透明通道,则仍会导致Blending)
为什么Blending会导致性能的损失?

原因是很直观的,如果一个图层是不透明的,则系统直接显示该图层的颜色即可。而如果图层是透明的,则会引入更多的计算,因为需要把下面的图层也包括进来,进行混合后颜色的计算。

在了解完Blending之后,我们就知道为什么很多优化准则都需要我们尽量使用不透明图层了。接下来就是在开发中留意和进行优化了。

1