iOS 视图优化要点

2020-07-21  本文已影响0人  iOS开发小菜鸟

模拟器上Debug的4个选项

image.png

Color Blended Layers

定义:屏幕上的每个像素点的颜色是由当前像素点上的多层layer共同决定的,GPU会进行计算出混合颜色的RGB值,最终显示在屏幕上。而这需要让GPU计算,所以我们要尽量避免设置alpha,这样GPU会忽略下面所有的layer。

设置图片的透明度代码:

//设置图片的透明度
- (UIImage *)imageByApplyingAlpha:(CGFloat)alpha image:(UIImage *)image{
    
    //创建图片的上下文参数:  图片大小,透明度,缩放因子(传0表示根据屏幕的分辨率而变化)
    UIGraphicsBeginImageContextWithOptions(image.size, NO, 0.0f);
    //当前上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    //画图大小
    CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
    //翻转和移动,是保证坐标匹配
    //翻转Y轴
    CGContextScaleCTM(ctx, 1, -1);
    //向下移动图片高度
    CGContextTranslateCTM(ctx, 0, -rect.size.height);
    //kCGBlendModeMultiply,混合前景和背景的颜色
    CGContextSetBlendMode(ctx, kCGBlendModeMultiply);
    //设置透明度
    CGContextSetAlpha(ctx, alpha);
    //画图
    CGContextDrawImage(ctx, rect, image.CGImage);
    //得到新的图片
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    //结束图片上下文
    UIGraphicsEndImageContext();
    return newImage;
}

Color Copied Images

定义:苹果的GPU只解析32bit的颜色格式,如果你放一张图片,而它的颜色格式却不是32bit,CPU会先进行颜色格式转换,再让GPU渲染。

代码

- (UIImage *)decodedImageWithImage:(UIImage *)image{
    
    @autoreleasepool {
        
        CGImageRef inputCGImage = [image CGImage];
        size_t width = CGImageGetWidth(inputCGImage);
        size_t height = CGImageGetHeight(inputCGImage);
        
        size_t bytesPerPixel = 4;
        size_t bitsPerComponent = 8;
        size_t bytesPerRow = bytesPerPixel * width;
        
        CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
        
        CGContextRef context = CGBitmapContextCreate(NULL, width, height, bitsPerComponent, bytesPerRow, colorSpaceRef, kCGImageAlphaPremultipliedLast|kCGImageByteOrder32Big);
        
        if (context == NULL) {
            return image;
        }
        
        CGContextDrawImage(context, CGRectMake(0, 0, width, height), inputCGImage);
        CGImageRef imageRef = CGBitmapContextCreateImage(context);
        UIImage *returnImage = [UIImage imageWithCGImage:imageRef];
        
        CGContextRelease(context);
        CGImageRelease(imageRef);
        
        return returnImage;
        
    }
}

Color Misaligned Images

定义:不要出现image size 和 imageView size 不同的情况,这样会触发反锯齿计算,增加性能损耗。

图片改变尺寸代码

- (UIImage *)changeImageSize:(CGSize)size originImage:(UIImage *)image{
    
    UIGraphicsBeginImageContextWithOptions(size, NO, 0);
    [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
    UIImage *changeImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return changeImage;
}

Color Offscreen-Rendered

定义:离屏渲染,这个会单独写一篇博客介绍。

上一篇下一篇

猜你喜欢

热点阅读