我在许多 WWDC 视频中看到,您希望尽可能达到 60.0 FPS,以获得更好的平滑滚动体验。我有一个 UIScrollLView ,它可以立即加载图像和几个表格视图。目前我的帧速率为 30 FPS。这是推荐 FPS 的一半。只是想知道对于加载图像和其他繁重内容/渲染内容的表格视图/滚动视图,你们通常会获得多少 FPS。
还有其他优化 FPS 的技巧吗?过去一周到现在,我一直在使用时间分析器、分配和核心动画工具来启动 Instruments,以尽可能地进行优化。
只是为了澄清一下我所拥有的。我在 iPad 上有砖石/瀑布/pinterest 风格的布局。所以它不仅仅是一个普通的 UITableView。它是一个填充整个屏幕的 UIScrollView,并且填充了几个 UIView。每个视图都有一个 150x150 UIImageView 和一个 UITableView,并且它还有一些使用 Core Text 绘制的属性标签。因此,当您看到屏幕时,一眼就能看到 5-8 个表格视图,每个单元格又具有一个 UIImageView,然后每个单元格呈现使用核心文本绘制的属性标签。
所以你可以想象这是多么深刻和复杂。这不仅仅是带有 UIImageView 的常规表格视图。我知道如何在 iPhone 中仅使用一个 UITableView 和 UIImage 来获得 60 FPS。其概念是异步加载图像并且尽可能不阻塞主线程。
EDIT:
看来这里的问题是我视图中的 UITableView 。当我从 UIView 中删除它时,我得到了非常平滑的滚动。
我上传了一个示例项目,它是我所拥有的更简单的版本,但它清楚地显示了问题。链接是here http://dl.dropbox.com/u/19680269/BroBoard.zip
许多因素都会影响渲染性能,您可以检查以下一些项目:
简介 - 你说你已经做到了,干得好!不幸的是,分析经常被忽视,尽管它可以揭示意想不到的问题。在一个应用程序中,我正在开发一个日历,其中不同的单元格代表日期。起初,单元格之间的滚动速度很慢,这是出乎意料的。我想也许是绘制了太多的单元格。分析后我发现[NSCalender currentCalender]
使用了 85% 的 CPU 时间!修复后一切都滚动得很好!
图像 - 大图像会给 CoreGraphics 带来很大的负载。滚动尤其需要大量绘制操作来移动它们。一个技巧是尽可能小地缩放设备上的图像,这使得 CoreGraphics 的工作变得更加容易。如果图像是显示它的视图的两倍,请在视图中显示之前调整 UIImage 的大小。 iOS 设备处理 PNG 的效果最好。它们在编译时由工具(pngcrush)压缩,iOS 有特殊的硬件来渲染它们。
Edit:JPG 可能是照片的更好选择。 iOS 设备也有专用的 JPG 解码器。
自定义绘图 - 如果可能,减少您进行的自定义 CGContext 绘图的数量。大量自定义绘图会对动画速度产生负面影响。如果可能的话,我会考虑在复杂的自定义绘图上使用图像。
Cull - 只画你需要的东西。UITableView
当单元格出现时自动卸载和加载单元格,因此这是为您完成的,但任何自定义 CGContext 绘图都应该仅在该部分可见时完成。根据我的经验,自动视图阴影也可能非常慢。
重用 - 使用重用标识符UITableView
,这将允许UITableView
重用单元格对象而不是在滚动时重新分配 - 查看此问题的答案question https://stackoverflow.com/questions/2152180/iphone-what-are-reuseidentifiers-uitableviewcell。也可重复使用UIImages
而不是为同一个文件分配多个。imageNamed
自动缓存图像但是imageFromContents
文件没有。
创建您自己的 - 您可以创建自己的网格视图类,该类会剔除隐藏在屏幕外的子视图视图,并通过延迟内容加载进行滚动。通过编写自定义解决方案,您可以完全控制流程并创建针对使用环境优化的设计。对于大多数用例,您将很难构建比 Apple 标准更好的东西,但我已经在特定情况下看到了它的完成情况。
最后的手段 - 减少有问题的视图的大小(提高过滤率),将内容分成多个页面,缩小图像大小,删除性能不佳的旧设备。在牺牲大部分内容之前,我会满足于 30 FPS。设备将继续变得更快,旧设备将被淘汰,您的应用程序将逐渐变得更快。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)