绘制阴影 优化 + UIImage 性能优化

转载 2015年11月20日 16:39:19

Offscreen-Rendered

离屏渲染意味着某一区域每帧渲染了两次。大部分离屏幕渲染由阴影和遮障绘制造成。以阴影绘制为例例,iOS 会先绘制目标的阴影,然后绘制目标本身。当我们没有设置阴影的路径时,iOS 在每次绘制前会递归每个子层来计算阴影的精确路径,这是非常消耗性能的,也导致了动画时出现卡顿。

因此,一般情况下需要指定阴影的路径。当 View 的 bound 改变时,重新设置阴影路径。如果 View 的 bound 做动画,则需要使用 CAAnimation 为 shadowPath 设置动画。

Blending

iOS 在渲染每一帧时,都将计算每一个像素点的颜色。当最上面的层不透明时,只需取最上面的层的颜色。而当上面的层存在透明度时,需要混合每一层的颜色来计算得到最终显示的颜色。自上而下有透明度的层越多,计算量越大,这也会导致动画时性能降低。因此,我们在开发中,要尽量减少不必要的透明层。

使用 Instruments 检测绘图性能

使用 Instruments 的 Core Animation 模板可以很方便的检测应用中的 Blending 和 Offscreen-Rendered 。

勾选 Color Offscreen-Rendered Yellow 选项将高亮进行离屏渲染的区域。

Offscreen-Rendered 截图

勾选 Color Blended Layers 将显示进行图层混合的区域,颜色越深表示计算量越大。

Blended Layers 截图

iOS 提升 UIImage 性能


使用 UIImage 加载大图片时,有时会导致界面卡顿,特别是在 UITableView 中上下拖动切换不同图片时更为明显。这是因为 UIImage 初始化后仅仅是把图片加载到内存中,而实际的解码和重采样是在图片需要显示时才进行(例如在 UIImageView 中),此时这些操作都在 UI 主线程中完成。因此,当图片比较大(尤其是图片大小和实际显示大小相差较大)时,解码和重采样是一个非常耗性能的操作,导致 UI 卡顿。解决方法是在子线程中先完成重采样,这样在显示时就省去了重采样所需的性能消耗。

图片重采样(参考官方例子 LazyTableImages ):

1
2
3
4
5
6
CGSize itemSize = CGSizeMake(width, height);//实际要缩放的大小
UIGraphicsBeginImageContext(itemSize);
CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
[image drawInRect:imageRect];
UIImage newImage = UIGraphicsGetImageFromCurrentImageContext(); //重采样后的图片
UIGraphicsEndImageContext();

UIImageView 添加边框和阴影

// 添加显示 UIImage *image = [UIImage imageNamed:@"0_wanggsx20080817.jpg"]; UIImageView *imageView = [...

UIImage加阴影

#import 一、给图片加上阴影  UIImageView*pageContenterImageView = [[UIImageView alloc]initWithImage:[UIIma...
  • zzzili
  • zzzili
  • 2012年12月20日 17:58
  • 1372

给圆添加一个阴影效果

我想作一圆 UIImageView ,和它的工作。下面是我用来使它的方法: [self.pic.layer setMasksToBounds:YES]; [self.pic.layer setCor...

iOS的阴影绘制及性能优化

今天来讲讲iOS开发过程中的阴影绘制及其潜在的绘图性能问题。虽然在开发过程中,我们使用阴影功能的机会不是很多,但是如果用了,有可能引起如卡顿等性能问题,所以,还是有必要来探究一下阴影的绘制过程,及如何...

设置阴影时的性能优化

iOS上,给视图加上阴影很容易。只需要: 在项目中加上QuartzCore框架在实现文件中import QuartzCore的头文件加上这样的一行代码[myView.layer setSha...

绘制阴影引发的 iOS 绘图性能问题总结

绘制阴影引发的 iOS 绘图性能问题总结 MAR 18TH, 2013 | COMMENTS 在 iOS 开发中,通过设置 layer 的 shadowColor、shadowOpac...

iOS开发中界面展示大图片时UIImage的性能问题

在ios开发过程中,经常会要在界面上显示相册里的图片。而现在的手机像素这么高,在切换页面时加载高质量大图片时,尤其是加载多张图片的情况下,界面会出现可以感觉到的卡顿。    而要解决这种性能问题时就...
  • zrwabc
  • zrwabc
  • 2012年07月29日 21:48
  • 2070

iOS UIImage扩展方法(category):放大、旋转、合并UIImage、增加渐变层、添加阴影、调节透明度、保存到相册

iOS UIImage扩展方法(category):放大、旋转、合并UIImage、增加渐变层、添加阴影、调节透明度、保存到相册 一有用的 UIImage 扩展,支持(等比例)放...

Unity优化大全(五)之 GPU-动态阴影和Shader

前段时间总结了下CPU方面的优化,现在来谈谈同样重要的优化部分GPU,其主要会包括以下方面,之后会不断完善。在这里你要知道一点,GPU是负责分辨率的! .动态阴影 . 复杂的Shader . 几...

iOS 截屏以及相关扩展(UIImage的绘制和渲染)

1.截取当前屏幕   CGSize windowSize = behandView.bounds.size;     UIGraphicsBeginImageContextWithOpti...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:绘制阴影 优化 + UIImage 性能优化
举报原因:
原因补充:

(最多只允许输入30个字)