Quartz2D性能 - 如何改进

时间:2011-05-16 20:21:28

标签: ios

我在iOS上工作并遇到过这个问题。我将收到一组相对较大的数据(500x500或更高的C风格数组)。我需要根据这些数据构建基本上是X / Y的图,其中500x500网格中的每个数据点对应于基于它的值的颜色。问题在于,这会随着时间的推移而变化,制作一些动画,因此计算必须快速,以便在有一组新数据进入时进行更改。

所以基本上,对于数组中的每个点,我需要弄清楚应该映射到哪个颜色,然后找出要在网格上绘制的方块来表示数据。如果我的网格是768x768像素,但我有一个500x500的数据集,那么每个数据点将代表一个1.5x1.5的矩形(这是圆​​形的,但我希望你能得到这个想法)。

我通过创建一个新的视图类并重写drawRect来尝试这个。然而,在20x20以上的数据集中遇到了可怕的表现。

我已经看到了一些关于写入图像缓冲区的建议,但是我还没有找到任何这样做的例子(我对iOS很新)。您有任何建议吗?或者您能指出任何有用的资源吗?

感谢您的时间,

的Darryl

2 个答案:

答案 0 :(得分:1)

这里有一些代码可以放在一个方法中,该方法将在屏幕外的上下文中生成并返回一个UIImage。为了提高性能,请尝试找出最小化迭代次数的方法,例如使“像素”更大,或仅绘制更改的部分。

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

答案 1 :(得分:0)

如果你想要快,你不应该为每个像素调用显式绘图函数。您可以分配内存并使用CGBitmapContextCreate来构建包含该内存中数据的图像 - 这基本上是一个字节数组。进行计算并将颜色信息(a-r-g-b)直接写入该缓冲区。但是,关于子像素精度(混合),你必须自己做数学运算。

我手头没有示例,但搜索CGBitmapContextCreate会让你找到正确的方向。