图像与核心图形

时间:2011-06-29 12:02:46

标签: iphone core-graphics

在iOS设备上,使用Core Graphics绘制图形比使用图像文件更好?

在资源方面这样做有什么好处?

3 个答案:

答案 0 :(得分:33)

图像与核心图形是一个直接的区别。渲染屏幕外/屏幕图形的方法更加复杂,需要使用Instruments来找出真正发生的事情。我试着在这里提供一个概述,但是这个答案可以从更有知识的人那里得到一些改进。

GPU与CPU渲染

GPU总是在屏幕上呈现图形。但是,它们可以由GPU或CPU生成,并且发生在用户代码中或称为“渲染服务器”的单独进程中。以下是概述:

CPU,用户代码:

  • 核心图形和核心文本
  • drawRect()。结果通常是缓存的。

GPU,渲染服务器:

  • shouldRasterize设置为YES的CALayer。这将创建图层和子图层的缓存。

GPU,渲染服务器,非常慢:

  • CALayer使用蒙版(setMasksToBounds)和动态阴影(setShadow*)。
  • 组不透明度(UIViewGroupOpacity)。

GPU,快:

  • 从PNG文件创建图像。可拉伸图像中的拉伸也是GPU。

请注意,缓存仅在重用缓存时才有用。如果立即丢弃它会伤害性能。例如,可以缓存和重用内容被简单拉伸的缓存动画,但是内容更改的缓存动画将具有可怕的性能。

位图与绘图

图像文件通常更快。

  • 可以使用aggressive caching预先将图像文件下载到磁盘。
  • 可以在后台从磁盘读取和解压缩图像。
  • 如果您使用imageNamed:代替initWithData:
  • ,则可以将图片缓存在内存中

离线绘图需要更多工作,但可以让您获得更多。

  • 您可以在没有质量损失的情况下为复杂图形设置动画,因为图形会在每一帧上重写。
  • 您可以随时使用i18n创建图形。
  • 如果您不需要,则应禁用隐式Core Graphics动画。示例:带圆角的UIView(您只需要舍入,而不是动画)。
  • 绘图可能足够复杂,您需要使用Instruments来查看时间的去向。
  • 除非使用蒙版,阴影,边缘抗锯齿或组不透明度,否则可能会缓存使用drawRect进行绘制。您可以请求缓存调用-[CALayer setShouldRasterize:YES]-[CALayer setRasterizationScale:]

可拉伸图像,无论是从图像文件读取还是通过绘图生成,都使用较少的内存。拉伸是对GPU的一种不昂贵的操作。


如果没有足够的性能,性能只是一个问题。除非另有说明,否则请使用速度更快的代码。最快的计划是首先进入市场的计划。

一些有趣的读物:

答案 1 :(得分:2)

根据我的经验,从性能的角度来看,使用图像总是更好,但有时你需要手动绘制图像。

答案 2 :(得分:0)

我认为图像的性能更好。但是,当我们要开发可以更改(例如颜色更改,形状更改等),缩放或可以进行动画处理的东西时,我们应该选择核心图形。

当我们想用一些数学逻辑来绘制某些东西并想玩这些东西时,核心图形就很棒了!在学校里,我们都在数学上学习圆方程,线方程等。核心图形是可视化我们的数学知识并以此构建更多疯狂事物的正确工具!

核心图形对于模拟类型的应用程序也非常有用。