2016-06-07 11:27:52 qiuxuewei2012 阅读数 9364
  • FFmpeg音视频编码实战屏幕录像机视频课程-基于QT5和...

    本课程讲解的是基于流行的直播技术 FFMpeg3.3音视频处理框架,和应用广的c++跨平台的QT5库(主要用作界面)。开发的一个完整的屏幕录像机项目,包含桌面录制(基于 QT(跨平台),directx(高效)),话筒录制,音视频h264编码,MP4封装。QT圆角边框界面。 开发工具基于vs2015,但同样适用于vs更高版本。

    4843 人正在学习 去看看 夏曹俊

查阅了好些关于圆角性能优化的帖子,总结下记录下来.
首先:
DSImageViewRound 使用方法
iOS图片高性能设置圆角

一般我们在iOS开发的过程中设置圆角都是如下这样设置的。

 avatarImageView.clipsToBounds = YES;
 [avatarImageView.layer setCornerRadius:50];

这样设置会触发离屏渲染,比较消耗性能。比如当一个页面上有十几头像这样设置了圆角
会明显感觉到卡顿。

注意:png图片UIImageView处理圆角是不会产生离屏渲染的。(ios9.0之后不会离屏渲染,ios9.0之前还是会离屏渲染)。
所以如果要高性能的设置圆角就需要找另外的方法了。下面是我找到的一些方法

设置圆角的方法

1.直接使用setCornerRadius

这种就是最常用的,也是最耗性能的。

2.setCornerRadius设置圆角之后,shouldRasterize=YES光栅化


avatarImageView.clipsToBounds = YES; 
[avatarImageView.layer setCornerRadius:50]; avatarImageView.layer.shouldRasterize = YES;

shouldRasterize=YES设置光栅化,可以使离屏渲染的结果缓存到内存中存为位图, 使用的时候直接使用缓存,节省了一直离屏渲染损耗的性能。

但是如果layer及sublayers常常改变的话,它就会一直不停的渲染及删除缓存重新 创建缓存,所以这种情况下建议不要使用光栅化,这样也是比较损耗性能的。

3.投机取巧方法:->直接覆盖一张中间为圆形透明的图片

这种方法就是多加了一张透明的图片,GPU计算多层的混合渲染blending也是会消耗 一点性能的,但比第一种方法还是好上很多的。

4.UIImage drawInRect绘制圆角

这种方式GPU损耗低内存占用大,而且UIButton上不知道怎么绘制,可以用 UIimageView添加个点击手势当做UIButton使用。

UIGraphicsBeginImageContextWithOptions(avatarImageView.bounds.size, NO, [UIScreen mainScreen].scale);
  [[UIBezierPath bezierPathWithRoundedRect:avatarImageView.bounds cornerRadius:50] addClip];
  [image drawInRect:avatarImageView.bounds];
  avatarImageView.image = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();

这段方法可以写在SDWebImage的completed回调里,在主线程异步绘制。 也可以封装到UIImageView里,写了个DSRoundImageView。后台线程异步绘制,不会阻塞主线程。

5.SDWebImage处理图片时Core Graphics绘制圆角

//UIImage绘制为圆角

  int w = imageSize.width;
  int h = imageSize.height;
  int radius = imageSize.width/2;  
  UIImage *img = image;
  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);
  CGRect rect = CGRectMake(0, 0, w, h);
  CGContextBeginPath(context);
  addRoundedRectToPath(context, rect, radius, radius);
  CGContextClosePath(context);
  CGContextClip(context);
  CGContextDrawImage(context, CGRectMake(0, 0, w, h), img.CGImage);
  CGImageRef imageMasked = CGBitmapContextCreateImage(context);
  img = [UIImage imageWithCGImage:imageMasked];
  CGContextRelease(context);
  CGColorSpaceRelease(colorSpace);
  CGImageRelease(imageMasked);

以上代码我写成了UIImage的类别:UIImage+DSRoundImage.h 并在SDWebImage库里处理image的时候使用类别方法绘制圆角并缓存。
此分类github地址:https://github.com/walkdianzi/DSRoundedImageArticle
使用Instruments的Core Animation查看性能

Color Offscreen-Rendered Yellow

开启后会把那些需要离屏渲染的图层高亮成黄色,这就意味着黄色图层可能存在性能问题。
Color Hits Green and Misses Red

如果shouldRasterize被设置成YES,对应的渲染结果会被缓存,如果图层是绿色,就表示这些缓存被复用;如果是红色就表示缓存会被重复创建,这就表示该处存在性能问题了。
用Instruments测试得

第一种方法,ios9.0之前UIImageView和UIButton都高亮为黄色。ios9.0之后只有UIButton高亮为黄色。

第二种方法UIImageView和UIButton都高亮为绿色

