繁体   English   中英

UIImage drawInRect:rect太慢

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM