UIImage drawInRect:rect太慢了

时间:2011-03-14 12:22:37

标签: iphone objective-c

我想写一个简单的程序,如: 如果用户输入数字N(N <100),则我在UIView上的随机位置处在屏幕上绘制N鱼。我使用drawInRect,但速度非常慢。在真实设备上绘制一个21 x 16像素图像需要大约10毫秒...所以100条鱼将花费我大约1秒钟。我需要更快的方法(每条鱼大约1毫米)

还有其他方法吗?我不想使用Open GL b / s我需要用UIKIT做很多事情....

这是我的绘制功能:

void FishDraw(float px, float py)
{
    CGRect rect;


    NSDate *start = [NSDate date];
    rect.size.width = fishimg.size.width;
    rect.size.height = fishimg.size.height;
    rect.origin.x = px;
    rect.origin.y = py;
    [fishimg drawInRect:rect];  
    NSTimeInterval timeInterval = [start timeIntervalSinceNow];
    timeInterval  *= 1000;
    NSLog(@"%f",timeInterval);
}

我的鱼是21x16px,32位颜色,PNG格式需要10毫秒才能在真实设备上绘制......非常慢!

p / s:一天之后,我找到了很好的解决方案: 使用的CGLayerRef和CGContextDrawLayerInRect比drawInRect快10倍 - 15倍。 希望它对你有用!

2 个答案:

答案 0 :(得分:1)

你需要确保每个周期都没有撤回你的鱼。不应使用drawInRect(除非绝对必要)重绘您的视觉效果。这个想法是drawInRect被调用一次,并且该输出被缓存以供重用。所以说如果你有100条鱼,你可以为每条鱼叫一次drawInRect。然后,进一步的操作(移动等)就是UIView上的翻译。例如,view.frame.origin = CGMakePoint(100,100)等。因此,当应用程序启动时,您绘制100个鱼视图,然后将它们移出屏幕。如果用户输入50,则在屏幕上移动50个鱼瞰图。如果他们输入100,你将在屏幕上全部移动100个。

通常,每条鱼都是一只UIView。它们非常有效。

答案 1 :(得分:0)

您是否尝试删除NSLog

NSLog非常慢,计时器功能也消耗时间。如果你需要测量时间,不要为每条鱼都做,而是为所有鱼做。

编辑:在了解了您正在使用的设备之后,我会说您的设备太慢而不是代码。

我不确定你的应用程序的用途是什么,但是如果你输入一个数字并且应用程序将绘制该数量的鱼,也许用户认为可以接受等待1秒。所以它甚至可能已经足够快了。