使用GPUImage与Core Image与UIImage进行解压缩



我们正在构建一个可以处理大量图像的应用程序。我们对Core Image、GPUImage和UIImage以及它如何解压缩图像都很感兴趣。我们已经熟悉这样一个事实,对背景线程上的图像进行解压缩将有助于消除UI滚动中的断断续续或抖动。然而,我们不太熟悉这种减压工作是在哪里进行的。我们还使用UIImage对图像进行了一些裁剪。问题来了:

背景:我们一直支持iPhone 4的设备,但很快可能会放弃iPhone 4,转而支持iPhone 4S作为我们最古老的设备。

1) 图像的解压缩是在GPU上完成的吗。。。核心形象?GPUImage?UIImage?

2) 图像的裁剪可以在GPU上完成吗。。。核心形象?GPUImage?UIImage?

3) 基于我们的设备配置文件,GPU支持是否存在差异?

基本上,我们希望尽可能多地卸载到GPU,以释放设备上的CPU。此外,我们希望在GPU上进行任何操作,这样做比在CPU上更快。

要回答您关于解压缩的问题:Core Image、GPUImage和UIImage都使用几乎相同的方法从磁盘加载图像。对于Core Image,您可以从UIImage开始,对于GPUImage,您可以在GPUImagePicture源中看到它目前依赖于通常通过UIImage获得的CGImageRef。

UIImage在CPU端进行图像解压缩,我研究过的其他用于提高GPUIimage图像加载性能的库也做了同样的工作。GPUImage中图像加载的最大瓶颈是必须将图像加载到UIImage中,然后通过Core Graphics将其上传到纹理中。我正在寻找更直接的方法来获得像素数据,但我尝试过的所有解压缩例程最终都比原生UIImage加载慢。

图像的裁剪可以在GPU上完成,Core image和GPUImage都允许您这样做。由于图像加载开销,这可能比通过Core Graphics进行裁剪快,也可能不快,因此您需要根据自己关心的图像大小进行基准测试。对于大多数设备上的大多数图像大小,更复杂的图像处理操作,如颜色调整等,通常最终会在GPU上获得全面胜利。如果可以减少这种图像加载开销,那么在更多情况下,GPU侧处理将获胜。

就设备类的GPU功能而言,不同iOS设备之间存在显著的性能差异,但功能往往基本相同。片段着色器处理性能在iPhone 4、4S、5和5S设备之间可能有几个数量级的不同,其中对于某些操作,5S比4快1000倍。A6和A7设备有一些旧设备所缺乏的扩展,但这些扩展只在非常特定的情况下发挥作用。

最大的区别往往是GPU硬件支持的最大纹理大小,iPhone 4和更早的设备仅限于2048x2048纹理,iPhone 4S和更高版本支持4096x4096纹理。这可以限制可以在GPU上使用类似GPUImage的东西处理的图像的大小。

最新更新