为啥使用 CGContextDrawImage 旋转图像比绘制旋转的 UIImage 慢得多?

Posted

技术标签:

【中文标题】为啥使用 CGContextDrawImage 旋转图像比绘制旋转的 UIImage 慢得多?【英文标题】:Why is rotating an image with CGContextDrawImage so much slower than drawing a rotated UIImage?为什么使用 CGContextDrawImage 旋转图像比绘制旋转的 UIImage 慢得多? 【发布时间】:2013-10-18 20:44:22 【问题描述】:

我正在从相机中获取图像,我必须考虑到它们处于不同的方向。我采取的第一种方法是使用this code snippet 创建一个正确旋转的UIImage。这会计算出CGAffineTransform,然后使用CGContextDrawImage 绘制图像。

但是,此操作需要 2-3 秒才能完成。

我采用的第二种方法是计算我必须旋转图像的度数,以及是否必须翻转它,然后在绘制UIImage 之前应用这些旋转。这种方法花费的时间可以忽略不计。

具体来说,我使用的是 Cocos2D,因此无论哪种情况,我都将 UIImage 转换为 CCTexture2D,使用该纹理创建一个精灵,然后绘制它。在第一种情况下,我创建了一个新的UIImage 并有一个未旋转的CCSprite。在第二个中,我使用了相同的UIImage,但有一个旋转的精灵。

为什么第二种方法要快得多?最终结果是相同的:旋转图像。似乎无论哪种方式,都必须以相同的方式操作相同的位和字节才能获得此结果。

【问题讨论】:

【参考方案1】:

看看这个question, experimentation, and answer。 UIImage 可能已经在后台进行了一些优化(由于我们不知道实现细节,所以没有真正的方法知道)。

【讨论】:

嗯,不可能就是这样。当我制作一个按钮时,当我按下它时,在 Cocos2D 中将图像旋转 90 度,每次旋转都会立即发生。我可以一遍又一遍地敲打它,看起来没有使用额外的内存。看起来 OpenGL 在这里做了一些聪明的事情。我想知道为什么手机不能做同样聪明的事情来旋转图像并获得旋转的字节..

以上是关于为啥使用 CGContextDrawImage 旋转图像比绘制旋转的 UIImage 慢得多?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的矩阵旋转会在 OpenGL 中倒退

巨大的内存峰值 - CGContextDrawImage

CGContextDrawImage 画大图很模糊

在没有内存峰值的情况下旋转 UIImage

CGContextDrawImage 的优化替代方案

使用 CoreGraphics CGContextDrawImage 在 CATiledLayer 中绘图