在iOS上,缓存绘制的屏幕图像并显示它的最快方法是什么?

前端之家收集整理的这篇文章主要介绍了在iOS上,缓存绘制的屏幕图像并显示它的最快方法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我没有让drawRect每次重绘数千个点,我认为有几种方法可以“在屏幕上缓存图像”和任何其他绘图,我们将添加到该图像,并在drawRect时显示该图像:

>使用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获得内存警告?

解决方法

根据您提出的最后几个问题,看起来您完全混淆了CGLayers和CALayers.它们是不同的概念,并不是真正相互关联的. CGLayer是一个核心图形构造,它有助于在Core Graphics上下文的画布内重复呈现内容,并且被限制在单个视图,位图或PDF上下文中.我很少需要使用CGLayer.

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进行渲染来获得更好的服务.这将需要更多的代码来设置,但它可能是获得你所询问的“数千个点”的可接受性能的唯一方法.

原文链接:https://www.f2er.com/iOS/332107.html

猜你在找的iOS相关文章