1
Sai 2012-05-09 00:17:17 +08:00 1
Try layer.shouldRasterize = YES;
|
2
txx 2012-05-09 05:24:56 +08:00 1
我一直觉得coreanimation的效率非常不错
lz您不会是cell没写好吧。。 |
3
adow OP |
4
dongsheng 2012-05-09 11:13:41 +08:00 1
有没有试试直接把图片直接画到cell的CALayer上?额外用UIImageView肯定要消耗更多资源。
|
5
adow OP google 了一下CALayer,看到了 @livid 的这个http://picky.olivida.com/calayer-and-ipad-apps-performance
> 每一个 UIView 对象实例都包含一个 CALayer 实例,可以通过 [myView layer] 的方式访问到。而 CALayer 又提供了非常多的邪恶功能,比如修改一个 view 的圆角程度,甚至给它加阴影。这些方法都非常好用。但是代价就是程序的 framerate 就会大受影响,尤其是执行诸如 presentModalViewController 这样全屏幕豪华操作时。 结论是:要用 CALayer 可以,但是在写到屏幕上之前一定要先将这个 layer 的内容变成一坨简单的 bitmap,否则就等着看幻灯片吧。 |
6
jesse0628 2012-05-09 11:43:13 +08:00 1
跟楼主体会完全一样,我一直找不到原因,为什么我的添加到scroll view里面的东西会滚起来那么卡,原因大概还是我里面用了很多CALayer圆角的东西,也做了一些CALayer比如绘制什么的操作。但是应该最大的问题是圆角引起的。
|
7
senopanas 2012-05-09 11:45:14 +08:00 1
clipsToBounds=YES实际上还多了一个step跳转到masksToBounds=YES,效果当然都一样:
-(BOOL)[UIView(Rendering) clipsToBounds] +0 3091938a 55 pushl %ebp +1 3091938b 89e5 movl %esp,%ebp +3 3091938d e800000000 calll 0x30919392 +8 30919392 59 popl %ecx +9 30919393 8b4508 movl 0x08(%ebp),%eax +12 30919396 8b5004 movl 0x04(%eax),%edx (CALayer)_layer +15 30919399 8b8186cb1301 movl 0x0113cb86(%ecx),%eax masksToBounds +21 3091939f 89450c movl %eax,0x0c(%ebp) +24 309193a2 895508 movl %edx,0x08(%ebp) +27 309193a5 c9 leave +28 309193a6 e92e211801 jmpl 0x31a9b4d9 不过至少可以省一步,shouldResterize效果不大但是有效果。一般来说在cell上添加一个CAlayer的圆角并且masksToBounds也不会降低多少performance,你的头像图片是lazy loading吗? |
8
mr_pppoe 2012-05-09 11:59:42 +08:00 1
隐约记得有一段WWDC的视频讨论了类似的问题
|
9
adow OP @senopanas 头像是异步http下载的,我现在是下载完后处理成圆角的UIImage后赋值到imgAvator.image上
|
10
adow OP 哦对了,实际运行中,因为头像部分的http请求做了缓存,所以大部分是本地读取的文件,跳过http请求的
|
11
elden 2012-05-09 12:30:58 +08:00 1
直接设置cornerRadius会影响滚动的流畅性。如果cell不使用复杂背景,那可以在头像上覆盖一层空心的圆角图片。
|
12
ultragtx 2012-05-09 12:45:08 +08:00 3
CALayer直接setCornerRadius会发生offscreen rendering,简单地说就是在屏幕外渲染一遍,接着再渲染到屏幕上(涉及到多开一个屏幕外buffer,屏幕内buffer和屏幕外buffer来回切换等问题),CoreAnimation是逐帧渲染的,所以scroll的时候每帧都进行这个操作,结果就很慢,解决方法一般就是先把圆角图片画出来。
一楼Sai那个方法就是缓存offscreen render,这样就不用每帧都渲染一遍,但是要求layer的内容是不变的,如果有变化还是要慢,不过你这个情况应该符合。 具体参考WWDC 2011 Session 121 这个讲的特别细 |
13
adow OP 感谢大家的讨论,我之前一直都不知道这些。
|
14
keakon 2012-05-11 20:55:36 +08:00 1
最好不要用 UIImageView 和 CALayer,比直接显示肯定要慢的。另外可以用预渲染:
http://www.keakon.net/article/96200 http://www.keakon.net/article/98200 |
15
hydyy 2012-12-07 21:56:10 +08:00
哈喽~ 楼主您解决这个问题了嘛? 我也遇到了~~哈哈阿红
|