本文主要介绍在编写代码时,应该注意的一些性能方面的问题。如果在编写阶段,就意识到这些,那后期性能优化,可能会事半功倍。
1、通过 Storyboard 创建视图对象时,其资源消耗会比直接通过代码创建对象要大的多。所以,对于复杂的动画、视图界面,建议用代码去实现。如果 Storyboard 中的视图太多,每次Xcode打开的时间都很慢,建议按模块创建多个 Storyboard,并且每个 Storyboard 里的视图不要超过20个。
2、尽量推迟对象的创建时间,用懒加载去创建对象。
3、视图布局计算是 App 中最为常见的消耗 CPU 资源的地方。如果能在后台线程提前计算好视图布局、并且对视图布局进行缓存,这样会大大提高性能问题。
常见视图高度计算就是UITableView,如果不做缓存,每次在 heightForRow 里都要计算高度,浪费 CPU 性能。所以,在计算完高度之后,应该将高度保存在 cellForRow 里要显示的 Model 上。在 heightForRow 里返回之前,每次都判断一下,是否有缓存高度,如果有,则直接返回。没有,则去计算。
4、当多个视图重叠在一起显示时,GPU 会首先把他们混合到一起。如果视图结构过于复杂,混合的过程也会消耗很多 GPU 资源。为了减轻这种情况的 GPU 消耗,应当尽量减少视图数量和层次,并在不透明的视图里标明 opaque 属性以避免无用的 Alpha 通道合成。当然,也可以把多个视图预先渲染为一张图片来显示。
5、屏幕上的每个像素点的颜色是由当前像素点上的多层 layer 共同决定的,GPU 会进行计算出混合颜色的 RGB 值,最终显示在屏幕上。而这需要让 GPU 计算,所以我们要尽量避免设置alpha,这样GPU会忽略下面所有的layer,节约计算量。
6、苹果的 GPU 只解析32bit的颜色格式,如果你放一张图片,而它的颜色格式却不是32bit,CPU 会先进行颜色格式转换,再让 GPU 渲染。这样 CPU 就默默做了多余的工作。
7、视图界面上 imageView 的实际大小和后台返回的 image(图片数据) 大小应该一致。不然会触发反锯齿计算,增加性能损耗。所以,针对不同场景建议放置多个尺寸的图片资源,如:常见的大图、小图。
8、离屏渲染,指的是 GPU 在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。离屏渲染的整个过程,需要多次切换上下文环境,而上下文环境的切换是要付出很大的代价。常见的设置图片圆角,就会造成离屏渲染。对于圆角图片不是很多的视图,可以采取这种办法。对于较多圆角图片的视图,可以用一个中间透明的圆形图片遮在 imageView 上。
9、UITableView优化
1.在不等高Cell当中,提前计算Cell的行高。
2.如果Cell中图片的宽高,指定为小数点,会造成锯齿,造成锯齿就会导致离屏渲染。
3.Cell当中的 ImageView 的大小最好是跟 UIImage 是一样大。如果不一样大它会对UIImage做形变操作,Cell当中展示都是小图,点击放大后,再去用大的 imageView 加载大图。
4.加载完毕的数据建议做本地缓存。
5.Cell当中不要动态的添加子控件。一般都在创建时,就把要出现的控件给添加进去,暂时不要显示的就隐藏。
6.尽量减少Cell内部子控件的个数。
7.如果控件非常多,把不需要与用户进行交互的控件,异步绘制成一张图片,把图片添加到Cell当中。
8.如果Cell的高度是固定的建议这样去设置
self.tableView.rowHeight = 65;
不建议在delegate去设置
- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath {
return 65;
}
未完待续...