gpt4 book ai didi

android - 在 Android 中加载大量和大图像

转载 作者:搜寻专家 更新时间:2023-11-01 07:36:08 25 4
gpt4 key购买 nike

我有一个问题:(否则我不会在这里 ;)

我正在创建一个具有显示“3D”模型功能的应用程序。这部分实际上是从多个角度拍摄的图像的集合,允许用户“旋转”“模型”。这个想法很好,但是问题出在图片的加载上。

我发现有两种方法:

  1. 将所有图像加载到内存中,然后简单地将它们切换到正确的角度。
  2. 根据需要加载图像 - 我们可以提前加载一些。

但是这些有问题:

  1. 如果幸运的话,这些图像会适合内存,但事实并非如此。它们每个大约 1.5-2MB,每个模型大约有 75-100 张图像。这使总大小至少达到 115MB 左右。
  2. 如果幸运的话,图像的加载速度会比用户“旋转”的速度快,但他们没有。用户可以轻松切换到尚未加载的角度,从而导致黑屏几秒钟。

我创建了一个加载器,它允许我简单地将我需要的图像添加到堆栈中,然后加载器将一个接一个地加载图像。如果用户滚动得相当慢,这会很好地工作。我的加载器负责在完成时释放内存,因此无论我加载多少图像,只要我指定要在内存中存储的最大图像数,应用程序通常都不会崩溃。我的加载器可以非常快速地加载图像,但它仍然需要几毫秒(~250 毫秒)才能将大图像加载到内存中。当然,加载器在不同的线程上,加载不会影响 UI 响应。这就是为什么如果用户快速来回滑动,实际上不会显示任何图像,因为加载和卸载都在同时进行,导致没有图像:)

那么,我的问题是:如何在不将所有图像加载到内存中的情况下提供平滑且用户满意的图像旋转?

最佳答案

不要加载(或存储)您不需要的分辨率。如果您的用户需要缩放,内存不足的二进制图像金字塔 是一种让您仅加载必要缩放级别的廉价方法。如果您的用户需要平移大于显示区域的图像,您可以将大图像分成较小的图 block ,并仅加载您需要的图 block 。

如果您想要更有趣,您可以编写一个 UI 感知缓存管理器来抢先加载您认为您可能很快需要的图 block ,并标记您非常确定您会赢的图 block 不需要尽快抢占。

更好的压缩可以将更多图像数据放入内存,并加快加载时间。所以,注意单独的图片压缩,不要加载你不需要的图片质量。

作为一种特殊的措施:由于从略微不同的角度拍摄的图像彼此相似,您可以通过表示差异来节省时间和空间,而不是 - 查看光场压缩。您仍然需要将压缩形式转换为可以绘制的特定位图,但如果压缩允许数据集保留在内存中,您可能会获得很大的速度。

如果您无法将压缩后的数据集放入内存,用户很有可能能够快速来回滑动以破坏您的缓存。因此,如果平滑度是您的主要目标,您可以通过将旋转速率(或每次滑动旋转范围?)限制为数据加载器可以遵循的值来尝试“UI 解决方案”。

关于android - 在 Android 中加载大量和大图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11040255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com