【问题标题】:CALayer performance problem: animating a line anchored between two UIViewsCALayer 性能问题:动画锚定在两个 UIViews 之间的线
【发布时间】:2010-12-29 17:10:29
【问题描述】:

我有一个 iPad 应用程序,它的可拖动 UIViews 包含在一个较大的父 UIView 中(我将其称为主视图)。该应用程序的功能之一是能够在两个视图之间拖动以连接它们。拖动时,我在 CALayer 中渲染一条线,该线植根于您开始拖动的视图并在用户手指上结束。如果用户在另一个视图上结束拖动,它们就会被附加。

当附加视图时,它们之间会永久画一条线。

所以在当前的实现中有两个 CALayer,它们是主视图的子层。一种是linkLayer,它渲染视图之间的现有链接。另一个是 linkLineLayer,它通过拖动操作呈现用户当前正在绘制的线条。

当发生拖动并出现新的拖动事件时,我调用 [linkLineLayer setNeedsDisplay]。 同样,当用户拖动视图时,我调用 [linkLayer setNeedsDisplay]。

实际设备上的性能很糟糕,所以我猜这不是要走的路。有什么替代方法可以在视图(或视图中的点)之间画线,这样我可以在拖动视图或在视图之间拖动线时经常更新它们,而不会破坏帧速率和锤击设备 cpu?

更新 所以昨晚我进去做了两个修复,产生了巨大的变化: 1.)所有链接线都是它们自己的层。当一个视图被拖动时,我只刷新与该特定视图关联的链接线。
2.) 将“拖动线”更新为一个层,其大小限制为正在渲染的线的大小。我在用户手指移动时调整图层边界。

【问题讨论】:

    标签: performance ipad ios core-animation calayer


    【解决方案1】:

    您是否尝试将线条渲染为CAShapeLayers?您可以设置CAShapeLayerpath 属性,而不是自己画线并一直调用setNeedsDisplay,然后让它完成剩下的工作。

    Core Animation 处理CAShapeLayers 的方式不同,它可以优化路径的绘制。如果您只是自己在drawLayer:inContext:(或等效的)中绘制路径,Core Animation 必须将整个图层视为图像,因为它不知道您绘制了什么。如果你使用CAShapeLayer,Core Animation 会提前知道你要绘制的路径,并且可以相应地优化它的渲染。您也不必担心形状层的大小和位置,因为该层只是路径。

    另外,一个额外的指针,如果你想绘制一个没有填充的开放路径(线),你必须将形状层的fillColor属性设置为nil。如果不这样做,它会自动关闭路径并使用默认颜色填充。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多