【问题标题】:Improving drawing performance on custom UIView提高自定义 UIView 的绘图性能
【发布时间】:2010-08-09 16:01:52
【问题描述】:

我有一个由许多图像组成的自定义 UIView,它们的位置会随着用户触摸而变化。 视图必须跟踪用户触摸,而我在绘制此类视图时遇到了性能瓶颈,阻止了我实时跟踪输入。

一开始我在[UIView drawRect:] 方法中绘制所有内容,当然它太慢了,因为即使没有必要,所有内容都被重新绘制。 然后,我使用了更多的 CALayers 来仅更新正在更改的图层,这给了我更好的响应能力。 但是,当我必须在一个图层上多次绘制相同的图像时,最多需要 500 毫秒。

由于图像放置在固定位置,是否可以预先绘制它们?我是否应该考虑将它们放在许多 CALayers 中并隐藏/显示它们? 另外,我不明白为什么存在[CALayer setNeedsDisplayInRect:],但代表(显然)无法知道无效的矩形是什么来优化绘图。


解决方案

按照答案中的建议,我终于为图像创建了许多 CALayers,并在第一次显示图层时设置了 contents 属性。这是一个延迟加载的折衷方案:在第一次尝试中,我在创建时设置了每一层的内容,但这会导致在程序启动时预先绘制任何可能的图像,从而将应用程序冻结几秒钟。

【问题讨论】:

    标签: iphone optimization quartz-graphics


    【解决方案1】:

    来自 -[CALayer drawInContext:] 的文档:

    默认实现什么都不做。上下文可能会被剪裁以保护有效的图层内容。希望找到要绘制的实际区域的子类可以调用 CGContextGetClipBoundingBox。更新内容属性时由 display 方法调用。

    显示调用drawInContext的默认实现:在自动创建的上下文上;大概也设置了边界框(大概是传递给drawRect:)。

    如果您要绘制多张静态图像,我只需将每张都粘贴在自己的 UIView 中;我不认为开销很大(如果是,CALayer 开销应该更小)。如果它们都有动画,我肯定会使用 UIView/CALayer。如果其中一些没有动画(很多)并且您注意到明显的缓慢,您可以预渲染它们。这是在 drawRect:(或类似的)渲染和 GPU 上的图层合成之间的权衡,但总的来说,我认为后者要快得多。

    【讨论】:

      猜你喜欢
      • 2013-01-29
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多