Эффективный метод хранения чертежей? - PullRequest
0 голосов
/ 23 марта 2011

Я занимаюсь разработкой базового приложения для рисования, в котором есть несколько классов.Одним из них является класс «Line», который хранит некоторую информацию о линии, которую может нарисовать пользователь.Когда пользователь перетаскивает экран, линия создается для каждого движения его пальца, поэтому линия следует за ним.Я сохраняю все линейные объекты в NSArray и перерисовываю каждый раз, когда что-то меняется.Тем не менее, так как массив только продолжает расти, и в конечном итоге начинает замедляться.Есть ли способ просто нарисовать новые линии или лучший механизм хранения линий?

РЕДАКТИРОВАТЬ: прочитайте ответ ниже, но setNeedsDisplayInRect:, похоже, не работает.Я называю это так:

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    for (UITouch *t in touches) {
        //add line to array w/ x and y values from touch
        [self setNeedsDisplayInRect:[self rectForLine:line]];
    }
}

-(CGRect)rectForLine:(Line*)line {
    CGFloat x1 = [line begin].x;
    CGFloat y1 = [line begin].y;
    CGFloat x2 = [line end].x;
    CGFloat y2 = [line end].y;
    CGFloat originX = (x1>x2) ? x1 : x2;
    CGFloat originY = (y1<y2) ? y1 : y2;
    CGFloat diffX = ((x1>x2) ? x1 : x2) - originX;
    CGFloat diffY = ((y1>x2) ? y1 : y2) - originY;
    return CGRectMake(originX, originY, diffX, diffY);
}

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context, 10.0);
    CGContextSetLineCap(context, kCGLineCapRound);
    //[[UIColor blackColor] set];
    for (Line *line in completeLines) {
        if (CGRectContainsPoint(rect, [line begin]) && CGRectContainsPoint(rect, [line end])) {
            //draw line onto the screen
        }
    }

1 Ответ

2 голосов
/ 23 марта 2011

Если "линия" - это просто пара точек в вашей модели данных, это не та часть, которая замедляет вас.

Ваша проблема в том, что вы перерисовываете всю вещь в каждой добавляемой строке, который является O (n ^ 2) или, в частности, алгоритм Шлемеля-Пейнтера .

Самое простое улучшение, при условии, что вы рисуете внутри -drawRect: UIView, - это, вероятно, только аннулирование и перерисовка прямоугольника, содержащего новую строку.Основываясь на начальной и конечной точках, вы можете создать недопустимый прямоугольник для отправки на -setNeedsDisplayInRect:, а затем в вашем drawRect посмотреть на все ваши линии и нарисовать только те, которые попадают в прямоугольник.Это ограничивает вашу производительность рисования размером линий и, в гораздо меньшей степени, чертежом, который «уже есть».

...