【问题标题】:Why is Samsung Galaxy S6 (Lollipop) allocating 4 times the memory of older devices for bitmaps为什么三星 Galaxy S6 (Lollipop) 为位图分配 4 倍于旧设备的内存
【发布时间】:2016-11-18 03:18:51
【问题描述】:

我刚开始在新的三星 Galaxy S6 上测试我的游戏应用。它不断崩溃,日志中出现内存不足错误。我的应用程序通常使用大约 215M,并且在 Galaxy S4 mini、Galaxy Tab S3 和 Galaxy Tab S4 上运行良好,它们分别有 256+M、512+M 和 512+M 的堆。 Galaxy S6 有一个 536M 的堆。在将位图大小减少到可以让 Galaxy S6 运行该应用程序的位置后,我在设备监视器上获得了以下内容,以便对各种设备进行堆使用。

Galaxy S4 mini、Galaxy Tab S3 和 Galaxy Tab S4:

银河 S6(棒棒糖):

为什么较新的设备使用的堆是其他设备的 4 倍?

【问题讨论】:

  • 您是否分配了相对于设备屏幕尺寸大小的位图?愿意分享一些您认为有问题的代码吗?
  • 图片来自哪里?如果它们是可绘制资源,您将它们放在哪个目录(或多个目录)中?
  • 你有一个大小为 375 MB 的 1 字节数组,Android 将 Bitmaps 存储在一个字节数组中。看看这个gokhanarik.com/android-background-image-high-memory-usage-issue
  • 我使用 bmp_stars[0] = BitmapFactory.decodeResource(getResources(), R.drawable.starst0,options);
  • 我使用 bmp_example = BitmapFactory.decodeResource(getResources(), R.drawable.example,options);用于解码位图。我根据设备堆大小更改选项值。查看您的回复(特别感谢有关屏幕分辨率记忆效应 Gokhan 的文章),我预计该错误是由于 S6 的屏幕密度增加:2-3 取决于屏幕宽度 1920 的运行(不要问我为什么) screenHeight 1080。相比之下,galaxy S4 min 的密度为 1.5,screenWidth 为 960 screenHeight 540。下一个项目是如何修复屏幕密度的代码。

标签: android android-5.0-lollipop android-bitmap


【解决方案1】:

事实证明问题是在设备端完成的,在此处支持不同屏幕尺寸的文档中未提及:http://developer.android.com/training/multiscreen/screensizes.html。根据 Gokhan Arik 的一篇富有洞察力的文章,“Android 背景图像高内存使用问题”http://gokhanarik.com/android-background-image-high-memory-usage-issue/,引用了 CommonsWare 对类似于我的问题的回答:Why does my 160kb app background become 49 MB at run time?,高密度设备将调整存储在通用“ drawable' 文件夹到更大的大小以匹配更高的屏幕分辨率,在我的例子中是 4 倍。

简单的解决方案是将我所有的位图(大小为数百 KB)放入名为“drawable-nodpi”的文件夹中,并删除旧的“drawable”文件夹。我希望在我最终买得起密度 3 的设备进行测试之前知道这个问题。

我最近发现的一个缺点是,当您没有针对不同屏幕密度的多个可绘制文件夹时,Google Play 将不再认为您的设备是“专为平板电脑设计的”。令人难以置信的是,您可能必须创建空的才能不丢失此名称。

【讨论】:

    猜你喜欢
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    相关资源
    最近更新 更多