iOS 视图优化要点
2020-07-21 本文已影响0人
iOS开发小菜鸟
模拟器上Debug的4个选项
image.pngColor 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
定义:离屏渲染,这个会单独写一篇博客介绍。