Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance CALayer性能问题:设置锚定在两个UIView之间的线的动画_Performance_Ipad_Ios_Core Animation_Calayer - Fatal编程技术网

Performance CALayer性能问题:设置锚定在两个UIView之间的线的动画

Performance CALayer性能问题:设置锚定在两个UIView之间的线的动画,performance,ipad,ios,core-animation,calayer,Performance,Ipad,Ios,Core Animation,Calayer,我有一个iPad应用程序,其中包含一个较大的父UIView(我称之为主视图)中的可拖动UIView。该应用程序的一个功能是能够在两个视图之间拖动以连接它们。拖动时,我在CALayer中渲染一条线,该线以开始拖动的视图为根,以用户的手指为结束。如果用户在另一个视图的顶部结束拖动,它们将被附着 附着视图时,会在视图之间永久绘制一条线 因此,在当前的实现中,有两个Calayer是主视图的子层。一个是linkLayer,它渲染视图之间的现有链接。另一个是linkLineLayer,它通过拖动操作渲染用户

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

附着视图时,会在视图之间永久绘制一条线

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

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

在实际设备上的性能很糟糕,所以我猜这不是解决问题的办法。在视图(或视图中的点)之间绘制线有哪些替代方案,以便在拖动视图或视图之间的线时可以频繁更新它们,而不会破坏帧速率和影响设备cpu

更新 所以昨晚我进去做了两个修复,这两个修复产生了巨大的不同: 1.)所有链接线都是它们自己的层。当视图被拖动时,我只刷新与该特定视图关联的链接线。

2.)将“拖动线”更新为一个层,其大小限制为正在渲染的线的大小。当用户的手指移动时,我会调整层边界

您是否尝试过将线条渲染为
CAShapeLayer
s?您可以设置
CAShapeLayer
path
属性,让它来完成其余的工作,而不是一直在调用
setNeedsDisplay
来自己画线

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


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

您是否尝试将线条渲染为
CAShapeLayer
s?您可以设置
CAShapeLayer
path
属性,让它来完成其余的工作,而不是一直在调用
setNeedsDisplay
来自己画线

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

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