刚接触Quartz,我对简单形状、渐变和阴影的绘制速度感到好奇;特别是将Quartz绘图函数与iPhone上的Quartz图像绘制进行比较。
假设我需要绘制一个填充、描边和阴影的矩形。我假设导入一个预烘焙的矩形作为PNG并使用drawInRect:或drawAtPoint:绘制它比使用Quartz的绘制函数绘制相同的东西更快,因为后者需要显式计算。另一方面,绘制我假设的图像会增加内存使用和应用程序大小,因为我必须导入图像,然后分配它。这听起来对吗?
除此之外,这两种技术是否都有很大的优点/缺点?作为一个非常熟悉图形程序和全新的Quartz的人,我正在尝试确定在我的代码中使用绘图函数是否有任何优势,而不是预先烘焙整个UI并导入图像。
发布于 2009-10-22 10:17:52
我有一个类似的问题,所以我对不同的方法进行了计时。在大多数简单的绘图情况下(比如您的矩形示例),从磁盘加载图像似乎比绘制图像稍微慢一些,这可能是因为需要访问磁盘。在这些情况下,我决定使用Quartz绘图例程,因为它们为我提供了灵活性。如果我想在将来更改UI元素的大小(可能是为了支持更大或更高分辨率的显示),我需要重新渲染我的所有图像,其中矢量图形将根据需要进行缩放。
我确实看到了一个显著的性能优势,那就是我画的一个大的径向渐变作为背景。在Shark中,我可以看到CGContextDrawRadialGradient()调用占用了大量的CPU时间。当我用静态图像替换Quartz绘制的径向渐变时,我看到应用程序启动时间显著缩短(此背景是在应用程序启动期间放置的)。奇怪的是,我还看到应用程序内存使用减少了大约0.5MB,我无法完全解释这一点。
如果您想自己测试一下,我强烈建议您使用图像编辑器Opacity,它可以为绘图生成Quartz代码(包括完整的UIView或PNG子类),并输出同一绘图的CALayer。这使得在应用程序中实现这两个路径并对它们进行测试变得很容易。
发布于 2009-10-22 12:06:06
根据您的应用程序结构,还有一种可能可行的中间方法:实现绘制代码,但绘制到一个层中,然后重用它。这样做的优点是不会多次占用CPU时间,但仍然可以保持绘图过程的动态性。
所以,比方说,当平板电脑最终发货时(现在随时!!),你可以稍微修改一下你的绘图参数,以涵盖所有可能的设备,而不是生成一堆不同的静态图像。
https://stackoverflow.com/questions/1604341
复制相似问题