参考链接:
1.不透明
- label设置背景色,避免默认的透明
- 使用不含alpha通道的图片
2.离屏渲染
- 如果你的APP有很多层,而且希望增加动画。GPU一般来说不得不重新合成所有的层在1秒60帧的速度下。当使用离屏渲染时,GPU需要合成这些层到一个新的位图纹理缓存里面,然后再用这个纹理绘制到屏幕上面。当这些层一起移动时,GPU可以重复利用这个位图缓存,这样就可以提高效率。当然,如果这些层没有修改的化,才能有效。如果这些层被修改了,GPU就不得不重新创建这个位图缓存。你可以触发这个行为,设置
layer.shouldRasterize = YES
开启 - 如果只是绘制一次,那么这样做反而会更慢。创建一个额外的缓存对GPU来说是一个额外的工作,特别是如果这个位图永远没有被复用。一般来说,需要避免离屏渲染。因为开销很大。在屏幕上面直接合成层要比先创建一个离屏缓存然后在缓存上面绘制,最后再绘制缓存到屏幕上面快很多。这里面有2个上下文环境的切换(切换到屏幕外缓存环境,和屏幕环境)。增加遮罩mask、设置圆角cornerRadius、设置阴影shadow 都会触发离屏渲染
- 如果你希望在层的contents属性这只一个矩形的遮罩,那你更应该使用contentsRect而不是使用遮罩。如果你最后设置shouldRasterize = YES,记住还要设置rasterizationScale = contentsScale
3.避免misalign
- 当一个层上面的所有像素和屏幕上面的像素完美对应,我们就说这个层是像素对齐的。主要有2个原因导致可能不对齐。第一个是放大缩小;当放大或是缩小是,纹理的像素和屏幕像素不对齐。另一个原因是当纹理的起点不在一个像素边界上。这2种情况,GPU不得不做额外的计算。这个需要从源纹理中混合很多像素来创建一个像素用来合成。当所有像素对齐时,GPU就可以少做很多工作。
- 可以通过重绘图片(带option的context)再使用,可以避免
图片加载
- UIImageView 是由CALayer, UIImage->CGImage 构成的,CGImage 在加载的时候不会解码图像,只有在第一次用的时候才会解码图像(Lazy Loading)。所以,尽量用UIImageView 不要直接把图像画在
drawRect:
- iOS本身对PNG图片进行了很多优化,尽量使用PNG作业UI素材
- 多次使用的图片使用有缓存的
[UIImage imageNamed:]
方法加载,一次性读取的使用无缓存的[UIImage imageWithContentsOfFile:]
方法加载 - 设置背景图片使用
layer.contents
代替在drawRect:
中直接绘制 drawRect:
方法中有较多内容时,可以开启异步绘制view.layer.drawAsynchronously = YES
- 尽量使用
setNeedDisplayInRect:
代替setNeedDisplay
可以节省很多开销
scrolling
- 考虑优化功能部分在GPU还是CPU:
1.CGDrawing和imageIO是CPU;
2.渲染系统并不每一帧都工作在CPU上
3.渲染本身是在GPU上的
4.可以用OpenGL ES instruments 上的device utilization 查看GPU使用情况,如果是100%左右,考虑优化GPU使用,如果是16%之类的较低值,考虑优化CPU使用。可以使用Core Animation instrument 查看GPU。 - 减少blending layers,即经常需要多次重画的层,尽量避免不透明元素的使用,或者
self.layer.shouldRasterize = YES
- 在time profiler 里,如果有很多的时间被花在springboard里,spring board实际是render server的,所以应用里可能有太多层layer,可以考虑合并一些。例如将无需响应事件的多个图片合成一整张。
重用和取消
- 尽可能重用元素,cell、视图等
- 在视图如cell滚出可视区域时,取消其中绑定的操作,如网络请求图片下载等
ibireme博客抄录
对象创建
对象的创建会fen