我们正在构建一个可以处理大量图像的应用程序。我们对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上执行任何操作。
答案 0 :(得分:4)
要回答有关解压缩的问题:Core Image,GPUImage和UIImage都使用与从磁盘加载图像相同的方法。对于Core Image,你从UIImage开始,对于GPUImage,你可以在the GPUImagePicture source中看到它当前依赖于通常通过UIImage获得的CGImageRef。
UIImage在CPU端进行图像解压缩,而我为了提高GPUImage的图像加载性能而查看的其他库也是如此。 GPUImage中用于图像加载的最大瓶颈是必须将图像加载到UIImage中,然后通过Core Graphics将其上传到纹理中。我正在研究更直接的方法来获取像素数据,但是我试过的所有解压缩例程最终都比本机UIImage加载慢。
可以在GPU上完成图像裁剪,Core Image和GPUImage都可以执行此操作。由于图像加载开销,这可能比通过Core Graphics裁剪更快或更快,因此您需要自己对您关注的图像大小进行基准测试。更复杂的图像处理操作,如调整颜色等。generally end up being overall wins on the GPU for most image sizes on most devices。如果可以减少这种图像加载开销,那么GPU端处理将在更多情况下获胜。
就设备类的GPU功能而言,不同iOS设备之间存在显着的性能差异,但功能往往大致相同。片段着色器处理性能在iPhone 4,4S,5和5S设备之间可能有几个数量级的不同,对于某些操作,5S比4倍快.A6和A7设备有一些旧设备缺少的扩展,但那些只在非常具体的情况下发挥作用。
最大的区别往往是GPU硬件支持的最大纹理尺寸,iPhone 4和早期设备限制为2048x2048纹理和iPhone 4S以及更高支持4096x4096纹理。这可以使用像GPUImage这样的东西来限制可以在GPU上处理的图像的大小。