[英]UIImage drawInRect:rect is too slow
我想编写一个简单的程序,例如:如果用户输入数字N(N <100),那么我会在UIView的任意位置在屏幕上绘制N条鱼。 我使用drawInRect
但是它非常慢。 在真实设备上绘制21 x 16 px的图像大约需要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);
}
MY Fish是21x16px,32位颜色,PNG格式,需要10毫秒才能在真实设备上绘制...非常慢!
p / s:一天后,我找到了一个好的解决方案:使用过的CGLayerRef和CGContextDrawLayerInRect比drawInRect快10到15倍。 希望对您有用!
您需要确保您不会在每个周期重画鱼。 drawInRect并不打算(除非绝对必要)用于重绘视觉效果。 这个想法是drawInRect被调用一次,并且输出被缓存以供重用。 假设您有100条鱼,则每条鱼调用一次drawInRect。 然后,进一步的操作(移动等)只是UIView上的翻译。 例如,view.frame.origin = CGMakePoint(100,100)等。因此,当应用程序启动时,您绘制了100条鱼视图,然后将它们移出屏幕。 如果用户输入50,则在屏幕上移动了50条鱼视图。 如果他们输入100,则将所有100移动到屏幕上。
通常,每条鱼都是一个UIView。 它们非常有效。
您是否尝试过删除NSLog
?
NSLog
非常慢,计时器功能也很NSLog
。 如果您需要测量时间,请不要对每条鱼都这样做,而要对所有鱼都这样做。
编辑:了解您正在使用什么设备后,我会说您的设备太慢而不是您的代码。
我不确定您的应用程序的用途是什么,但是如果您输入一个数字,并且该应用程序将绘制该数量的鱼,也许用户会发现等待1秒钟是可以接受的。 因此它可能已经足够快了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.