nop*_*ole 4 graphics video-card calayer uiview ios
在iOS上,我能够创建3个CGImage对象,并使用CADisplayLink60fps来完成
self.view.layer.contents = (__bridge id) imageArray[counter++ % 3];
Run Code Online (Sandbox Code Playgroud)
在ViewController每个时间内,图像被设置为视图的CALayer contents,这是一个位图.
而这一切本身都可以改变屏幕显示的内容.屏幕将以60fps循环显示这3张图像.没有的UIView的drawRect,没有任何的CALayer的display,drawInContext或CALayer的的委托的drawLayerInContext.它只是改变CALayer的contents.
我还尝试添加一个较小尺寸的子图层self.view.layer,并设置该子图层contents.该子图层将循环显示这3个图像.
所以这与过去甚至在Apple上的情况非常类似[甚至在King's Quest III时代,这是DOS视频游戏,其中有1个位图,屏幕只是不断显示位图是什么.
除此之外,它不是1位图,而是树或位图的链表,并且图形卡不断使用Painter的模型将这些位图(具有位置和不透明度)绘制到主屏幕上.所以看起来drawRect,CALayer,所有东西,都是为了实现这个最终目的而设计的.
它是如何工作的?显卡是否采用有序的位图列表或位图树?(然后不断地展示它们.为简化起见,我们不考虑CA框架中的隐式动画)图形卡处理层实际发生了什么?(实际上,这种方法在iOS,Mac OS X和PC上几乎相同吗?)
(这个问题的目的是了解我们的图形编程如何在现代图形卡中实现渲染,例如,如果我们需要了解UIView以及CALayer如何工作,甚至直接使用CALayer的位图,我们确实需要了解图形架构.)
现代显示库(例如iOS和Mac OS中使用的Quartz)使用硬件加速合成.工作方式与OpenGL等计算机图形库的工作方式非常相似.从本质上讲,每个CALayer都作为一个单独的表面保存,由视频硬件缓冲和渲染,就像3D游戏中的纹理一样.这在iOS中实现得非常好,这也是iPhone以其流畅的UI而闻名的原因.
在"旧时代"(即Windows 9x,Mac OS Classic等)中,屏幕基本上是一个大的帧缓冲区,并且每个应用程序必须手动重绘由移动窗口而暴露的所有内容.重绘主要由CPU完成,它为动画性能设置了上限.由于涉及重绘,动画通常非常"闪烁".这种技术主要适用于没有太多动画的桌面应用程序.值得注意的是,Android使用(或至少习惯使用)这种技术,这在将iOS应用程序移植到Android时是一个大问题.
过去几天的游戏(例如DOS,街机等,在Mac OS经典中也经常使用),一种叫做精灵动画的东西被用来提高性能并减少闪烁,方法是将动态图像保留在由硬件并与显示器的vblank同步,这意味着即使在非常低端的系统上动画也很流畅.然而,这些图像的尺寸非常有限,屏幕分辨率很低,仅为今天iPhone屏幕的10-15%像素.
| 归档时间: |
|
| 查看次数: |
1475 次 |
| 最近记录: |