在iOS上,CALayer位图(CGImage对象)如何显示在graphics卡上?

在iOS上,我能够创build3个CGImage对象,并以60fps的CADisplayLink使用CADisplayLink

 self.view.layer.contents = (__bridge id) imageArray[counter++ % 3]; 

ViewController ,每一次,一个图像被设置为视图的CALayer contents ,这是一个位图。

而这一切都可以改变屏幕显示。 屏幕将以60fps循环播放这3张图片。 没有UIView的drawRect ,没有CALayer的displaydrawInContext或者CALayer的委托drawLayerInContext 。 它所做的只是更改CALayer的contents

我也尝试添加一个较小的子层self.view.layer ,并设置该子层的contents 。 这个子图层将循环通过这3个图像。

所以这与以前甚至在苹果公司(甚至在King's Quest III时代,这是DOSvideo游戏,其中有一个位图,屏幕只是不断显示位图是什么)非常相似。

除了这个时候,它不是一个位图,而是一个树或一个链接的位图列表,并且显卡不断使用画家模型将这些位图(位置和不透明度)绘制到主屏幕上。 所以看来, drawRect ,CALayer,一切都是为了达到最终目的而devise的。

这是如何工作的? 显卡是否采用位图或位图树的有序列表? (然后不断地显示它们,为了简化,我们不考虑CA框架中的隐式animation)在graphics卡处理层中究竟发生了什么? (实际上,这种方法在iOS,Mac OS X和PC上几乎相同?)

(这个问题旨在了解我们的graphics编程实际上是如何在现代graphics卡中呈现的,例如,如果我们需要了解UIView和CALayer的工作方式,或者直接使用CALayer的位图,我们需要了解graphics架构。

现代显示库(如iOS和Mac OS中使用的Quartz)使用硬件加速合成。 这些工作与OpenGL等计算机graphics库工作非常相似。 实质上,每个CALayer都被保存在一个独立的表面中,这个表面被video硬件caching和渲染,就像3D游戏中的纹理一样。 这在iOS中非常好地实现,这就是为什么iPhone以stream畅的用户界面而着称的原因。

在“过去的日子”(例如Windows 9x,Mac OS Classic等)中,屏幕基本上是一个大的帧缓冲区,并且每个应用程序都必须手动重绘由窗口移动的所有内容。 重绘主要是由CPU完成的,这对animation性能提出了上限。 由于涉及重新绘制,animation通常非常“闪烁”。 这种技术主要适用于没有太多animation的桌面应用程序。 值得注意的是,Android使用(或至less曾经使用过)这种技术,这是将iOS应用程序移植到Android时遇到的一个大问题。

旧时代的游戏(如DOS,街机等,在Mac OS上也经常使用),一些名为spriteanimation的游戏被用来提高性能,并通过保持移动的图像在屏幕缓冲区硬件,并与显示器的vblank同步,这意味着即使在非常低端的系统上,animation也是stream畅的。 然而,这些图像的大小是非常有限的,屏幕分辨率低,只有今天的iPhone屏幕的像素的10-15%左右。

这里有一个合理的直觉,但contents和显示之间仍然有几个步骤。 首先, contents不一定是CGImage 。 它通常是一个名为CABackingStorage的私人类,这不是一回事。 在许多情况下,硬件优化将绕过将图像渲染到主内存中,然后将其复制到video内存中。 而且由于各层的contents都是合成在一起的,所以你仍然是从“真实”显示存储器的方式。 更不用说对contents修改只是直接影响模型层,而不是performance层​​或渲染层。 另外还有CGLayer对象可以直接将图像存储在video内存中。 有很多不同的东西在进行。

所以答案是,不,video“卡”(芯片;这是PowerVR BTW)不采取有序的一堆层。 它采取的方式较低的数据没有很好的logging。 有些东西(特别是Core Animation的一部分,也许是CGLayer)似乎是OpenGL纹理的包装,但其他的可能是Core Graphics直接访问硬件本身。 一旦达到这个级别的堆栈,它就全部是私有的,可以从版本到版本,从设备到设备。

你也可以在这里findBrad Larson的回应: iOS:是在OpenGL之上实现的核心graphics?

您也可能对iOS:PTL第6章感兴趣。 虽然没有涉及具体的实现,但是它包含了很多关于如何提高绘图性能的实际讨论,并且最好的利用了Core Graphics的硬件。 第7章详细介绍了CALayer绘图中涉及的所有开发人员可访问的步骤。