iOS:为什么覆盖drawRect采用软件渲染?

时间:2014-06-10 19:51:26

标签: ios opengl-es core-graphics core-animation gpu-programming

我不是iOS图形API及其文档的忠实粉丝,并且已经尝试了一段时间来形成高级视图和渲染过程的结构,但只有点点滴滴的信息。基本上,我试图理解(再次,在高级别);

1)Coregraphics和CoreAnimation API在渲染管道中从CGContext到前帧缓冲区的角色。

2)沿途(这是文档中最令人困惑和最不精确的),哪些任务由CPU和GPU执行。

随着Swift和Metal的推出,我希望重新审视API。

2 个答案:

答案 0 :(得分:4)

您是否开始使用WWDC videos?它们广泛涵盖了许多细节。例如,今年的Advanced Graphics& iOS应用的动画是一个很好的起点。核心形象谈判通常也很有用(我今年还没看过)。我强烈建议回到往年。他们前几年对CPU / GPU管道进行了很好的讨论。 WWDC 2012核心图像技术非常有用。当然,学习有效使用仪器与理解实现同样重要。

Apple通常不会在主文档中提供低级实现细节。实现细节不是接口承诺,Apple会不时更​​改它们以提高大多数应用程序的性能。这有时会降低角落情况下的性能,这是你应该避免使用性能技巧的一个原因。

但WWDC视频完全符合您的描述,并将引导您完成渲染管道以及如何优化它。他们提出的建议从发布到发布以及设备到设备都非常稳定。

答案 1 :(得分:3)

  

1)Coregraphics和CoreAnimation API在渲染管道中从CGContext到前帧缓冲区的角色。

Core Graphics是一个绘图库,它实现与PDF或PostScript相同的基元。因此,您可以为其提供位图和各种类型的路径,并生成像素。

核心动画是一个合成器。它通过合成来自视频内存的缓冲区(称为图层)来生成屏幕显示。虽然合成它可以应用变换,移动,旋转,添加透视或对每个层执行其他操作。它还有一个定时动画子系统,可以对该变换的任何部分进行定时调整,无需进一步的编程干预。

UIKit连接起来,以便您在内容本身发生变化时使用CoreGraphics将视图内容绘制到图层。这主要涉及CPU。对于动画和过渡等内容,您通常会最终应用或安排合成调整。所以这主要涉及GPU。

  

2)沿途(这是文档中最令人困惑和最不精确的),哪些任务由CPU和GPU执行。

单个图层绘图:CPU

转换和合成图层以构建显示:GPU

  

iOS:为什么覆盖drawRect采用软件渲染?

它不会“诉诸”任何东西。无论您编写相关的drawRect:还是Apple,都会应用完全相同的管道。

  

随着Swift和Metal的出局,我希望重新审视API。

Swift和Metal与此问题完全正交。 API非常好,非常受尊重。你的问题是 - 你自由地认识到 - 缺乏理解。没有必要重新审视它们,Apple也没有表明它会这样做。