我也明白事先优化并不是很有意义,在进行任何性能分析之前就采用更困难的方法。请考虑我对这两种方法都很熟悉,现在真正想要深入了解。
我的许多困惑来自于学习如何使表格视图的滚动性能非常流畅和快速。当然,这种方法的原始来源是Twitter背后的作者为iPhone(曾用名Tweetie)开发的。基本上,它说要使表格滚动变得非常流畅,秘诀是不要使用子视图,而是在一个自定义的UIview中进行所有绘图。实质上,似乎使用大量的子视图会减慢渲染速度,因为它们具有很多开销,并且不断重新合成其父视图。
公正地说,这是在3GS相当新的时候编写的,而且自那时以来iDevices已经变得更快了。尽管如此,这种方法仍然被定期推荐用于高性能表格,在互联网上和其他地方。实际上,它是苹果表格示例代码中的一个建议方法(Apple's Table Sample Code),在几个WWDC视频(Practical Drawing for iOS Developers)和许多iOS编程书籍中也被建议。
有一些非常棒的工具可以用来设计图形并生成相应的Core Graphics代码。
所以一开始我认为 "Core Graphics之所以存在是因为它很快!"
但是当我认为自己已经理解了 "尽可能使用Core Graphics" 这个想法时,我开始意识到drawRect通常会导致应用程序响应不佳,内存开销极大,并且会对CPU造成很大负担。基本上,我应该 "避免覆盖drawRect"(WWDC 2012 iOS App Performance: Graphics and Animations)
所以,我想,像所有事情一样,这也很复杂。也许你可以帮助我和其他人理解何时何地使用drawRect呢?
我看到了几种明显的使用Core Graphics的情况:
- 当你有动态数据时(例如苹果的股票图表示例)
- 当你有一个灵活的UI元素,不能用简单的可调整大小的图像来执行
- 当你创建一个动态图形,一旦呈现出来就可以在多个地方使用
我认为应该避免使用核心图形(Core Graphics)的情况:
- 您的视图属性需要单独进行动画处理
- 您的视图层次结构相对较小,因此使用CG的任何感知额外努力都不值得收益
- 您想要更新视图的某些部分而不重新绘制整个视图
- 当父视图大小更改时,子视图的布局需要更新
那么,在什么情况下您会选择drawRect / Core Graphics(也可以通过子视图完成)?是什么因素导致您做出这个决定?为什么在一种自定义视图中绘制可以实现流畅的表格单元格滚动,但苹果通常建议出于性能原因避免使用drawRect?对于简单的背景图像(何时使用CG创建它们而不是使用可调整大小的png图像)?
深入理解这个主题可能不需要制作有价值的应用程序,但我不喜欢在不能解释原因的情况下选择技术。我的大脑会对我发怒。
问题更新
感谢大家提供的信息。这里有一些澄清问题:- 如果您使用核心图形绘制某些内容,但可以通过UIImageViews和预渲染的png实现相同的效果,您是否应该始终选择后者?
- 类似的问题:特别是使用如此强大的工具时,何时应考虑使用核心图形来绘制界面元素?(可能是当您的元素的显示是可变的时候,例如具有20种不同颜色变化的按钮。还有其他情况吗?)
- 根据我在下面回答的理解,通过在复杂的UIView渲染自身后有效地捕获单元格快照位图,并在滚动时显示该快照并隐藏复杂的视图,是否可能获得相同的性能提升?显然,某些问题必须解决。这只是我想到的一个有趣的想法。