优化drawLayer动画

时间:2015-02-12 05:23:10

标签: ios objective-c iphone quartz-graphics

我有一个游戏,我在UIView上绘制4到5个大圆圈,然后旋转它们。这一切都是通过drawLayer:inContext:方法完成的。

虽然它有效但效率非常低,占用了100%的CPU;占用100%CPU的5个圆圈?!那太离谱了!我必须接近这个错误。

如何在Objective-C中有效地为绘制路径设置动画,以便CPU使用率不会那么高?我只是不应该以这种方式动画?如果是这样,我该如何正确地为必须改变的形状设置动画?


为了让您更多地了解我在这里尝试做什么,屏幕上会显示5个响铃。每个都有一个空隙,用户将试图逃脱。环将不断折叠到屏幕的中心,但线宽和间隙尺寸(沿圆周)将始终相同。

这就是为什么我不只是用CGAffineTransforms做这件事。当环的半径缩小时,环需要不断重新绘制。


以下是我正在使用的代码:

const float ringThickness = 20;

- (id)initWithFrame:(CGRect)frame displayMode:(BOOL)mode
{
    self = [super initWithFrame:frame];
    if(self)
    {
        [self setBackgroundColor:[UIColor clearColor]];

        playMode = mode;

        [self.layer setContentsScale:[UIScreen mainScreen].scale];

        rings = [[NSMutableArray alloc] init];

        if(mode)
        {
            //Add rings
            for(int i = 0; i < 5; i++)
            {
                [rings addObject:[@{@"radius" : @(100+ 40 * i + 5*powf(i, 2)), @"gapCenter" : @(randomFloat(0, 2 * M_PI)), @"direction" : @(i % 2)} mutableCopy]];
            }

            gapSize = 250;

            autoplay = [NSTimer scheduledTimerWithTimeInterval:1/60.0 target:self selector:@selector(timer) userInfo:nil repeats:YES];
        }

        [self.layer setNeedsDisplay];
    }
    return self;
} 

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
    CGContextSetLineCap(ctx, kCGLineCapButt);
    CGContextSetLineWidth(ctx, ringThickness);
    CGContextBeginPath(ctx);

    for(int i = 0; i < rings.count; i++)
    {
        NSMutableDictionary* ring = rings[i];

        float radius = [ring[@"radius"] floatValue];
        float brightness = 120 / radius;
        brightness = (brightness > 1) ? 1 : brightness;

        if(playMode)
            brightness /= 2;

        CGContextSetStrokeColorWithColor(ctx, [UIColor colorWithRed:1 green:(153.0/255) blue:(151.0/255) alpha:brightness].CGColor);

        float gapCenter = [ring[@"gapCenter"] floatValue];
        float cc = 2 * M_PI * radius;
        float gapWidth = gapSize / cc * 360;
        float gapStart = gapCenter + (gapWidth / 360.0 * M_PI);

        CGContextAddArc(ctx, sw()/2, sh()/2, radius, gapStart, gapStart + (2 * M_PI) - (gapWidth / 360.0 * M_PI), 0);
        CGContextStrokePath(ctx);

        if(playMode)
        {
            //Autoplay
            if([ring[@"direction"] boolValue])
            {
                ring[@"gapCenter"] = @(gapCenter + 0.005 * M_PI);
            }
            else
            {
                ring[@"gapCenter"] = @(gapCenter - 0.005 * M_PI);
            }

        }
    }
}

- (void)timer
{
    [self.layer setNeedsDisplay];
}

有人可以引导我朝正确的方向前进吗?这是ObjC的一部分,我仍然不太了解。

0 个答案:

没有答案