首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是可接受的滚动FPS,以及提高性能的建议是什么?

什么是可接受的滚动FPS,以及提高性能的建议是什么?
EN

Stack Overflow用户
提问于 2012-07-28 19:17:51
回答 8查看 6.2K关注 0票数 18

我看到在许多WWDC的视频,说你想要达到60.0 FPS尽可能接近,以获得一个更顺利的滚动体验。我有一个UIScrolLView,它可以同时加载图像和两个表视图。目前,我得到30个FPS。这是建议的FPS的一半。只是想知道,通常情况下,在加载图像和其他繁重的内容/渲染内容的表视图/滚动视图中,会得到什么FPS。

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

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

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

编辑:

这里的问题似乎是我的观点中的UITableView。当我从UIView中删除它时,我会得到非常平滑的滚动。

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-08-04 05:24:16

许多因素会影响呈现性能,以下是您可以检查的一些项:

  • 侧写-你说你已经做过了,干得好!不幸的是,分析常常被忽略,尽管它可能暴露出意想不到的问题。在一个应用程序中,我在用不同的单元格表示日期。起初,单元格之间滚动的速度很慢,这是出乎意料的。我以为这画的细胞太多了。在分析之后,我发现[NSCalender currentCalender]占用了我85%的CPU时间!修复后,一切都滚动得很好!
  • 图像--大型图像在CoreGraphics中放置了大量的负载。滚动特别需要大量的绘图操作来移动它们。其中一个技巧是尽可能地缩小设备上的图像,这使得CoreGraphics的工作变得更加容易。如果图像是显示它的视图的两倍大,则在视图中显示图像之前调整UIImage的大小。iOS设备处理PNG的效果最好。它们在编译时被工具(pngcrush)压缩,iOS有特殊的硬件来呈现它们。

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

  • 自定义绘图-如果可能的话,减少自定义CGContext绘图的数量。大量的自定义绘图会对动画速度产生负面影响。如果可能的话,我会考虑在复杂的自定义绘图上使用图像。
  • 只画你需要的东西。UITableView会自动卸载和加载单元格,因此这是为您完成的,但是任何定制的CGContext绘图都应该只在该部分可见时进行。而且,在我的经验中,自动视图阴影可能会非常慢。
  • 重用--在UITableView上使用重用标识符,这将允许UITableView重用单元对象,而不是在滚动时重新分配--看看这个问题的答案。还可以重用UIImages,而不是为同一个文件分配多个文件。imageNamed自动缓存图像,但文件的imageFromContents不缓存。
  • 创建自己的视图--您可以创建自己的网格视图类,该类选择隐藏在屏幕之外的子视图,并在加载延迟内容的情况下滚动。通过编写自定义解决方案,您可以完全控制流程,并创建针对使用上下文的优化设计。对于大多数用例来说,您将很难构建比Apple标准更好的东西,但是我已经在特定的案例中看到了它。
  • 最后,减少违规视图的大小(改进滤液),将内容分解成多个页面,缩小图像大小,删除不太正常的旧设备。我会满足于30个FPS,然后牺牲了大部分的东西。设备将继续变得更快,旧设备将被淘汰,您的应用程序将逐渐变得更快。
票数 20
EN

Stack Overflow用户

发布于 2012-07-28 19:23:47

我的UITableViewController接近60 fps,其中的表格包含大约2000个单元格,每个单元格从网络中提取一张图像。诀窍是懒洋洋地加载图像,因为您需要它们。这个来自Apple的示例代码非常有用。

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

票数 7
EN

Stack Overflow用户

发布于 2012-07-28 19:21:51

我会做一件叫做“延迟加载”的事情,它不会加载图像,直到它们被实际看到。

下面是一个很好的例子,说明如何做到这一点:http://www.cocoacontrols.com/platforms/ios/controls/mhlazytableimages

祝好运!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11703925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档