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

标签 ios graphics uiview calayer video-card

在 iOS 上,我能够创建 3 个 CGImage 对象,并使用 60fps 的 CADisplayLink 来完成

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

ViewController 中,每次都会将一个图像设置到 View 的 CALayer contents 中,这是一个位图。

这一切本身就可以改变屏幕显示的内容。屏幕将以 60fps 的速度循环播放这 3 张图像。没有UIView的drawRect,没有CALayer的display,没有drawInContext,也没有CALayer的delegate的drawLayerInContext。它所做的只是更改 CALayer 的内容

我还尝试向 self.view.layer 添加一个较小尺寸的子层,并改为设置该子层的 contents。该子层将循环显示这 3 个图像。

所以这与过去甚至在 Apple ][ 甚至在 King's Quest III 时代非常相似,那是 DOS 视频游戏,那里有 1 个位图,屏幕只是不断地显示位图是什么。

除了这一次,它不是 1 个位图,而是一棵树或位图的链接列表,显卡不断使用 Painter's Model 将这些位图(具有位置和不透明度)绘制到主屏幕上。所以看起来drawRect,CALayer,一切,都是为了达到这个最终目的而设计的。

是这样的吗?显卡是采用有序的位图列表还是位图树? (然后不断地展示它们。为了简化,我们不考虑CA框架中的隐式动画)在显卡处理层到底发生了什么? (实际上,这种方法在 iOS、Mac OS X 和 PC 上几乎相同吗?)

(这个问题旨在了解我们的图形编程实际上是如何在现代显卡中呈现的,因为例如,如果我们需要了解 UIView 和 CALayer 的工作原理,甚至直接使用 CALayer 的位图,我们确实需要了解图形架构。)

最佳答案

现代显示库(例如 iOS 和 Mac OS 中使用的 Quartz)使用硬件加速合成。工作原理与 OpenGL 等计算机图形库的工作方式非常相似。本质上,每个 CALayer 都作为一个单独的表面保存,由视频硬件缓冲和渲染,就像 3D 游戏中的纹理一样。这在 iOS 中实现得非常好,这就是为什么 iPhone 以拥有流畅的用户界面而闻名。

在“旧时代”(即 Windows 9x、Mac OS Classic 等),屏幕本质上是一个大的帧缓冲区,并且显示的所有内容,例如移动窗口必须由每个应用程序手动重新绘制。重绘主要由 CPU 完成,这给动画性能设置了上限。由于涉及重绘,动画通常非常“闪烁”。这种技术主要适用于没有太多动画的桌面应用程序。值得注意的是,Android 使用(或至少曾经使用)这种技术,这在将 iOS 应用程序移植到 Android 时是一个大问题。

过去的游戏(例如 DOS、街机等,在 Mac OS classic 上也经常使用),一种叫做 sprite animation 的东西用于通过将移动图像保存在由硬件渲染并与显示器的 vblank 同步的屏幕外缓冲区中来提高性能和减少闪烁,这意味着即使在非常低端的系统上动画也很流畅。然而,这些图像的尺寸非常有限,屏幕分辨率也很低,即使是今天的 iPhone 屏幕,也只有大约 10-15% 的像素。

关于ios - 在 iOS 上,CALayer 位图(CGImage 对象)如何显示到显卡上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10806329/

相关文章:

ios - 无法访问我的 viewController 类中常量文件中的 typedef 枚举声明函数

ios - 如何在 UIButton 中居中放置图像而不在 Swift 中双向拉伸(stretch)?

Java - 计算和放置几何形状的角度

math - 三次贝塞尔曲线和二次贝塞尔曲线及其用例有什么区别?

ios - 未找到应用内购买产品

ios - 高斯方程的缩放

c++ - Qt 小部件中的选择区域

ios - UIPinchGestureRecognizer 调整自定义 UIView 的大小

ios - 返回主线程时异步 UIView 内容不显示

objective-c - 在 UIView 中查找特定点