Android 如何在GPU上处理高分辨率图像处理的GPU内存限制?

Android 如何在GPU上处理高分辨率图像处理的GPU内存限制?,android,image-processing,opengl-es-2.0,gpu,Android,Image Processing,Opengl Es 2.0,Gpu,我正在制作一个摄像头应用程序,该应用程序将为用户提供一些过滤器。目前我的代码在NDK上,工作正常,但我想让它快一点。看来GPU和OpenGLES2.0是一个不错的选择。我唯一关心的是GPU的内存限制。因为现代相机可以拍摄5-10MP的图像,而GPU的内存限制远小于此。我想知道是否有办法绕过这个限制。在我看来,唯一合乎逻辑的选择似乎是将图像分割成更小的部分,然后在GPU上处理它们,最后将它们组合到最终图像中。我的问题是,如果这种方法仍然有利于性能,并且在移动GPU上处理高分辨率图像还有其他选择吗

我正在制作一个摄像头应用程序,该应用程序将为用户提供一些过滤器。目前我的代码在NDK上,工作正常,但我想让它快一点。看来GPU和OpenGLES2.0是一个不错的选择。我唯一关心的是GPU的内存限制。因为现代相机可以拍摄5-10MP的图像,而GPU的内存限制远小于此。我想知道是否有办法绕过这个限制。在我看来,唯一合乎逻辑的选择似乎是将图像分割成更小的部分,然后在GPU上处理它们,最后将它们组合到最终图像中。我的问题是,如果这种方法仍然有利于性能,并且在移动GPU上处理高分辨率图像还有其他选择吗


编辑:我需要澄清的是,我想使用GPU进行图像处理,所以我的目标不是将结果呈现到屏幕上。我将渲染到另一个纹理并保存到磁盘

自从任天堂娱乐系统推出Ricoh 2A03,频率为1.79 MHz以来,您的拼接理念就一直在使用,所以这是一个很好的方法。谷歌使用平铺来管理地图显示,甚至像Crysis这样的游戏也倾向于将大多数纹理的纹理大小限制在1024x1024(100万像素)左右。是的,1000万像素需要30兆内存,所以有些设备可能会有问题,特别是如果你使用源和dest纹理,这意味着需要60兆内存


请记住,纹理大小往往使用2的幂(2、4、8、16、32、64等)。有时你会得到更好的质量,至少如果你把它切碎并平铺图像

您不需要对10MP图像应用实时过滤器。。。 因为没有这样的显示器(或者可能有,但在我们中间并不流行)

因此,您只需要对正在显示的像素应用过滤器(1900x1280?)。
您提到的平铺技术在某些场景中仍然有用。延迟呈现就是这样一个例子。X-Box 360每天都采用这两种技术(延迟平铺)。由于延迟技术对内存的要求很高,如果不进行平铺,就不可能实现此功能。

这实际上取决于您正在尝试做什么。GPU的优点是它们高度并行,但不是所有的问题都可以通过简单地向它们扔更多的内核来解决。我想得到一个一般问题的通用解决方案,但目前我正在尝试编写“拉普拉斯金字塔”,这在CPU上进行时成本非常高。嗯,如果你正在做一些事情,比如对一个图像应用着色,你想对所有的位应用相同的操作,那么加载到GPU是一个明显的解决方案。像模糊图像这样的任务有点棘手,因为每个像素的新值取决于一系列像素。但是,在你的情况下,你必须考虑硬件之间有很多不同之处,比如它们支持多少RAM,纹理有多大,你可以发送多少数据。他们甚至可能无法进行OpenCL风格的处理也可以用于模糊-只需提供源数据的重叠区域,并以适当的方式缝合输出。您需要绕过该限制吗?也就是说,相机预览帧真的需要全分辨率吗?或者你可以在拍摄全分辨率最终图像的同时拍摄低分辨率的预览帧吗?我编辑了这个问题,以澄清我不会使用gpu将图像复制到屏幕上。我与屏幕及其分辨率无关。图像处理将在后台完成,屏幕将仅显示进度条。所以GPU内存限制对我来说仍然存在。