在iOS上,怎么办CALayer的位图(CGImage对象)得到显示到显卡?(On iOS, how

2019-09-17 14:55发布

在iOS上,我能创造3个CGImage对象,并使用CADisplayLink在60fps做

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

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

而这一切本身,可以改变什么屏幕上显示。 屏幕上会刚刚通过这3张图片循环,在60fps。 没有的UIView的drawRect ,没有任何的CALayer的displaydrawInContext ,或CALayer的的委托的drawLayerInContext 。 它所做的是改变的CALayer的contents

我也尝试添加更小尺寸子层self.view.layer ,并设置子层的contents来代替。 并通过这些3倍的图像,子层将循环。

所以这是非常相似的在旧时代到后甚至是在Apple] [甚至在国王的任务III时代,这是DOS的视频游戏,其中有1位,并在屏幕只是不断地显示位图是什么。

只是这一次,它不是1位,但树或位图的链表,并且显卡不断用画家的模型漆的位图(带位置和不透明度),在主屏幕上。 如此看来, drawRect ,CALayer的,一切,都旨在实现这一最终目的。

那是它是如何工作的? 请问显卡采取位图的有序列表或位图的树? (然后不断告诉他们,为了简化,我们不考虑在CA框架中的隐式动画)什么在显卡处理层是真正发生了吗? (实际上,这是一种方法,几乎​​在iOS和Mac OS X,并在PC上一样吗?)

(这个问题的目的是了解我们的图形编程甚至可以在现代显卡渲染,因为举例来说,如果我们需要了解的UIView和CALayer的是如何工作的,甚至可以直接使用的CALayer的位图,我们也需要了解图形架构。)

Answer 1:

(在IOS和Mac OS使用诸如石英)现代展示文库使用硬件加速合成。 工作方式非常类似于计算机图形如何库,如OpenGL的工作。 在本质上,每个CALayer的被保持在作为被缓冲并通过视频硬件很像在3D游戏中的纹理绘制单独的表面。 这是非常好iOS中实现的,这就是为什么iPhone是是具有平滑的界面,因此闻名。

在“旧时代”(即Windows 9x中的Mac OS经典等),屏幕基本上是一个大的帧缓冲,这是由例如移动窗口暴露一切必须由每个应用程序手动重绘。 重绘大部分是由CPU,它把上限的动画性能来完成。 动画通常是很“flickery”由于涉及重绘。 这种技术主要是适用于桌面应用程序没有太多的动画。 值得注意的是,机器人的用途(或者至少用于使用)该技术中,在至Android移植iOS应用程序时,这是一个大问题。

昔日天游戏(如DOS,街机等,也可用于在Mac OS经典很多),一种叫精灵动画来提高性能,并通过保持被呈现在屏幕外的缓冲区中的运动图像来减少闪烁硬件和软件与显示器的VBLANK,这意味着动画光滑甚至在非常低端系统同步。 然而,这些图像的尺寸非常有限和屏幕分辨率低,今天即使是iPhone屏幕的像素只有约10-15%。



Answer 2:

你已经有了一个合理的直觉在这里,但仍有之间几个步骤contents和显示。 首先, contents并不一定是一个CGImage 。 它往往是被称为私有类CABackingStorage这是不太一样的东西。 在许多情况下,有硬件优化回事绕过渲染图像到主存储器中,然后将其复制到显存。 而且,由于contents各层的都是复合在一起,你还是从“真正的”显示内存的方式。 更何况,修改contents只是直接影响模型层,而不是呈现或渲染层。 再加上有CGLayer可以直接存储在显存中的图像对象。 有很多不同的东西怎么回事。

因此,答案是,不,视频“卡”(芯片,它是PowerVR的BTW)不带层的有序一群。 这需要在没有有案可稽的方式较低级别的数据。 有些东西(核心动画的特别部分,也许CGLayer)似乎都与OpenGL纹理包装,但其他人可能核芯显卡直接访问硬件本身。 一旦你获得这个级别的堆栈,它的所有私人和能够改变因版本和从设备到设备。

您也可以找到布拉德·拉尔森的响应这里很有用: iOS版:是基于OpenGL的基础上实现核芯显卡?

您还可能有兴趣在第6章的iOS:PTL 。 虽然它并没有进入实施细节,但它包括了很多如何提高绘图性能和最佳的利用与核芯显卡硬件的实际讨论。 第7章详细介绍所有参与开发人员访问步骤CALayer图。



文章来源: On iOS, how do CALayer bitmaps (CGImage objects) get displayed onto Graphics Card?