Iphone 什么是可接受的滚动FPS,以及提高性能的技巧是什么?

Iphone 什么是可接受的滚动FPS,以及提高性能的技巧是什么?,iphone,ios,objective-c,ipad,uiscrollview,Iphone,Ios,Objective C,Ipad,Uiscrollview,我在许多WWDC视频中看到,您希望尽可能接近60.0 FPS,以获得更好的平滑滚动体验。我有一个UIScrolLView,它可以同时加载图像和几个表视图。目前,我得到30 FPS。这是推荐FPS的一半。我只是想知道,对于加载图像和其他繁重内容/渲染内容的表视图/滚动视图,你们通常会得到什么样的FPS 关于选择FPS还有其他建议吗?在过去的一周里,我一直在使用时间分析器、分配和核心动画工具来尽可能地优化工具 只是想澄清一下我的想法。我在iPad上有一个砖石/瀑布/针叶树风格的布局。所以这不仅仅是一

我在许多WWDC视频中看到,您希望尽可能接近60.0 FPS,以获得更好的平滑滚动体验。我有一个UIScrolLView,它可以同时加载图像和几个表视图。目前,我得到30 FPS。这是推荐FPS的一半。我只是想知道,对于加载图像和其他繁重内容/渲染内容的表视图/滚动视图,你们通常会得到什么样的FPS

关于选择FPS还有其他建议吗?在过去的一周里,我一直在使用时间分析器、分配和核心动画工具来尽可能地优化工具

只是想澄清一下我的想法。我在iPad上有一个砖石/瀑布/针叶树风格的布局。所以这不仅仅是一个普通的UITableView。它是一个UIScrollView,填充了整个屏幕,并填充了几个UIView。每个视图都有一个150x150 UIImageView和一个UITableView,还具有一些属性标签,使用核心文本绘制。因此,当您看到屏幕时,一眼就可以看到5-8个表格视图,每个单元格又有一个UIImageView,然后每个单元格呈现使用核心文本绘制的属性标签

所以你可以想象这是多么深刻和复杂。这不仅仅是带有UIImageView的常规表视图。我知道如何在一个带有UIImage的iPhone中只使用一个UITableView就可以获得60 FPS的速度。其概念是异步加载图像,而不是尽可能多地阻塞主线程

编辑:

这里的问题似乎是我的视图中的UITableView。。当我从UIView中删除它时,我可以获得非常平滑的滚动


我上传了一个示例项目,它是我拥有的一个更简单的版本,但它清楚地显示了问题所在。链接是

我会做一件叫做延迟加载的事情,在实际看到图像之前不会加载图像

下面是一个关于如何做到这一点的好例子:


祝你好运

我使用我的
UITableViewController
可以获得接近60 fps的速度,其中表格包含大约2000个单元格,每个单元格从web上提取一个图像。诀窍是根据需要延迟加载图像。这很有帮助


一般的想法是通过不阻塞主线程来保持UI的响应性。在另一个线程上执行下载和其他耗时的任务。

我所做的就是使用NSCache。我创建了一个具有符合NSCache数据协议的属性的小型类(这非常容易做到)。所以我要做的是在主表中的每个单元格和各种值得缓存的东西之间创建一个关系:NSAttributed字符串、图像等等——实际上是任何需要创建的东西。我不预装,但你可以

当tableview要求您提供单元格时,请在缓存中查找主对象。如果存在,则拉动所有需要的对象。如果缓存中没有对象,则以旧方式获取数据,但在完成之前,也将其保存在缓存中

这确实帮助我减少了滚动单元格时的“口吃”。另外,不要在单元格中设置任何动画-这会降低性能。一切都应该充分渲染

另一件要记住的事情是,确保可以设置为不透明的视图的属性设置为“是”。这当然有助于系统渲染单元(如果使用backgound视图,则包括backgound视图)

编辑:

因此,您提供的信息中包含的UITableView可能是根本问题。因此,有两项建议:

1) 您能否退一步,找出如何使scrollView成为单个UITableView?有了表的页眉和页脚、节的页眉和页脚,甚至可以使单元格成为一个浮动视图,难道你不知道如何重新构造你所拥有的吗


2) 所以你决定不接受建议1。然后,做这个。将tableview使用的空间视为容器视图。每当编辑tableview时,请为其拍摄一张图像快照,并保留此图像。一旦用户开始滚动,就将TableView换成图像。当scrollView停止时,将UITableView调回。这当然需要一些微调。事实上,在滚动过程中,您可能会在表上覆盖一个不透明的图像快照(这将隐藏它并防止它被要求自行绘制)。

许多因素会影响渲染性能,下面是一些您可以检查的项目:

  • 简介-你说你已经做了,做得很好!不幸的是,分析常常被忽视,即使它可能会暴露出意想不到的问题。在一个应用程序中,我使用不同的单元格来表示日期。起初,单元格之间的滚动速度很慢,这是出乎意料的。我想可能是画的细胞太多了。分析后,我发现
    [NSCalender currentcalendar]
    占用了我85%的CPU时间!修复后,一切滚动伟大

  • 图像-大型图像给CoreGraphics带来了很大的负载。滚动尤其需要大量的绘图操作来移动它们。一个技巧是尽可能少地缩放设备上的图像,这使CoreGraphics的工作更容易。如果图像的大小是显示它的视图的两倍,请在视图中显示之前调整UIImage的大小。iOS设备最能处理PNG。它们在编译时由一个工具(pngcrush)压缩,iOS有专门的硬件来呈现它们

编辑:JPG可能是照片的更好选择。iOS设备也有专用的JPG解码器

  • 自定义绘图-如果可能,减少自定义绘图的数量。大量自定义绘图对动画速度有负面影响。如果可能的话,我会考虑在复杂的自定义绘图上使用图像

  • 挑选-只画你需要的东西<代码>UITableView在单元格加载时自动卸载和加载单元格
    - (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;
    }