UIImage drawInRect: 很慢,有更快的方法吗?

7

这个功能实现了它需要完成的任务,但是它需要大约400毫秒的时间,这比需要的时间长出了350毫秒:

 - (void) updateCompositeImage { //blends together the background and the sprites
    UIGraphicsBeginImageContext(CGSizeMake(480, 320));

    [bgImageView.image drawInRect:CGRectMake(0, 0, 480, 320)];

    for (int i=0;i<numSprites;i++) {
        [spriteImage[spriteType[i]] drawInRect:spriteRect[i] blendMode:kCGBlendModeScreen alpha:spriteAlpha[i]];
    }

    compositeImageView.image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();
}

这些图像相当小,而且只有三张(for循环只迭代两次)。

有没有更快的方法来做到这一点?同时仍然能够使用kCGBlendModeScreen和alpha?

2个回答

8

您可以:

  • 获取UIImages的CGImages
  • 然后将它们绘制到CGBitmapContext中
  • 从中产生一张图片

使用CoreGraphics本身可能会更快。另一个好处是您可以在后台线程上执行渲染。还要考虑如何优化该循环并使用Instruments进行分析。

其他注意事项:

  • 您能否降低插值质量?
  • 源图像是否以任何方式被缩放(如果您调整大小,可以提高性能)

我刚想到一个避免使用kCGBlendModeScreen或者任何实时混合的方法。如果我使用精灵的黑白版本,并在Photoshop中预先将其应用为阿尔法通道,那么效果应该是一样的,对吧?黑色将变为透明,白色将变为不透明,50%亮度将变为50%不透明。 - vladimir z
...但那只是一个临时的解决办法。我会尝试绘制到CGBitmapContext上。 - vladimir z
@vladimir z,您可能也对CG的图像遮罩感兴趣,以达到这个目的。 - justin

-1

drawInRect太慢了。完全是这样。即使在小图像上,它也极其低效。

如果你需要频繁绘制,那就看看CGLayer,它专门设计用来方便重复渲染相同的位图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接