2

我正在尝试提高我们应用程序中滚动的性能。我遵循了所有普遍接受的建议(用 CG 自己绘制,单元格不透明,没有子视图等),但是当我们有后台 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 的按钮图像)它会结结巴巴。我在一个类方法中同时获取 UIImages,所以它被缓存了。

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

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

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

4

2 回答 2

4

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

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

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

于 2010-01-10T16:13:02.237 回答
0

在您深入优化之前,您是否使用单元重用机制 ( [tableView dequeueReusableCellWithIdentifier:]) 在您的委托中创建UITableViewCells tableView:cellForRowAtIndexPath:

另外,您是否使用 Instruments 的活动监视器在模拟器中运行代码?将间隔设置为 1 毫秒(我发现默认值 - 10 毫秒 - 对这个来说太大了),看看你在滚动时大部分时间都花在了哪里。

于 2010-01-10T13:08:44.433 回答