Quartz2D и Clipping - оптимизировать эту процедуру рисования? - PullRequest
2 голосов
/ 10 апреля 2009

Я новичок в Quartz2d, ​​поэтому я надеюсь, что на этот вопрос легко ответить.

У меня есть прокрутка, фрейм контента которой составляет 1024x768. В этом я помещаю пользовательский вид (с рамкой 1024x768), который использует Quartz2d для рисования. Идея в том, что у меня есть большая область, которую пользователь может прокручивать, чтобы увидеть разные части.

Проблема, с которой я сталкиваюсь, заключается в том, что при прокрутке устройства появляются ошибки предупреждения о памяти или ужасная производительность прокрутки. Это, без сомнения, потому что я перерисовываю все поле 1024x768. Я думал, что установка обтравочного контура для смещения UIScrollView поможет ... и это помогает ... пока я не прокручиваю ... в этом случае представление не перерисовывается, пока прокрутка не остановится. указание рисовать представление во время scrollViewDidScroll также приводит к плохой производительности

Может кто-нибудь сказать мне, как я могу оптимизировать мою процедуру рисования?

у меня есть два изображения ... одно из которых маскируется, а оба рисуются на экране (одно поверх другого)

- (void)drawRect:(CGRect)dirtyRect {</p> <pre><code>CGContextRef myContext = UIGraphicsGetCurrentContext(); // get our offset (where we've scrolled to) CGPoint offset = scrollView.contentOffset; // clip to our offset.. uncomment for good performance but terrible scrolling //CGContextClipToRect(myContext, CGRectMake(offset.x, offset.y, 480, 320)); // make an image from the mask context CGImageRef aMaskImage = CGBitmapContextCreateImage (myMaskContext); // mask the first image CGImageRef aImage = CGImageCreateWithMask(myImageRef1, aMaskImage); CGContextDrawImage(myContext, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), myImageRef1); CGContextDrawImage(myContext, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height), aImage); CGImageRelease(aImage); CGImageRelease(aMaskImage);

}

Заранее благодарим за любую помощь, которую вы можете оказать!

Ответы [ 2 ]

0 голосов
/ 16 декабря 2013

Полагаю, где-то вы звоните setNeedsDisplay. Вам нужно позвонить setNeedsDisplayInRect. Убедитесь, что вы пропустили только прямоугольник, который изменился.

0 голосов
/ 22 июня 2011

Как правило, для оптимизации прокрутки больших объектов вы можете обратиться к CATiledLayer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...