核心图形使用太多CPU

时间:2014-02-19 17:38:24

标签: ios core-graphics core-animation

我正在实现以下图形drawRect函数,但它使用超过50%的CPU - 任何关于如何解决这个问题的想法?我只画了几条随机线,但我希望它们都有不同的宽度。

- (void)drawRect:(CGRect)rect
{

    [super drawRect:rect];

    @autoreleasepool {

        CGContextRef context = UIGraphicsGetCurrentContext();
        CGMutablePathRef path = CGPathCreateMutable();



        float width = rect.size.width;
        int nbLine=10; // i want to draw 10 paths

        for (int iLine=1;iLine<nbLine;iLine++){

            float Pathwidth=0.8*(nbLine-(float)iLine)/nbLine;
            CGContextBeginPath(context);
            CGContextSetLineWidth(context, Pathwidth); //each path should have its own width
            CGPathMoveToPoint(path, NULL, 0,0);

            for (int i=0;i<10;i++){
                float x=width/(i+1);
                float y=1;//for this example, I just put a fixed number here - it's normally an external variable
                CGPathAddQuadCurveToPoint(path, NULL, x+width/10, y,  x,0);


            }

            CGContextAddPath(context, path);
            CGContextStrokePath(context);
        }

        CGPathRelease(path);

    }
}
谢谢你!

2 个答案:

答案 0 :(得分:0)

您可以尝试一些事项。

  1. 使用仪器确切地找出使用CPU的行。
  2. 在UIBezierPath中构建一次路径,然后每次在drawRect中绘制它们。
  3. 查看从哪里调用setNeedsDisplay。最有可能每次绘制它都不会消耗太多的CPU。很可能问题在于它正在反复快速地掠过。

答案 1 :(得分:0)

如果按性能,可以使用GLKView。 Core Drawing基于OpenGL,为图形清晰度和质量设置了大量优化。但是,如果这些选项让您放慢到不可用的程度,那么这可能是您最好的选择。

我的第二个建议是不要经常打电话。你说它每4毫秒被调用一次,即每秒250次。用户看不到细节,所以这是奢侈的。

我的第三个建议是使用UIView,绘制一次,然后根据你的y变量修改它的变换。看起来好像你可以做一个简单的y缩放来实现你想要做的事情(没有x改变,没有行的宽度改变(在绘制一次之后))。我可能会根据你的代码进行简化,但尝试一下是件好事。如果y比例变换太大,你也可以混合使用这个建议和你的代码并重绘。