0

画面上に複数の図形が動いています。
各形状はその位置に基づいて変更でき、CoreGraphics を使用してグラデーションで塗りつぶされます。

これのパフォーマンスは非常に悪く、iPad3 では ~9fps です。

これをスピードアップするためのヒントはありますか?事前にレンダリングされたビットマップを用意して、代わりにこれを再形成することは役に立ちますか?

私は形状(三角形)を再計算し、すべての動きで再描画しています:

- (void) drawGradientShapeInRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGFloat start_x = self.frame.size.width / 2.0;
    CGFloat start_y = self.frame.size.height;

    CGFloat end_x = radius_ * cos(angleInRad_) + start_x;
    CGFloat end_y = MAX(radius_ * sin(angleInRad_) + start_y, self.bounds.size.height - constrainedHeight_);

    // Create Lines
    CGPoint startPt = CGPointMake(start_x, start_y);

    CGContextMoveToPoint(context, self.center.x, self.center.y);
    CGPoint addLines[] =
    {
        startPt,
        CGPointMake(end_x, end_y),
        CGPointMake(end_x, start_y),
        startPt
    };

    CGContextAddLines(context, addLines, sizeof(addLines)/sizeof(addLines[0]));

    // Setup Gradient
    CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
    NSArray *colors = nil;
    if(start_x > end_x)
    {
        colors = [NSArray arrayWithObjects:
                  (id)[UIColor colorWithRed:0 green:0 blue:0 alpha:0].CGColor,
                  (id)[UIColor colorWithRed:0 green:0 blue:0 alpha:0.3f].CGColor,
                  nil];
    }
    else
    {
        colors = [NSArray arrayWithObjects:
                  (id)[UIColor colorWithRed:0 green:0 blue:0 alpha:0.3f].CGColor,
                  (id)[UIColor colorWithRed:0 green:0 blue:0 alpha:0].CGColor,
                  nil];
    }

    CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
    CGGradientRef gradient = CGGradientCreateWithColors(space, (__bridge CFArrayRef)colors, NULL);
    CGColorSpaceRelease(space);
    CGColorSpaceRelease(rgb);

    CGPoint startGradientPt = CGPointMake((start_x < end_x) ? start_x : end_x, 0);
    CGPoint endGradientPt   = CGPointMake((start_x > end_x) ? start_x : end_x, 0);

    CGContextSaveGState(context);
    CGContextClip(context);
    CGContextDrawLinearGradient(context,
                                gradient,
                                startGradientPt,
                                endGradientPt,
                                0);
    CGGradientRelease(gradient);
    CGContextRestoreGState(context);
}
4

1 に答える 1

0

Ended up creating PNGs instead which can be shrunk and shaped.
Frame rate immediately jumped to 40fps - problem solved.

于 2012-12-14T05:56:04.340 に答える