第三种方法,无任何高亮,说明没离屏渲染。 这种圆片覆盖的方法一般只用在底色为纯色的时候,如果圆角图片的父View是张图片的时候就没办法了,而且底色如果是多种颜色的话那 要做多张不同颜色的圆片覆盖。(可以用代码取底色的颜色值给圆片着色)

第四种方法无任何高亮,说明没离屏渲染(但是CPU消耗和内存占用会很大)

第五种方法无任何高亮,说明没离屏渲染,而且内存占用也不大。(暂时感觉是最优方法)

集锦2:
一行代码,圆角风雨无阻,告别离屏渲染性能损耗
github碉堡了链接:https://github.com/liuzhiyi1992/ZYCornerRadius

最后可以看下偶像大神写的性能优化的帖子:
http://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/

站在巨人肩膀上编程!

2017-07-20 17:02:41 m0_38076563 阅读数 501
  • FFmpeg音视频编码实战屏幕录像机视频课程-基于QT5和...

    本课程讲解的是基于流行的直播技术 FFMpeg3.3音视频处理框架,和应用广的c++跨平台的QT5库(主要用作界面)。开发的一个完整的屏幕录像机项目,包含桌面录制(基于 QT(跨平台),directx(高效)),话筒录制,音视频h264编码,MP4封装。QT圆角边框界面。 开发工具基于vs2015,但同样适用于vs更高版本。

    4843 人正在学习 去看看 夏曹俊

iOS 两个圆角(1个3个任两个角)的UIView或其子类控件实现

适用于:UIView及其子类button、label、imageView…….

原理

参考文章链接

正文

// markdown我不会给代码改颜色==


    var myView:UIView!

    override func viewDidLoad() {

        super.viewDidLoad()

        view.backgroundColor = UIColor.lightGray

        myView.backgroundColor = UIColor.white

        //看看UIBezierPath的构造函数参数
        let maskPath = UIBezierPath(roundedRect: myView.bounds, byRoundingCorners: 
        [UIRectCorner.topRight, UIRectCorner.topLeft], cornerRadii: CGSize(width: 8, height: 8))
        //参数 有一个圆角数组,随便你写哪个角落(英语不解释)

        let maskLayer = CAShapeLayer()

        maskLayer.frame = myView.bounds

        maskLayer.path = maskPath.cgPath

        myView.layer.mask = maskLayer

        view.addSubview(myView)

    }

Done.

2017-09-11 22:30:00 aaaaazq 阅读数 21661
  • FFmpeg音视频编码实战屏幕录像机视频课程-基于QT5和...

    本课程讲解的是基于流行的直播技术 FFMpeg3.3音视频处理框架,和应用广的c++跨平台的QT5库(主要用作界面)。开发的一个完整的屏幕录像机项目,包含桌面录制(基于 QT(跨平台),directx(高效)),话筒录制,音视频h264编码,MP4封装。QT圆角边框界面。 开发工具基于vs2015,但同样适用于vs更高版本。

    4843 人正在学习 去看看 夏曹俊

最近项目的界面都要改成卡片的形式,即需要投影的效果,还要削出圆角,我们都知道削圆角一般有两种方式,一种是直接用layer.cornerRadius来设置,我们知道的一般都是下面两行代码一起使用来实现圆角:

self.layer.cornerRadius = 10;
self.layer.masksToBounds=YES;

但是只要self.layer.masksToBounds=YES;有这句,投影的效果就出不来。
还有一种性能比较好的圆角设置方式,就是用UIBezierPath来设置,我试过用这个来设置圆角的话,投影一样也出不来。
还有在网上看到了加一层layer的,大体思路就是self.layer来设置圆角,新写一个layer来设置投影,然后把layer放到self.layer上,我试了之后发现没什么效果,而且偏移会很明显的看出来,但不是以投影的方式出现。
然后又找到了一篇文章,给出的方法代码如下:

@implementation TPShadowView

-(instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = kUIColorFromRGB(0x4b4773);
        //v.layer.masksToBounds=YES;这行去掉
        self.layer.cornerRadius = 10;
        self.layer.shadowColor = kUIColorFromRGB1(0x000000, 1).CGColor;
        self.layer.shadowOffset = CGSizeMake(2, 5);
        self.layer.shadowOpacity = 0.5;
        self.layer.shadowRadius = 5;

    }
    return self;
}

这个是我整理之后的写了个投影的view类,方便使用,核心就是注释着这行去掉的这个,当时看的时候,觉得有点不敢相信,但是那个博主给了投影效果,我就抱着试一下的心态写了,没想到还真的可以。。。
效果如图:
这里写图片描述
真的是万万没想到啊,万分感谢那篇文章的博主啊~~
附上原博主的文章链接:IOS view的圆角和阴影并存

解决iOS输入框和button圆角问题

博文 来自: qq_36242361

iOS圆角优化

阅读数 177

没有更多推荐了,返回首页