>使用BitmapContext并绘制到位图,并在drawRect中绘制此位图.
>使用CGLayer并在drawRect中绘制CGLayer,这可能比方法1快,因为此图像缓存在图形卡中(并且它不会计入iOS上“内存警告”的RAM使用情况?)
>绘制到CGImage,并使用视图的图层:view.layer.contents =(id)cgimage;
所以似乎有三种方法,我认为方法(3)中的CALayer只能使用CGImage来实现它. CALayer本身无法缓存屏幕图像,而不像(2)中的CGLayer.
方法(2)是三者中最快的,还有其他方法可以做到这一点吗?我实际上计划动画一些屏幕图像,(循环5或6个),并尝试使用CAdisplayLink尝试60fps的最高帧速率.方法(1),(2)或(3)中的任何一个是否会使用显卡中的内存,因此不使用RAM,因此也不太可能从iOS获得内存警告?
解决方法
CALayer是一个核心动画层,iOS中的每个UIView都有一个支持(Mac上的层支持NSView).您一直在iOS上处理这些问题,因为它们是UI架构的基础部分.每个UIView实际上都是围绕CALayer的轻量级包装器,而每个CALayer实际上都是GPU上纹理四边形的包装器.
在屏幕上显示UIView时,第一次需要渲染内容(或者触发完整的重绘时)Core Graphics用于获取线条,圆弧和其他矢量绘图(有时也包括栅格位图)和栅格化他们到位图.然后通过CALayer上传此位图并将其缓存在GPU上.
对于界面的变化,例如移动,旋转,缩放等视图,这些视图或层不需要再次重绘,这是一个昂贵的过程.相反,它们只是在GPU上进行转换并在新位置进行合成.这使得在整个iOS界面中可以看到流畅的动画和滚动.
因此,如果您希望获得最佳性能,则需要避免使用Core Graphics重绘任何内容.在CALayers或UIViews中缓存场景的哪些部分.想想老式动画如何使用cels来包含他们将要移动的部分场景,而不是让动画师重绘场景中的每一个变化.
在现代iOS设备上,您可以轻松地让数百个CALayers在屏幕上动画显示.但是,如果你想为像粒子系统这样的东西做几千个点,你可以通过转移到OpenGL ES并使用GL_POINTS进行渲染来获得更好的服务.这将需要更多的代码来设置,但它可能是获得你所询问的“数千个点”的可接受性能的唯一方法.