2010-04-16 175 views
1

即时尝试将两个图像合并为一个图像。不幸的是,为了响应用户滑动UISlider,这必须很快完成。我可以将这两个图像组合成一个单一的图像没有问题。但我这样做的方式非常慢。滑块坚持和跳跃相当令人沮丧。我不认为我可以将代码扔到后台线程中,因为我会很快耗尽线程。我还没有真正厌倦。下面是我的代码。关于如何加速它的任何想法都会有所帮助。更快的方式来绘制图像

UIGraphicsBeginImageContext(CGSizeMake(bodyImage.theImage.image.size.width * 1.2, bodyImage.theImage.image.size.height * 1.2)); 

[bodyImage.theImage.image drawInRect: 
    CGRectMake(-2 + ((bodyImage.theImage.image.size.width * 1.2) - bodyImage.theImage.image.size.width)/2, 
    kHeadAdjust, 
    bodyImage.theImage.image.size.width * bodyImage.currentScale, 
    bodyImage.theImage.image.size.height * bodyImage.currentScale)]; 

if(isCustHead) 
{ 
    [Head.theImage.image drawInRect: CGRectMake((bodyImage.theImage.image.size.width * 1.2 - headWidth)/2 - 11, 
      0, 
      headWidth * 0.92, 
      headWidth * (Head.theImage.image.size.height/Head.theImage.image.size.width) * 0.92)]; 
} 
else 
{ 
    [Head.theImage.image drawInRect: CGRectMake((bodyImage.theImage.image.size.width * 1.2 - (headWidth * defaultHeadAdjust))/2 - 10, 
      0, 
      (headWidth * defaultHeadAdjust * 0.92), 
      (headWidth * defaultHeadAdjust) * (Head.theImage.image.size.height/Head.theImage.image.size.width) * 0.92)]; 
} 

drawSurface.theImage.image = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 
+1

更有帮助的标签会帮助...这是iPhone API,对吧? – Kena 2010-04-16 19:33:50

+0

@Kena,功能名称的快速搜索结果显示它是iphone,所以我相应地批准了 – Earlz 2010-04-16 19:40:32

回答

2

我没有很多时间来回答,但你会想要做的一件事就是将你的绘图到的NSOperation和使用performOnMainThread:完成时通知。

每当你的滑块移动时,告诉NSOperationQueue取消它的操作。这样,如果用户滑动的速度非常快,那么您不会仅仅是为了立即将其扔掉。

当执行完成后,将图像存储在您制作的NSOperation子类中,然后将其传递给主线程,您可以在其中将图像应用于图层内容。

无论你的代码速度有多快,这都会对你的性能有所帮助,特别是对于不知情的用户。

对于图像渲染,您可能需要考虑制作一个自定义的离屏位图并渲染到其中。另外,尝试缓存很多数学,特别是如果变化不大。

你做的越少,就会越快。

也删除任何NSLog的,你可能有,这些真的很慢的事情。我只在配置中设置了一个标志时才使用NSLog的宏(所以我有一个调试+日志配置)

2

这实际上应该是非常快的。如果您的图像真的很大,您可能需要缓存它们的屏幕分辨率版本以用于渲染循环。

但实际上,在一般情况下,您无需自己做任何绘图。为两个图像创建单独的CALayer,将它们添加到视图中,并让CoreGraphics处理该图形。

+0

我认为这是该问题的主要解决方案,让操作系统通过CoreGraphics或直接通过OpenGl – 2010-04-16 20:26:04

0

不特定于iPhone。只是一个想法:

如何alpha混合 2个 图像?

OR

显示的2个图像一个在 其他(上面的一个为50% 透明)的顶部。