更快的绘制图像的方法

时间:2010-04-16 19:30:50

标签: iphone performance image

我试图将两个图像组合成一个图像。不幸的是,为了响应用户滑动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();

3 个答案:

答案 0 :(得分:2)

我没有太多时间回答,但您要做的一件事就是将您的绘图移到NSOperation并使用performOnMainThread:完成后通知。

每次滑块移动时,告诉NSOperationQueue取消它的操作。这样一来,如果用户滑动的速度非常快,那么你不会只是立刻把它扔掉。

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

无论您的代码有多快,这都将有助于您的表现,尤其是对于spazztic用户。

对于图像渲染,您可能需要考虑制作自定义的屏幕外位图并将其渲染到其中。另外,尝试缓存大量数学,特别是如果它没有太大变化。

你做的越少,它就越快。

同时删除你可能拥有的任何NSLog,那些非常慢的东西。只有在配置中设置了一个标志时才使用宏来NSLog(所以我有一个调试+日志配置)

答案 1 :(得分:2)

实际上,这应该是非常快的。如果您的图像非常大,您可能希望缓存它们的屏幕分辨率版本,以便在渲染循环中使用。

但实际上,在一般情况下,没有必要自己绘制这些图纸。为这两个图像创建单独的CALayers,将它们添加到视图中,让CoreGraphics处理绘图。

答案 2 :(得分:0)

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

  

如何 ALPHA-blend 2   图像?​​?

OR

  

在屏幕顶部显示2张图像   其他(上限为50%)   透明的)。