绘制阴影 优化 + 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();

相关文章推荐

iOS的阴影绘制及性能优化

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

设置阴影时的性能优化

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

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

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

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

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

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

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

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

1.截取当前屏幕   CGSize windowSize = behandView.bounds.size;     UIGraphicsBeginImageContextWithOpti...

在图片UIImage上绘制文字(字符串文字转图片)

很多时候我们需要在一张背景图上面绘制文字并且重新生成一张带有绘制好文字的图片,一开始我使用的是我上篇博客中提到的先自定义一个UIView然后再UIView上面绘制文字,绘制完成之后再通过将UIView...

绘制UIImage

-(UIImage *)imageFromColor:(UIColor*)color { CGRect rect = CGRectMake(0, 0, 1, 1); UIGraphic...

UIImage高性能圆角绘制,压缩,截屏,帧图片获取,修改原有image底色等各种功能持续更新

UIImage功能大全,持续收录

Android性能优化-过度绘制解决方案

过渡绘制:屏幕上某一像素点在一帧中被重复绘制多次,就是过渡绘制。 下图中多个卡片跌在一起,但是只有第一个卡片是完全可见的。背后的卡片只有部分可见。但是android系统在绘制时会将下...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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