Quartz的新手,我对简单形状,渐变和阴影的绘制速度感到好奇;特别是比较了Quartz绘图功能和iPhone上的Quartz图像绘制。
假设我需要绘制一个填充,描边和阴影的矩形。我假设将预先烘焙的rect作为PNG导入并使用drawInRect:或drawAtPoint:绘制它比使用Quartz的绘图函数绘制相同的东西更快,因为后者需要显式计算。另一方面,绘制图像我假设增加了内存使用和应用程序大小,因为我必须导入图像然后分配它。听起来不错吗?
除此之外,这两种技术都有什么大的优点/缺点吗?作为一个非常熟悉图形程序和Quartz全新的人,我试图决定在我的代码中使用绘图函数是否有任何优势,而不是预先烘焙整个UI并导入图像。
答案 0 :(得分:9)
我有一个类似的问题,所以我超时了不同的方法。在大多数简单的绘图案例中(如您的矩形示例),从磁盘加载图像似乎比绘制图像稍慢,可能是由于需要磁盘访问。在那些情况下,我已经决定使用Quartz绘图程序,只是因为它们给我的灵活性。如果我想在未来更改UI元素的大小(可能支持更高或更高分辨率的显示),我需要重新渲染我的所有图像,矢量绘图将根据需要进行缩放。
我确实看到一个重要的表现胜利的一个领域是我绘制的大径向渐变作为背景。在Shark中,我可以看到CGContextDrawRadialGradient()调用占用了大量的CPU时间。当我用静态图像替换Quartz绘制的径向渐变时,我看到应用程序启动时间显着减少(此背景在应用程序启动期间放置)。奇怪的是,我也看到应用程序内存使用量减少了约0.5 MB,我无法完全解释。
如果您想自己测试一下,我强烈建议您选择图像编辑器Opacity,它可以为绘图生成Quartz代码(包括完整的UIView或CALayer子类),并输出PNG同样的图纸。这使得在应用程序中实现这两个路径并测试它们变得微不足道。
答案 1 :(得分:0)
根据您的应用程序结构,还有一个中间层可能有效:实现绘图代码,但绘制到图层,然后重复使用它。这样做的好处是不会多次占用CPU时间,但仍然保持绘图过程的动态。
所以,比如说,当平板电脑终于发货时(现在任何一天!!),您可以稍微修改您的绘图参数以覆盖所有可能的设备,而不是生成一堆不同的静态图像。