iphone - 使用 CGLayer 缓存 UITableView 中的单元格

标签 iphone uitableview scroll cglayer

我正在尝试提高我们应用程序中的滚动性能。我遵循了所有普遍接受的建议(用 CG 自己绘制、单元格不透明、没有 subview 等),但当我们有后台 CPU 和网络事件时,有时它仍然会卡顿。

这里列出了一个解决方案:

http://www.fieryrobot.com/blog/2008/10/08/more-glassy-scrolling-with-uitableview/

是缓存单元格的位图快照,我们尝试过。但位图很模糊并且占用了大量内存(每个位图大约几百 kb)。

该链接的评论中的一个建议是使用 CGLayer 或 CALayer(?) 缓存单元格,因为它们会进入显卡的内存。所以有几个问题,

1)有人尝试过这个吗?示例代码?

2) iphone/ipod touch 显卡有多少内存?这有什么意义吗?

3)还有其他加快速度的建议吗?


更多信息

我使用了 CPU 采样器(在手机上)并系统地消除了单元中的内容以找出问题所在。一些事情:

1) 这不是单元格的设置。如果我只删除绘图调用(drawinrect 等),但保留设置,它就会变得玻璃状。

2)这不是最小图像(25x25 png)的绘制,如果我把它放进去就可以了。

3) 如果我添加第二个或第三个图像(第一个是大背景 320x1004kB,另一个是按钮图像 61x35 4kB),它就会卡顿。我在类方法中获取两个 UIImage,因此它被缓存。

4)文字也是一个问题。看起来 by drawRect 花费了 75% 的时间在我正在使用的三个 NSString drawInRect 方法中。喜欢:

[mytext drawInRect:drawrect withFont:myFont lineBreakMode:UILineBreakModeTailTruncation];

这些调用似乎通过 webcore,也许这会导致一些口吃?我需要能够格式化两行文本和一小段文本。我需要能够用省略号截断文本。我可以在关键路径之外执行这些操作并缓存它们吗?我可以用一层来做这部分吗?

最佳答案

CGLayers 不会缓存在 GPU 上,它们在将 Core Graphics 元素绘制到上下文的过程中使用。 CALayers 确实将其视觉内容缓存在 GPU 上。这可以“隐藏”您的一些内存使用情况,但如果您保留大量 CALayers,您仍然会遇到内存问题。

老实说,如果您遵循 Loren Brichter 等人所描述的表格 View 最佳实践,通过 Core Graphics 在一层中绘制所有内容,使单元格不透明,并遵守单元格重用机制 TableView ,您无能为力。无论您如何优化,iPhone 上的 CPU 重载都会导致滚动卡顿。惯性滚动动画确实需要一些 CPU 能力才能运行。

最后要确保的一件事是您引用的后台 CPU 和网络进程确实在后台线程上运行。主线程中运行的任何内容都会导致您的交互方法在该任务处理时暂停,可能会增加滚动的不稳定性。

关于iphone - 使用 CGLayer 缓存 UITableView 中的单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2036192/

相关文章:

swift - 底部行的可扩展 tableView 单元格可见问题?

jquery - jquery垂直选项卡中点击不同选项卡时如何使页面滚动到顶部

ios - 如果显示 2 秒,则将显示的 UITableView 单元格存储在 NSString 中

iphone - 向 UITableView 添加行时出现 NSInternalInconsistencyException

iPhone FTPS 客户端

javascript - 带有固定标题的scrollIntoView()

javascript - 如果在移动设备上滚动,则防止点击链接

ios - 如何使CCRenderTexture透明

iphone - 使用 Storyboard 的 View Controller 的自定义初始化

ios - 无法更改表格 View 框架