Heim > Fragen und Antworten > Hauptteil
我有个TTTableViewController。Cell是一个自定义的View,基本上就是一张大图,上面有若干个半透明背景的、圆角的标签,大图下面还带有若干个小图。大图的大小是256x256,加上下面一排小图和边框什么的,整个cell的大小大概是264x340。图片都是从网络异步加载的。
一开始的时候界面很卡,后来知道subview的数量,透明色等都会影响性能。但是这些东西确实都是需要的,无法去除。参考了一些文章,比如这个和这个,最终自己重写了drawRect方法来绘制,并且在一个Cell的图像全部加载完成之后将所有内容绘制到一个UIImage对象,并缓存到内存里(cell的总数一般不超过10个),这样下次再显示的时候直接显示该大图即可。
这样修改之后,确实流畅了不少,不过对比了其他类似的应用,似乎仍然觉得有点卡(FPS 15左右)。还有什么可以做呢?
补充:
我有一个侧边栏菜单,平时是放置在UITableView的下面的,只有点击了菜单才会出来,还有一个完全透明的覆盖在所有View上面的View,是用来在显示半透明Modal View的时候不至于隐藏下面的View以至于让侧边栏变得可见,具体看这个问题。这些对性能应该没什么影响吧?我测试的结果似乎是这样的。
还有个问题:
我在drawRect里测试了一下绘制一个Cell所需的时间,在所有图像完成加载并保存成一个UIImage对象后,绘制所需的时间,在模拟器里大约是0.2ms,但是在iPhone 4上大约在6ms,性能相差30倍?正常的绘制一张图片需要多少时间呢?系统配置:
VirtualBox+Mac, i5 M560双核 2.66Ghz, 集显,8G内存(分配给虚拟机2.5G),SSD
另外,好像和这个问题有点重复,但是又不太一样。
怪我咯2017-04-17 11:10:27
FPS 15左右只是有点卡??为什么我觉得50帧一下就卡卡的,45以下基本上就很不顺畅了。iphone4性能这么低也没办法,我现在也在想办法,但是你自己draw的不是视图而是UIImage,然后用有要显示UIImage,这中间需要编码解码啥啥的,感觉绕了个弯吧,还有很多操作可以放到非主线程的,你试试.
经过试验发现,现在drawRect带来的效率提升已经不明显了,而且还有可能在一些情况带来负面效果,不好把握。在保证cell重用的机制上,能把内容view缓存起来,并且把cell的高度也缓存起来,这样能有效提升效率,我的已经不卡了。