【发布时间】:2014-05-23 18:52:53
【问题描述】:
希望有人能帮我解决这个问题。
我在 android 4.2.2 上制作了一个非常简单的游戏,仅使用 UI 元素,即没有 3D,opengl,这确实是一个挑战,但我遇到了一点头痛。
我在加载图形时遇到了 O.O.M 问题(在 android 中是预期的),所以我寻找其他路线并找到位图工厂并决定使用一个简单的实现。对于我的图像,我在玩游戏期间达到了高达 40mb 的分配内存,所以我将文件从 1080x1920x4bit 减少到 540x960x4bit 以希望减少内存负载,但现在它在玩游戏期间达到了 72mb。
是我遗漏了什么还是我在想,将图像大小减半并将内存使用量减半?还是升级使用更多?
有什么办法可以将这个内存量减少到一个不错的 16-20mb 范围?
APP上的注意事项。 所有图像都存储在 res/no-dp 或 res/xxdpi 中。而且都是jpeg。
我有 6 个 100x100dp jpeg 的弹出图像和 5 个 50x50dp 的生活片段
这是我用来从位图工厂加载图像的代码
Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.dummy1nn);
button7.setImageBitmap(bMap);
我现在通过按钮或图像视图将其他图像作为背景资源加载。
我还在元素和计时器上运行 soundpool。
任何帮助将不胜感激。我不想发布我所有的代码,因为它现在一团糟,因为我尝试了许多不同的方法来让它顺利运行。我唯一的问题是内存负载。
运行游戏并让它静置 5 分钟后,我当前的记忆是:- 堆大小 - 73.086mb 已分配 - 70.40mb 免费 - 2.625mb 使用 - 96.41% 对象 - 47,161
我使用 LG Nexus 5 'hammerhead' 作为 DEV 设备,带有解锁的引导加载程序和 stock rom。
谢谢各位。 :)
编辑: 答案是使用毕加索,虽然那里有一些图像库,但我非常喜欢毕加索的简单性。并且在使用图像时始终使用 MAT 对质量/尺寸和格式进行相关更改以获得最低的内存打印(我的峰值降至 26mb) 玩得开心
【问题讨论】:
-
我第一次听说毕加索,它真的有效还是只是对现有方法的包装/重新实现?你以前用过吗?对保存的内存有任何想法吗?感谢您的快速回复:)
-
毕加索很棒。使用毕加索,您可以节省内存,因为它会动态调整正在加载的位图,使其仅适合您将其放入的视图。所以它不会加载可能需要 20 MB 内存的 4000x3000 jpeg,只是将其放入 200x200 ImageView。它还为您处理缓存和异步加载。
-
这似乎很理想,我现在正在玩它,只是在为正确的使用而苦苦挣扎,哈哈,我现在正在使用它,但它抱怨上下文不能为空。 “Picasso.with(context).load(R.drawable.dummy1n).into(button7);”我确定还有更多内容,但我正在努力寻找适合本地文件使用的体面的 tut,我导入上下文是否正确?并设置为私有上下文?
-
Picasso.with(this).load(R.drawable.dummy1nn).fit().into(button7);从您的活动中调用类似的内容。上下文可以只是你的活动,即this,当你从你的活动中调用它时。
标签: android memory bitmapfactory