Quartz2D性能 – 如何改进

我在iOS工作,并已提出这个问题。 我会收到一个相对较大的一组数据(一个500×500或更大的C风格的数组)。 我需要根据这个数据来构build基本上是X / Y的图,其中500×500网格中的每个数据点对应于基于其值的颜色。 问题在于,随着时间的推移,这会随着时间的推移而变化,所以计算必须快速,以便在新的数据集进入时进行更改。

所以基本上,对于数组中的每一个点,我需要找出它应该映射到哪个颜色,然后找出在网格上绘制的正方形来表示数据。 如果我的网格是768×768像素,但我有一个500×500的数据集,那么每个数据点将代表一个1.5×1.5的矩形(这是圆​​形的,但我希望你明白了)。

我试图通过创build一个新的视图类和重写drawRect。 然而,这与20×20数据集上的任何事情都可怕的performance相遇。

我已经看到了一些关于写入图像缓冲区的build议,但我还没有find任何这样做的例子(我对iOS很新)。 你有什么build议,或者你可以指点我的任何资源,可以帮助吗?

感谢您的时间,

达里尔

这里有一些代码,你可以把一个方法,将生成并返回一个UIImage在屏幕外的上下文。 为了提高性能,试着想办法减less迭代的次数,比如使“像素”变大,或者只画一个变化的部分。

UIGraphicsBeginImageContext(size); // Use your own image size here CGContextRef context = UIGraphicsGetCurrentContext(); // push context to make it current // (need to do this manually because we are not drawing in a UIView) // UIGraphicsPushContext(context); for (CGFloat x = 0.0; x<size.width; x+=1.0) { for (CGFloat y=0.0; y< size.height; y+=1.0) { // Set your color here CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0)); CGContextFillRect(context, CGRectMake(x, y, 1.0, 1.0)); } } // pop context // UIGraphicsPopContext(); // get a UIImage from the image context- enjoy!!! // UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext(); [outputImage retain]; // clean up drawing environment // UIGraphicsEndImageContext(); return [outputImage autorelease]; 

如果你想快,你不应该为每个像素调用明确的绘图函数。 您可以分配内存并使用CGBitmapContextCreate来构build一个包含该内存中数据的映像 – 这基本上是一个字节数组。 做你的计算,并将颜色信息(argb)直接写入该缓冲区。 但是,您必须自己做math,关于子像素精度(混合)。

我手边没有一个例子,但是searchCGBitmapContextCreate你带来正确的方向。