【问题标题】:Fastest way to load and display a jpeg on a SurfaceView?在 SurfaceView 上加载和显示 jpeg 的最快方法?
【发布时间】:2011-09-25 11:16:45
【问题描述】:

这是我最后一个问题的后续:Canvas is drawing too slowly

现在我可以更快地绘制图像,但我面临的问题是图像的实际加载时间太长了。

在我正在开发的应用程序中,用户可以连续播放视频帧 (jpeg),就好像他正在实时观看视频一样。我一直在使用BitmapFactory.decodeFile() 在位图中加载每个 jpeg。我无法一次加载所有图像,因为大约有 240 张图像,这会占用我所有的堆空间。我一直在做的是通过单独的线程一次将最多 6 个预加载到一个数组中,以减少每个图像显示所需的时间。

不幸的是,加载一张图片需要 50 到 90 毫秒,我需要每 42 毫秒显示一张图片。有没有更快的方法来加载图片?

为澄清起见,这些图像位于 SD 卡上的一个文件夹中,它们都是 720x480 的 jpeg。我以一半大小对它们进行采样以减少内存使用量。

【问题讨论】:

  • 您是否发现使用内部存储器或使用 png 代替 jpeg 时有什么不同?
  • 我还没有尝试过内部存储器,我想我会试一试。我开始使用 png,但它们比 jpeg 大得多,并且 jpeg 在设备上已经占用了大约 8MB。
  • 使用内部存储器确实似乎快了一点,但对于我正在做的事情来说仍然不够快。我认为我真正需要的是一种在不牺牲质量的情况下存储所有图像的方法。如果我将 inSampleSize 设置为 4,我可以将它们全部存储在内存中,但质量会大幅下降。

标签: java android image bitmap bitmapfactory


【解决方案1】:

我最终做了这与我最初设想的完全不同的事情。它有很多内容,但这里是我如何实现目标的要点:

  1. 所有图像都存储在 SD 卡上并写入一个文件(每个图像占用文件中的 X 个字节)
  2. 使用本机代码读取和写入图像文件
  3. 请求图像时,我使用 JNI 包装器将列表中图像的索引和位图对象 (RGB_565) 传递给本机代码
  4. 本机代码锁定位图表面,将像素数据(作为 uint8_t**)直接写入位图,然后将其解锁
  5. 图像被渲染到屏幕上

通过这种方式,我一次只需要在内存中存储一​​个图像,并且能够绕过垃圾收集(因为位图只创建一次,然后在本地重新填充)。我希望其他人可能会发现此策略有用。

【讨论】:

    【解决方案2】:

    猜你已经尝试了本教程中的所有方法http://www.higherpass.com/Android/Tutorials/Working-With-Images-In-Android/2/ 并选择了最快的。也许调整调整大小可以减少加载时间。

    最好的当然是您根本不必调整图像大小。如果您可以完全控制图像,也许您可​​以尝试将它们打包为 sprite,请参阅文章 http://www.droidnova.com/2d-sprite-animation-in-android,471.html

    【讨论】:

    • 不幸的是,我将不得不调整图像大小,因为现在许多 Android 设备都可以以高分辨率录制视频,但它们的屏幕尺寸更小。我也不能将图像作为资源引用,因为它们实际上是在运行时从设备上的视频文件生成的。我想我可以看到在生成图像时调整它们的大小。
    猜你喜欢
    • 1970-01-01
    • 2017-12-06
    • 2013-03-17
    • 1970-01-01
    • 2021-12-29
    • 2016-05-30
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    相关资源
    最近更新 更多