图像与核心图形

Iñi*_*tia 22 iphone core-graphics

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

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

Jan*_*ano 34

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

GPU与CPU渲染

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

CPU,用户代码:

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

GPU,渲染服务器:

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

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

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

GPU,快:

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

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

位图与绘图

图像文件通常更快.

  • 可以使用激进的缓存提前将图像文件下载到磁盘.
  • 可以在后台从磁盘读取和解压缩图像.
  • 图像可以在内存中,如果你使用的缓存imageNamed:代替initWithData:.

屏幕外绘图需要更多工作,但可以让您获得更多.

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

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


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

一些有趣的阅读: