对于自定义 UITableViewCell 中的大图像,为啥 drawRect 滚动比 UIImageView 慢

Posted

技术标签:

【中文标题】对于自定义 UITableViewCell 中的大图像,为啥 drawRect 滚动比 UIImageView 慢【英文标题】:Why does drawRect scroll slower than UIImageView for large images in custom UITableViewCell对于自定义 UITableViewCell 中的大图像,为什么 drawRect 滚动比 UIImageView 慢 【发布时间】:2011-04-13 21:38:47 【问题描述】:

我有一个自定义 UITableViewCell 完全根据此处找到的自定义 UITableViewCell 教程建模 - http://developer.apple.com/library/ios/#samplecode/AdvancedTableViewCells/Introduction/Intro.html#//apple_ref/doc/uid/DTS40009111

这里—— http://developer.apple.com/library/ios/#samplecode/TableViewSuite/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007318

所有内容均使用 drawRect 渲染,绘制 3 个字符串和 1 个图像时滚动速度为 55 FPS。图像是通过 -

绘制的
[self.sampleImage drawInRect:CGRectMake(0, 0, 55, 55)];

奇怪的是,当我渲染相同的图像但在更大的区域中时,滚动速度会降低到 25 FPS

[self.sampleImage drawInRect:CGRectMake(0, 0, 320, 80)];

我在 Apple 的示例代码中的 drawRect 中尝试了更大的图像,果然帧速率下降到 25 FPS。

问题是,当我绘制字符串并通过 UIImageVew 显示图像时,FPS 会回到 55。

如何在 UITableViewCell 中使用 drawRect 绘制大图像,同时保持 50 FPS 的滚动速度?

UIImageView 能否比在 drawRect 中绘制图像更快(对于 UITableViewCell)?

是否存在 GPU 与 CPU 之间的关系?

【问题讨论】:

【参考方案1】:

drawRect 将使用核心图形将图像绘制到它使用 CPU 的屏幕上。如果你使用 UIImageView 它将使用 GPU,因此它更快。

解决办法是不使用drawRect。

如果您绝对需要使用 drawRect,那么您可能需要在滚动到某个缓存位置/缓存绘图并将该图像用于 UIImageView 之前绘制它。

【讨论】:

很有趣,但是为什么包括苹果自己的示例在内的每个开发人员文档都推荐 drawRect ?仅适用于较小的图像吗? 我想这取决于你在画什么。例如,如果您有一个包含多个文本标签的复杂单元格,那么(在较旧的硬件上?)在单个 -drawRect 中绘制这些标签比在其中包含多个 UILabels 的单元格中更快。 HTH。【参考方案2】:

@darcwader 非常适合。我认为所有示例都使用 drawRect 的原因是因为最初(设置单元格)更昂贵,但之后为它们设置动画要便宜得多。然而,对于大图像,绘制它们的成本要高得多,而且如果您滚动浏览多个图像,则无法实现使用 drawRect 的好处。

【讨论】:

以上是关于对于自定义 UITableViewCell 中的大图像,为啥 drawRect 滚动比 UIImageView 慢的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UITableViewCell 中的 UIPickerView

自定义 UITableViewCell 中的 UIImageview 未正确显示

自定义 uitableviewcell 中的 Uibuttons

自定义 uitableviewcell 中的 uiscrollview

iOS 8和layoutMargin中的自定义UITableViewCells

UITableVIewCell 重叠图像中的自定义按钮