在UIView上快速绘制UIImage图像

时间:2012-01-18 15:37:05

标签: ios

在我的应用中,我必须在视图上实时绘制一些图像,这些图像会经常随着时间的推移而变化。这些图像是字典中包含的图像的子集。这是代码,总结一下:

-(void)drawObjects:(NSArray*)objects withImages:(NSDictionary*)images <etc>
{
    // Get graphic context and save it
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);

    // Display objects in reverse order
    for (int i = [objects count] - 1; i >= 0; i--) {
        MyObject *object = [objects objectAtIndex:i];

        // Check if object shall be visible
        if (<test to check whether the image shall be visible or not>) {

            // Get object image
            UIImage* image = <retrieve image from "images", based on a key stored in "object">;

            // Draw image
            float x = <calculate image destination x>;
            float y = <calculate image destination y>;
            float imageWidth = <calculate image destination width>;
            float imageHeight = <calculate image destination height>;
            CGRect imageRect = CGRectMake(x - imageWidth / 2, y - imageHeight / 2, imageWidth, imageHeight);
            [image drawInRect:imageRect];
        }
    }

    // Restore graphic context
    CGContextRestoreGState(context);
}

我的问题是这段代码很慢;当图像数量约为15(iPhone 4,iOS 4.3.5)时,执行循环大约需要700到800毫秒。我已经尝试了一下,似乎瓶颈是drawInRect调用,因为如果我排除它,一切都会大幅加速。

有人有建议吗?

2 个答案:

答案 0 :(得分:2)

问题是(我认为)你实际上是在每一帧中绘制(创建屏幕表示)图像,因为drawInRect:不知道你想重用图像您在最后一帧中显示的内容。但你不需要那样做。你只想绘制一次,然后转换它以改变它的位置和大小。

UIKit为您提供了便利:只需为UIImageView设置框架,图像就会显示在您想要的位置和大小,而无需重新渲染图像数据。

您可以通过自己存储UIImageViews来进一步优化它,这样就不必在每次需要显示它们时重新创建它们。 Istead只是相应地设置了他们的hidden属性。

答案 1 :(得分:0)

您的第一个答案:运行仪器,看看这部分实际上需要时间。 (是的,很可能是drawInRect:但它可能是你没有显示的“获取图像”)。