2012-12-13 3 views
0

У меня есть несколько фигур на экране, которые движутся.
Каждая форма может изменяться в зависимости от ее местоположения, и они заполняются градиентом с использованием CoreGraphics.Производительность CoreGraphics с градиентами

Производительность очень плохая - ~ 9 кадров в секунду на iPad3.

Любые советы по ускорению этого? Помогло бы оно иметь предварительно обработанное растровое изображение и вместо этого изменить его?

Я перерасчет формы (треугольник) и перерисовывать на каждом движении:

- (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); 
} 
+0

Как вы рисуете фигуры? Как вы их перемещаете? И т.д. и т. Д. (Нам нужны подробности) –

+0

Обновлено - будет объявление более позднее. –

+0

Обновлен с кодом –

ответ

0

Завершился созданием PNGs вместо которой может быть сжата и фасонным.
Частота кадров сразу же подскочила до 40 кадров в секунду - проблема решена.

+0

Как вы растягиваете градиент, не глядя ужасно? – jrturton

+1

Создал полупрозрачный градиентный треугольник 500x500 в фотошопе - во всех формах качество близко к тому, что было нарисовано в CG на экране сетчатки. На не-сетчатке края являются «жесткими». –

+0

ОК, поэтому вы обычно сокращаете его, а не растягиваете. Имеет смысл. – jrturton

Смежные вопросы