提高自定义UIView的绘图性能

时间:2010-08-09 16:01:53

标签: iphone optimization quartz-graphics

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

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

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


解决方案

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

1 个答案:

答案 0 :(得分:0)

来自 - [CALayer drawInContext:]:

的文档
  

默认实现不执行任何操作。可以剪切上下文以保护有效的层内容。希望找到要绘制的实际区域的子类可以调用CGContextGetClipBoundingBox。在更新contents属性时由display方法调用。

display的默认实现调用drawInContext:在自动创建的上下文中;大概也可以设置边界框(可能会传递给drawRect :)。

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