对于自定义 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
中绘制这些标签比在其中包含多个 UILabel
s 的单元格中更快。 HTH。【参考方案2】:
@darcwader 非常适合。我认为所有示例都使用 drawRect 的原因是因为最初(设置单元格)更昂贵,但之后为它们设置动画要便宜得多。然而,对于大图像,绘制它们的成本要高得多,而且如果您滚动浏览多个图像,则无法实现使用 drawRect 的好处。
【讨论】:
以上是关于对于自定义 UITableViewCell 中的大图像,为啥 drawRect 滚动比 UIImageView 慢的主要内容,如果未能解决你的问题,请参考以下文章
自定义 UITableViewCell 中的 UIPickerView
自定义 UITableViewCell 中的 UIImageview 未正确显示
自定义 uitableviewcell 中的 Uibuttons
自定义 uitableviewcell 中的 uiscrollview