>

顺便提下触发离屏渲染的时机,sbf282.comios9.0之后

- 编辑:澳门博发娱乐官网 -

顺便提下触发离屏渲染的时机,sbf282.comios9.0之后

1.通过设置控件layer的cornerRadius来设置圆角

iOS切圆角的方式

第一种方法:通过设置layer的属性


最简单的一种,但是很影响性能,一般在正常的开发中使用很少

UIImageView imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];*

//只需要设置layer层的两个属性

//设置圆角

imageView.layer.cornerRadius = imageView.frame.size.width / 2;

//将多余的部分切掉

imageView.layer.masksToBounds = YES;

[self.view addSubview:imageView];

注意:ios9.0之后对UIImageView的圆角设置做了优化,UIImageView这样设置圆角

不会触发离屏渲染,ios9.0之前还是会触发离屏渲染。而UIButton还是都会触发离屏渲染。

离屏渲染是个好东西,但是频繁发生离屏渲染是非常耗时的。离屏渲染:指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。由上面的一个结论视图和圆角的大小对帧率并没有什么影响,数量才是伤害的核心输出啊。可以知道离屏渲染耗时是发生在离屏这个动作上面,而不是渲染。为什么离屏这么耗时?原因主要有创建缓冲区和上下文切换。创建新的缓冲区代价都不算大,付出最大代价的是上下文切换

上下文切换

上下文切换,不管是在GPU渲染过程中,还是一直所熟悉的进程切换,上下文切换在哪里都是一个相当耗时的操作。首先我要保存当前屏幕渲染环境,然后切换到一个新的绘制环境,申请绘制资源,初始化环境,然后开始一个绘制,绘制完毕后销毁这个绘制环境,如需要切换到On-ScreenRendering或者再开始一个新的离屏渲染重复之前的操作。一次mask发生了两次离屏渲染和一次主屏渲染。即使忽略昂贵的上下文切换,一次mask需要渲染三次才能在屏幕上显示,这已经是普通视图显示3陪耗时,若再加上下文环境切换,一次mask就是普通渲染的30倍以上耗时操作。问我这个30倍以上这个数据怎么的出来的?当我在cell的UIImageView的实例增加到150个,并去掉圆角的时候,帧数才跌至28帧每秒。虽然不是甚准确,但至少反映mask这个耗时是无mask操作的耗时的数十倍的。


1:通过设置layer属性:最简单的一种,但是很影响性能,会造成离屏渲染,一般在开发中很少使用。

UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100,100,100,100)];

//只需要设置layer层的两个属性

//设置圆角

imageView.layer.cornerRadius = imageView.frame.size.width /2;

//将多余的部分切掉

imageView.layer.masksToBounds =YES;

[self.view addSubview:imageView];

今天因为工程里面的view设置的是左上边没有圆角,所以特别写了一个UIiView的分类方法,来实现UIview的某一边带有圆角

self.view.layer.cornerRadius =10.f;//如果设置圆角角度为半圆,则数值为控件高度的一半

self.view.layer.masksToBounds = YES;//是否删除多余的位置

第一种方法:通过设置layer的属性

第二种方法:使用贝塞尔曲线UIBezierPath和Core Graphics框架画出一个圆角


UIImageView imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
*

imageView.image = [UIImage imageNamed:@"1"];

//开始对imageView进行画图

UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, 1.0);

//使用贝塞尔曲线画出一个圆形图

[[UIBezierPath bezierPathWithRoundedRect:imageView.bounds cornerRadius:imageView.frame.size.width] addClip];

[imageView drawRect:imageView.bounds];

imageView.image = UIGraphicsGetImageFromCurrentImageContext();

//结束画图

UIGraphicsEndImageContext();

[self.view addSubview:imageView];


2:使用贝塞尔曲线UIBezierPath和Core Graphics框架画出一个圆角

方法如下:
.h里

本文由胜博发-编程发布,转载请注明来源:顺便提下触发离屏渲染的时机,sbf282.comios9.0之后