【问题标题】:Android - background images take too much memoryAndroid - 背景图像占用太多内存
【发布时间】:2012-01-23 16:37:46
【问题描述】:

在我的游戏中,我有 3 个活动:主菜单 -> 子菜单 -> 游戏屏幕。因此,当用户在 Game 屏幕中玩游戏时,前两个 Activity 处于非活动状态,但并未被销毁。

每个布局都有一个漂亮的背景图片。图像本身很小(40k),但在大屏幕上(比如 Galaxy 平板电脑),它会占用几兆内存。 从前两个活动中删除背景后,第三个活动的内存使用量从 18M 下降到 13M!

有没有办法保留背景并恢复所有这些浪费的内存?

【问题讨论】:

标签: android memory view background


【解决方案1】:

由于布局中的背景图像,我遇到了类似的问题。图像内存分配的正常大小应该是高*宽*4 字节(在 ARGB_8888 模式下,默认模式)。

如果您在显示活动时看到并分配了 18MB,则一定有问题。检查您是否将背景图像放置在可绘制文件夹中。在这种情况下,系统必须将该图像缩放到特定的屏幕密度,从而导致很大的内存开销。

解决方案:

  1. 在每个可绘制文件夹(mdpi、hdpi、xhdpi...)中放置特定版本的背景图像,这样系统就不必执行任何缩放过程。
  2. 将背景图像放在一个名为“drawable-nodpi”的特殊资源文件夹中。系统不会尝试缩放放置在此目录中的图像,因此只会执行拉伸过程并且分配的内存将是预期的。

更多信息在answer

希望这会有所帮助。

【讨论】:

  • 嗨,这是我搜索了几天的解决方案。我已经缓存了图像,对其进行解码,但除此之外它们都不起作用。多谢。只需将高分辨率图像添加到 xxhdpi 文件夹
【解决方案2】:

开始新活动时为什么不完成以前的活动(C)。 然后可以重写activity C中的onKeyDown方法来启动上一个activity(B)

【讨论】:

  • 启动C时如何完成B?我的意思是我应该把 C.finish() 放在代码的什么地方?
  • 没有人..在开始新活动的意图之前调用finish()
【解决方案3】:

我认为我的问题和你的一样,这个解决方案会帮助你。

Why does the normal pictures allocated a lot of memory?

可以使用/res/drawable-nodpi,背景图片只占内存的一半。

【讨论】:

    【解决方案4】:

    我建议在您的活动中覆盖 onPause() 或 onStop()。在那里,您可以释放背景(通过调用 layout.setBackgroundDrawable(null))

    【讨论】:

    • 您可以随时添加对 System.gc() 的显式调用。还要确保您的活动本身不再引用背景图片。
    猜你喜欢
    • 2012-05-25
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2015-04-13
    • 2015-10-14
    • 2013-07-18
    相关资源
    最近更新 更多