在 iOS 中使用图层和部分渲染来提高速度的最佳方法是啥

Posted

技术标签:

【中文标题】在 iOS 中使用图层和部分渲染来提高速度的最佳方法是啥【英文标题】:What is the best way to use layers and partial rendering in iOS for speed在 iOS 中使用图层和部分渲染来提高速度的最佳方法是什么 【发布时间】:2013-06-17 03:11:53 【问题描述】:

我正在开发一个使用 Core Graphics 编写的图形应用程序。我有一个积累数据的缓冲区,并将其呈现在屏幕上。它超级慢,如果可能的话,我想避免使用 openGL。根据分析器的说法,绘制我的图形数据是让我很头疼的事情(它由许多转换为路径的点组成,然后是调用 AddPath、DrawPath)..

这就是我想做的,我的问题是如何使用层/视图/等最好地实现它。

我有一个网格和一些文本。我希望它在 CALayer(或其他一些层/视图?)中呈现,并且仅在需要时更新(图形被重新缩放)。

只有一部分数据需要刷新。我想取上一个屏幕缓冲区,擦除一个矩形的数据(或用一个白框覆盖它),然后只绘制已更改的图形部分。

然后我想将背景层与前景图合并以生成合成图像。这要求图形图层具有透明背景,以免遮挡网格。

我研究过使用 CAlayer 作为子层,但它似乎没有提供一种简单的方法来绘制一条线。 CAShapeLayer 看起来好一点,但看起来只能画一条线。我希望网格由多条线组成。

允许我这样做的最佳方法和对象组合是什么?

谢谢, 雷扎

【问题讨论】:

你怎么知道图形的哪个部分在重新缩放期间会发生变化(基本上是把所有东西都扔掉,只重画一个部分)?您是否不断添加更多点来扩展图形(并且当前每次都重绘整个图形)? 为了重新缩放,我将重绘所有内容。当新数据进来时,它是从左到右绘制的,当它到达右边缘时,我从左边重新开始。所以我只需要更新显示新数据的屏幕的一小部分。 【参考方案1】:

我有一个CGLayerRef 用于绘制路径。对于每个新点,我只绘制新段。当图形达到全宽时,我会创建一个新的 CGLayerRef 并开始在其中绘制新的线段。

上一层被新层覆盖时会发生什么取决于图形的显示方式,但您可以清除现在位于新层下方的部分(使用CGContextSetBlendMode(context, kCGBlendModeClear);)或者您可以选择混合它们以其他方式结合在一起。

与绘制所有线段本身相比,每次更改图层所包含的线时绘制图层相对便宜。

从技术上讲,还有CALayers 用于管理CGLayerRefs 在屏幕上的绘制(通过委托关系drawLayer:inContext:),但所有的线条绘制都是使用CGLayerRef 完成的s 上下文,然后将CGLayerRef 作为一个整体绘制到CALayers 上下文(CGContextDrawLayerInRect(context, frame, backingCGLayer);)中。

【讨论】:

以上是关于在 iOS 中使用图层和部分渲染来提高速度的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

屏蔽层和添加子层iOS之间的区别

Mapbox iOS群集可以工作,但是圆形样式图层和数字图层不会出现/反映群集的标记密度

使用图层和 Grand Central Dispatch 呈现 UIButton 的最快方法?

如何从地图中删除所有图层和要素?

OpenGL - 会使用多个 VBO 减慢渲染速度吗?

Golang网页渲染保存成图片