画面具影响performance

这里是我用于绘制UIView的掩码的代码。 问题是,如果我有超过5 UIViews在屏幕上的面具,它会影响性能时拖放UIViews:我怎样才能改善下面的代码?

+ (UIBezierPath *)roundedPathAtCenter:(CGPoint)center size:(CGSize)size corner:(CGFloat)corner { NSInteger width = size.width; NSInteger height = size.height; UIBezierPath *path = [UIBezierPath bezierPath]; // upper left corner [path moveToPoint: CGPointMake(center.x - width / 2.0f + corner / 2.0f, center.y - height / 2.0f + corner / 2.0f)]; // path to top center [path addQuadCurveToPoint: CGPointMake(center.x, center.y - height / 2.0f) controlPoint: CGPointMake(center.x - width / 2.0f + corner, center.y - height / 2.0f)]; // path to upper right [path addQuadCurveToPoint: CGPointMake(center.x + width / 2.0f - corner / 2.0f, center.y - height / 2.0f + corner / 2.0f) controlPoint: CGPointMake(center.x + width / 2.0f - corner, center.y - height / 2.0f)]; // path to mid right [path addQuadCurveToPoint: CGPointMake(center.x + width / 2.0f, center.y) controlPoint: CGPointMake(center.x + width / 2.0f, center.y - height / 2.0 + corner)]; // path to lower right [path addQuadCurveToPoint: CGPointMake(center.x + width / 2.0 - corner / 2.0f, center.y + height / 2.0f - corner / 2.0f) controlPoint: CGPointMake(center.x + width / 2.0f, center.y + height / 2.0f - corner)]; // path to center bottom [path addQuadCurveToPoint: CGPointMake(center.x, center.y + height / 2.0f) controlPoint: CGPointMake(center.x + width / 2.0 - corner, center.y + height / 2.0)]; // path to lower left [path addQuadCurveToPoint: CGPointMake(center.x - width / 2.0f + corner / 2.0f, center.y + height / 2.0f - corner / 2.0f) controlPoint: CGPointMake(center.x - width / 2.0f + corner, center.y + height / 2.0f)]; // path to mid left [path addQuadCurveToPoint: CGPointMake(center.x - width / 2.0f, center.y) controlPoint: CGPointMake(center.x - width / 2.0f, center.y + height / 2.0 - corner)]; // path to top left [path addQuadCurveToPoint: CGPointMake(center.x - width / 2.0f + corner / 2.0f, center.y - height / 2.0f + corner / 2.0f) controlPoint: CGPointMake(center.x - width / 2.0f, center.y - height / 2.0f + corner)]; [path closePath]; return path; } 

没有为UIViews添加掩码,它的工作速度非常快

在这些情况下有两种快速技术来提高性能:

  1. 在开始拖动UIView之前,可以将view layershouldRasterize设置为true ,并在完成删除操作后,将shouldRasterize恢复为false 。 有时(特别是拖动的图像可能会改变),这会产生不利的影响,但是很简单,你可以看看它是否提高了性能。

  2. 另一种方法是手动创build一个快照(例如,使用裁剪来呈现视图到UIImage ),并用UIImageViewreplace该视图,然后拖动该视图,然后在删除它时将其replace为原始视图(如果您需要它,有时快照是你所需要的)。

我可能会build议观看WWDC 2012videoiOS应用程序性能:graphics和animation ,其中说明了一些用于诊断和解决graphics性能问题的技术。 video可能会有几年的历史,但技术仍然在很大程度上适用。 优化二维graphics和animation性能video也可能提供一些见解(虽然我认为其他video可能更适用于此)。

顺便说一句,有很多其他的技巧来提高性能(例如,当拖动视图,使用预测触摸;如果被拖动的视图包括很多的透明度,可能使一个不​​透明的快照拖动等),但也许尝试上面的第一个,看看是否最小化性能问题。 此外,请确保您在目标设备上进行testing,并且不要依赖模拟器中的testing,因为性能特征往往是完全不同的。

蒙版视图的animation本质上是缓慢的,因为渲染树必须在每一帧重新计算。 正如你所说的那样,并不是很多这样的观点在同一时间都被dynamic地performance出来(通常是口吃)。 苹果公司的WWDC专门为此提供了许多优秀的video,通常是在滚动的情况下(如桌面视图)。 我build议看一些这些video,这也build议解决方法。

基本上,最好的解决方法可能是不要这样做。 尝试其他方法,例如绘制视图,以便视图以正确的形状绘制(外部只是透明的)。 这在绘图系统上要小得多,因为没有复合的掩码。 例如,要使视图成为一个圆,请使用图像视图,其图像是一个圆的图像。 如果可能的话,当然一个不透明的观点更好。