Рисование большого количества линий (CGContextBeginPath) на iPad - PullRequest
1 голос
/ 04 января 2011

Я пытаюсь создать приложение для ipad, которое рисует много, но я действительно имею в виду много линий на сцене (10.000+)

, используя этот простой forloop, мой ipad падает через 40 ~ 60 секундпоказывает результат)

for ( int i = 0; i < 10000; i++ )
    {
        int r_x = rand() % 750;
        int r_y = rand() % 1000;
        CGPoint pointpoint = CGPointMake(r_x, r_y);
        UIColor *st = [[GetColor alloc] getPixelColorAtLocation:pointpoint];
        DrawLine *drawview = [[DrawLine alloc]initWithFrame:CGRectMake(r_x, r_y, 20, 20) selectedcolor:st];
        [self.view addSubview:drawview];
        [drawview release];
        [DrawLine release];
        [GetColor release];
    }

и это мой класс "DrawLine":

- (id)initWithFrame:(CGRect)frame selectedcolor:colors{
    if ((self = [super initWithFrame:frame])) {
        selectedcolor_t = colors;
        self.backgroundColor = [UIColor clearColor];
    } 
    return self;
}

- (void)drawRect:(CGRect)frame{
    CGContextRef c = UIGraphicsGetCurrentContext();
    float* colors = CGColorGetComponents(selectedcolor_t.CGColor);
    CGContextSetStrokeColor(c, colors);
    CGContextBeginPath(c);
    CGContextMoveToPoint(c, 0.0f, 0.0f);
    CGContextAddLineToPoint(c, 20.0f, 20.0f);
    CGContextStrokePath(c);

}

как я могу решить эту проблему?Как я могу нарисовать так много подпредставлений, не разбивая iOS?

большое спасибо !!:)

Ответы [ 2 ]

9 голосов
/ 04 января 2011

Пожалуйста, пересмотрите, что вы там делаете:

  1. В строке 4 вашего цикла вы alloc получаете экземпляр GetColor - который вы никогда больше не используете.Спросите себя: имеет ли это какой-то смысл с точки зрения дизайна?
  2. В той же строке, если вы не нарушаете соглашения об именах Cocoa, вы создаете UIColor, который никогда не выпускается ...
  3. Затем в строке 8 вы выпускаете объект класса из DrawLine (то же самое для следующей строки и класса GetColor). Это ужасно, ужасно неправильно!

Пожалуйста, посетите Руководство по программированию управления памятью в iOS Dev-Center и прочитайте первые два раздела (снова)!

Кроме того, переоцените ваш дизайн:

  • Должен ли GetColor действительно быть классом, так что вы создаете экземпляры?Разве простая вспомогательная функция для цветовой интерполяции не имеет больше смысла в этом контексте?
  • Если это должен быть класс, почему бы не создать только один его экземпляр вне цикла ипросто несколько раз запрашивать его для цветов?
  • Вам действительно нужен подкласс UIView, чтобы нарисовать одну прямую, сплошную, одноцветную линию?Если линии не нужно обновлять, вы должны (как предложили Ричард и nacho4d) нарисовать их все в одном объекте (например, с помощью пользовательского UIView или делегата CALayer, реализующего метод drawLayer:inContext:).Если вам нужно обновить эти строки позже, вы можете просто (ab) использовать CALayer ...

В последнем случае ваша проблема тогда становится такой:

  1. Рассчитайтеслучайные координаты.
  2. Рассчитайте свой цвет.
  3. Создайте непрозрачный CALay с
    a) тем цветом в качестве его backgroundColor,
    b) шириной 20* sqrt (2),
    c) высота того, что вам нужно, чтобы быть шириной этой линии,
    d) ваша точка в качестве ее источника и
    e)rotation из 45.
  4. Добавьте этот слой в качестве подслоя к слою self.view.

Приветствия
Даниэль

2 голосов
/ 04 января 2011

Если ваши линии статичны (не движутся позже, не анимируются и т. Д.), Как они кажутся, вы также можете нарисовать все линии в одном drawRect: в одном представлении, не создавая 1000 CALayers.Я не могу сказать, если это быстрее, чем рисовать 1000 CALayers (потому что CoreAnimation аппаратно ускоряется, а CoreGraphics нет), но он, безусловно, легче, поскольку все линии будут сглажены в одном растровом изображении .(это контекст вашего представления)

Просто переместите цикл for внутри drawRect: и следуйте советам danyowde (вам просто нужен один цветовой объект или вспомогательная функция, но не для создания цвета на каждой итерации)

Удачи, надеюсь, это поможет;)

...