我在很多WWDC视频来看看,说你想达到60.0 FPS尽可能接近获得更好的平滑滚动体验。 我有一个加载了图像一个UIScrollView和一次一对夫妇的表视图的。 目前,我得到30 FPS。 这是推荐的FPS的一半。 只是想知道什么FPS做你们通常得到的是加载了图片和其他重的东西/渲染的东西表格视图/滚动视图。
任何其他提示optiziming FPS? 我已经度过了过去一周到现在发射了使用时间简档,分配和核心动画工具来优化为尽我所能仪器。
只是为了澄清什么,我有一点。 我有一个砖石/瀑布/ Pinterest的风格在iPad上的布局。 因此,它不只是一个普通的UITableView。 这是填写整个屏幕一个UIScrollView,并充满了一对夫妇的UIView的的。 每个这种观点的有一个150×150的UIImageView和一个UITableView并且还具有一定的归因标签,使用核心文本绘制。 因此,在当你看到屏幕上一目了然,你可以在一杆见5-8表视图,每个单元又具有一个UIImageView,然后每个单元渲染归因使用的核心文本标签绘制。
所以你可以像有多深和复杂的,这是。 这不只是一个UIImageView常规表视图。 我知道如何获得60 FPS只有一个的UITableView在iPhone与一个UIImage。 概念是asynchrounously和不加载图像以阻塞主线程尽可能。
编辑:
看来,这里的问题是,我有我的看法里面的UITableView ..当我删除从我的UIView得到真正的平滑滚动..
我上传了一个样本项目,该项目是什么,我有一个简单的版本,但它清楚地表明了问题。 这个链接是这里
许多事情会影响渲染性能的,这里有一些项目可以检查:
简介 - 你说你已经做了这一点,所以伟大的工作! 不幸的是分析常常被忽视,即使它可以揭示意想不到的问题。 在一个应用程序,我正在与代表日期不同细胞的日历。 在细胞慢,这是意想不到之间的第一滚动。 我想,也许这是画几个细胞太多。 分析后,我发现[NSCalender currentCalender]
用我的CPU时间的85%! 固定一切滚动伟大了!
图片 - 大图像投入了大量负荷的CoreGraphics中。 滚动尤其需要大量汲取操作来他们走动。 一个技巧是规模小到就可以了,这使得CoreGraphics在工作轻松了许多设备上的图像。 如果图像是两倍大的视图显示它,在视图中显示之前调整的UIImage。 iOS设备处理PNG格式最好。 他们是在编译时的工具(pngcrush)压缩和iOS有特殊的硬件渲染他们。
编辑 :JPG格式是可能的照片是更好的选择。 iOS设备有专门的JPG解码器为好。
自定义绘图 - 如果可能的话,削减定制CGContext上的量绘制你怎么做。 自定义绘制的大量对动画的速度产生负面影响。 我会考虑的,使用图像在复杂的自定义绘制如果可能的话。
卡尔 - 只画出你需要的东西。 UITableView
自动卸载和加载的细胞,因为它们出现,所以这是你做的,但当这部分是可见的任何自定义CGContext上拉只应做。 另外自动观看的阴影可以在我的经验很慢。
重用-使用就重用标识符UITableView
,这将允许UITableView
重用细胞的对象,而不是重新分配,因为它滚动-看看回答这个问题 。 此外重用UIImages
,而不是同一个文件分配多个。 imageNamed
自动缓存图像,但imageFromContents
文件没有。
创建自己的 - 你可以创建一个剔除它的子视图,视图中隐藏关屏,并滚动懒内容加载自己的网格视图类。 通过编写自定义解决方案,您可以完全控制该过程并创建一个设计的使用环境进行了优化。 对于大多数使用情况下,你将有一个很难建立的东西比苹果的标准好,但我已经看到它在特定的情况下完成的。
最后一招 - 减少违规视图的大小(提高滤液),突破内容分成多个页面,缩小图像,切出不执行,以及旧设备。 牺牲大部分的东西之前,我会满足于30 FPS。 设备将继续得到更快,旧设备将被淘汰,而且您的应用会逐渐得到更快。
我得到接近60 fps的我UITableViewController
当表包含大约2000个细胞和每一个单元是直接从网路上的图片。 关键是要延迟加载的图片,你需要他们。 这从苹果的示例代码是非常有益的。
总的想法是,以保持UI响应由不阻止主线程。 在另一个线程进行下载等耗时的任务。
我会做一些所谓的延迟加载,直到他们实际上看到这不加载图像。
下面是关于如何做一个很好的例子: http://www.cocoacontrols.com/platforms/ios/controls/mhlazytableimages
祝好运!
我所做的就是用NSCache。 我已经创建了性能小类,符合NSCache数据协议(它真的很容易做到)。 所以我要做的就是创建主表和各种事情值得缓存每个单元之间的关系:NSAttributed字符串,图像等 - 真的什么,需要创建工作。 我不预装它,但你可以。
当你被要求提供由tableview中的单元格,看在你的缓存为您的主要对象。 如果有,把所有你需要的所有对象。 如果缓存中没有对象,然后获取数据的旧时尚的方式,但在结束之前,将其保存在缓存中了。
这真的帮滚动单元格时我减少“口吃”。 另外,不要在动画细胞东西 - 杀死性能。 一切应全部呈现。
另一件事要记住 - 确保不断查看其可以设置为不透明有其属性设置为YES。 这肯定有助于系统使细胞(包括如果你使用一个backgound观点。)
编辑:
所以,你提供的,其中包括可能根本问题UITableViews信息。 所以两个建议:
1)您可以退后一步,并找出如何使滚动视图单一的UITableView? 随着表的页眉和页脚,以及部分页眉和页脚,甚至基本上使细胞浮动视图的能力,你能不能找出如何重新构建你有什么?
2)所以你决定不来的建议。然后,做到这一点。 认为所用的tableview中为是容器视图空间。 每当tableview中进行编辑时,利用它的图像抓拍,并保持这个图像周围。 一旦用户开始滚动,交换tableViews出来的图像。 当滚动视图中停止掉了的UITableView回来。当然,这需要一定的微调。 事实上,你很可能覆盖在桌子上的不透明图像快照(这将隐藏它,防止它被要求自行绘制)在滚动过程。
人眼看到在60 FPS,所以这就是为什么它的建议,但30 FPS也会出现很流畅,特别是当一个普通用户浏览时使用,而不是你试图找到尽可能多的解决成为可能。 这显然是依赖于滚动的速度有多快进,如果帧与帧的差别是几个像素的运动,30 FPS会做得很好,但速度更快的移动会要求更高的FPS出现平稳
有几件事情你可以做的一般,以获得更好的表视图的性能:
1)切换到绘图的UITableViewCell的(因为缺乏更好的链路的罗兰Brichter的方法: http://www.therefinedgeek.com.au/index.php/2010/12/21/fast-scrolling-uitableview-updates-for- IOS-4-2 / )
基本上,所有他的代码的作用是使你的所有单元格的内容作为一个不透明的UIView,它的UITableView(和CoreGraphics中)可以非常迅速地爆到一个UITableViewCell
如果你不想做你的所有单元格设计的drawRect:,你仍然可以使用笔尖,但是:
- 确保每个子视图被标记为不透明
- 没有任何透明/半透明的子视图
- 没有任何图像用alpha通道!= 1.0F。
2)不要让的UIImageView做任意缩放,以显示你的形象,给它一个正确大小的UIImage
3)如果您使用iOS 5及以上,可以注册用于特定小区标识符的笔尖。 这样,当你调用[的tableView dequeueReusableCellWithIdentifier:],可以保证得到一个细胞。 细胞分配更快(根据苹果),和你能写更少的代码:
- (void)viewDidLoad {
UINib *nib = [UINib nibWithNibName:@"MyCell" bundle:nil];
[self.tableView registerNib:nib forCellReuseIdentifier:@"MyCellIdentifier"];
}
// ...
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"MyCellIdentifier";
MyCell *cell = (MyCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
// Commented out code is no longer needed
//if (cell == nil) {
// cell = [[MyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
//}
// setup cell
return cell;
}
4)从网上下载的图片显示
- 显示默认图像(东西来看待,而真正的图像下载)
- 启动一个单独的线程下载(提示:使用GCD的dispatch_async())
- 当图像到达时,它缓存(提示:NSCache),并在单元格中显示它
- 是否所有图像下载/缓存关闭主线程; 你应该在主线程上做的唯一事情是设置图像(记住UI代码必须是在主线程上!)
你可能会想要写一个异步能力的UIImageView(或使用现有的库)。
远离EGOImageView了,即使它有异步下载,它缓存查找(这恰好是在磁盘上,这样就意味着昂贵的磁盘IO)在主线程调度到后台线程进行下载了。 我用它,但我最终写我自己的一套类来处理这个问题,并且它的显著更快。
-
只要按照这些和其他的东西脂肪酶在这里写的,你就会有一个滚动像玻璃在没有时间表的看法:)
你想60fps的,但30 fps的不看太可怕了在现实中。 不过,我会尽量做到60fps的一个平滑的外观,同时滚动。
有许多性能改进的可能性,这也是由各种教程所示
虽然60 FPS是理想的,游戏,像晕30 FPS运行非常娇滴滴。 在最后一战战场的混乱可能涉及比大多数名单更令人惊讶的,快速的运动,甚至复杂的像你这样的!
文章来源: What is an acceptable FPS for scrolling, and what are tips for improving performance?