我在sdcard 上有 200张图片,它们逐帧表示对象的 360视图。 我想让用户通过在图像上拖动手指来“旋转”对象。
我实现拖动事件没有问题,问题在于加载和切换图像。在显示活动之前缓存所有图像是不可能的,因为该过程的有限的VM内存(图像非常大,分辨率超过SVGA)。在拖动事件上加载图像无效 - 远远不可接受。
有没有人遇到过这样的问题? 任何帮助将不胜感激。
答案 0 :(得分:1)
您提到的有限VM内存(也称为VM堆大小,大约为16Mb)仅影响在Java中分配的内存。您可以在本机代码中分配更多内存。在真实设备上,通常有数百兆字节的RAM。
但是,如果您的应用程序使用太多内存,它可能仍会被系统杀死。因此,当您需要处理大内存时,最好的解决方案是使用Linux mmap()工具进行内存文件映射。这很聪明,可以作为交换。使用mmap()甚至可以映射比实际物理RAM大小更多的内存,内核将根据需要从底层文件加载/卸载内存页。
但是,我不认为您可以将mmapped内存与标准小部件(如ImageView)一起使用。另外,为了在您解释的内容中获得平滑的图像切换和滚动,我相信OpenGL是必需的。
因此我建议将图像加载并解码到一个mmaped内存区域,以便有效地将它们用作OpenGL纹理(有一个android-ndk thread,其中包含有关此内容的详细信息,请参阅this post以及那些跟随)。
答案 1 :(得分:0)
最简单的解决方案是使用更少的照片和/或降低图像分辨率。 您可以以较低的分辨率使用较少的图像,然后当图像停止旋转时,加载高清照片。 200张照片很适合360度照片。
答案 2 :(得分:0)
您可以跳过一些图像并使最近/最近的插值2变形以提供跳过的图像。
旋转停止后,加载正确的图像。这种方式即使是轻微的旋转也是显而易见的(并且因此您可以以更大的粒度旋转。
但这对计算能力的要求更高,因此它的交易。