在 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);
)或者您可以选择混合它们以其他方式结合在一起。
与绘制所有线段本身相比,每次更改图层所包含的线时绘制图层相对便宜。
从技术上讲,还有CALayer
s 用于管理CGLayerRef
s 在屏幕上的绘制(通过委托关系drawLayer:inContext:
),但所有的线条绘制都是使用CGLayerRef
完成的s 上下文,然后将CGLayerRef
作为一个整体绘制到CALayer
s 上下文(CGContextDrawLayerInRect(context, frame, backingCGLayer);
)中。
【讨论】:
以上是关于在 iOS 中使用图层和部分渲染来提高速度的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章
Mapbox iOS群集可以工作,但是圆形样式图层和数字图层不会出现/反映群集的标记密度