Рисование инкрементно в UIView (iPhone)

kamaelia платформа Python для того, чтобы создать приложения с большим количеством коммуникационных процессов.

Kamaelia - Параллелизм сделал полезным, забавным

В Kamaelia Вы системы сборки от [1 110] простые компоненты, которые говорят друг с другом . Эта разработка скоростей, в широком масштабе помогает обслуживанию и также означает Вас сборка естественно параллельное программное обеспечение . Это предназначается, чтобы быть доступным [1 112] любой разработчик, включая новичков. Это также делает его забавой:)

, Какой системы? Сетевые серверы, клиенты, настольные приложения, pygame базирующиеся игры, транскодируют системы и конвейеры, системы цифрового телевидения, спам eradicators, обучающие инструменты и изрядное количество больше:)

См. также Вопрос Многоядерный и Параллелизм - Языки, Библиотеки и Методы Разработки

11
задан Dimitris 25 November 2009 в 19:17
поделиться

5 ответов

Если вы фактически изменяете только небольшую часть содержимого UIView каждый раз, когда рисуете (а остальное содержимое обычно остается неизменным), вы можете использовать это. Вместо того, чтобы перерисовывать все содержимое UIView каждый раз, вы можете пометить только те области представления, которые необходимо перерисовать, используя - [UIView setNeedsDisplayInRect:] вместо - [UIView setNeedsDisplay] .

6
ответ дан 3 December 2019 в 10:26
поделиться

Сколько эллипсов вы собираетесь нарисовать? В общем, Core Graphics должна уметь быстро рисовать много эллипсов.

Однако вы можете кэшировать свои старые рисунки в изображение (однако я не знаю, более производительно ли это решение):

UIGraphicsBeginImageContext(self.frame.size);
CGContextRef ctx = UIGraphicsGetCurrentContext(); // ctx is now the image's context

[cachedImage drawAtPoint:CGPointZero];
// only plot new ellipses here...

[cachedImage release];
cachedImage = [UIGraphicsGetImageFromCurrentImageContext() retain];
UIGraphicsEndImageContext();

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextDrawImage(context, self.bounds, maskRef);          //draw the mask
CGContextClipToMask(context, self.bounds, maskRef);         //respect alpha mask
CGContextSetBlendMode(context, kCGBlendModeColorBurn);      //set blending mode

[cachedImage drawAtPoint:CGPointZero];
0
ответ дан 3 December 2019 в 10:26
поделиться

Вы можете сохранить свой CGPath как член своего класса. И используйте это в методе рисования, вам нужно будет создать путь только при изменении точек, но не каждый раз, когда представление перерисовывается, если точки являются инкрементными, просто продолжайте добавлять эллипсы к пути. В методе drawRect вам нужно будет только добавить путь

CGContextAddPath(context,dotsPath);

-(CGMutablePathRef)createPath
{
    CGMutablePathRef dotsPath =  CGPathCreateMutable();

    for (Drop *drop in myPoints) {
        CGPathAddEllipseInRect ( dotsPath,NULL,
            CGRectMake(drop.point.x - drop.size/2, drop.point.y - drop.size/2, drop.size, drop.size));
    }

return dotsPath;
}
2
ответ дан 3 December 2019 в 10:26
поделиться

Если я правильно понимаю вашу проблему, я бы попробовал рисовать на CGBitmapContext вместо экрана прямо. Затем в drawRect нарисуйте только ту часть предварительно обработанного растрового изображения, которая необходима из параметра rect .

1
ответ дан 3 December 2019 в 10:26
поделиться

Если вы можете кэшировать рисунок как изображение, вы можете воспользоваться поддержкой CoreAnimation UIView. Это будет намного быстрее, чем использование Quartz, поскольку Quartz выполняет рисование в программном обеспечении.

- (CGImageRef)cachedImage {
    /// Draw to an image, return that
}
- (void)refreshCache {
    myView.layer.contents = [self cachedImage];
}
- (void)actionThatChangesWhatNeedsToBeDrawn {
    [self refreshCache];
}
0
ответ дан 3 December 2019 в 10:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: