绘图蒙版影响性能

时间:2016-03-21 18:11:10

标签: ios objective-c uiview

这是我用于为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添加遮罩,它的工作速度非常快

2 个答案:

答案 0 :(得分:1)

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

  1. 在开始拖动UIView之前,您可以将shouldRasterize layer的{​​{1}}设置为view,当您完成删除后,将true恢复为shouldRasterize。有时(特别是如果拖动的图像可能会发生变化)这会产生负面影响,但尝试起来很简单,你可以看看它是否能提高性能。

  2. 另一种方法是手动创建快照(例如,将视图渲染为false)并用UIImage替换视图,然后拖动它,然后当你放下它时,用原始视图替换它(如果你需要它;有时你需要快照)。

  3. 我可能会建议观看WWDC 2012视频iOS App Performance: Graphics and Animations,其中介绍了诊断和解决图形性能问题的一些技巧。该视频可能已有几年历史,但这些技术仍然适用。 Optimizing 2D Graphics and Animation Performance视频也可能提供一些见解(虽然我认为其他视频可能更适用于此处)。

    顺便提一下,有很多其他技巧可以改善性能(例如,拖动视图时,使用预测性触摸;如果被拖动的视图包含大量透明度,可能会制作不透明的快照以进行拖动;等等) ,但也许首先尝试以上,并看看是否最小化性能问题。另外,请确保在目标设备上进行测试,并且不要依赖于模拟器中的测试,因为性能特征通常是完全不同的。

答案 1 :(得分:0)

蒙版视图的动画本质上很慢,因为必须在每一帧重新计算渲染树。正如你正确地说的那样,并没有需要很多这样的观点同时为此变得明显(这通常是在口吃中)。 Apple的WWDC已经为此投入了许多优秀的视频,通常是在滚动的背景下(例如桌面视图);我建议观看一些视频,这也是建议的解决方法。

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