Quartz2D和Clipping - 优化这个绘图程序?

时间:2009-04-10 00:18:47

标签: iphone

我是Quartz2d的新手,所以我希望这是一个容易回答的问题。

我有一个滚动视图,其内容框架为1024x768。在此我推出一个自定义视图(框架1024x768)使用Quartz2d做一些绘图。我的想法是,我有一个很大的区域,用户可以滚动查看不同的部分。

我遇到的问题是,当我滚动设备时,我会收到内存警告错误或可怕的滚动性能。这无疑是因为我正在重新绘制整个1024x768字段。我认为将剪切路径设置为UIScrollView偏移量将有所帮助..它确实..直到我滚动..在这种情况下视图不会重绘,直到滚动停止。告诉视图在scrollViewDidScroll期间绘制也会导致性能不佳

谁能告诉我如何优化我的绘图程序?

我有两张图片..其中一张被遮盖,两张都被画在屏幕上(一张在另一张上面)

- (void)drawRect:(CGRect)dirtyRect {

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);

}

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 :(得分:0)

一般来说,为了优化滚动大的东西,你会看到CATiledLayer。

答案 1 :(得分:0)

我假设你打电话给setNeedsDisplay。您需要致电setNeedsDisplayInRect。确保只传递更改的矩形。