Android 为什么三星Galaxy S6(棒棒糖)为位图分配的内存是旧设备的4倍

Android 为什么三星Galaxy S6(棒棒糖)为位图分配的内存是旧设备的4倍,android,android-5.0-lollipop,android-bitmap,Android,Android 5.0 Lollipop,Android Bitmap,我刚开始在新的三星Galaxy S6上测试我的游戏应用程序。它不断崩溃,日志中出现内存不足错误。我的应用程序通常使用215M左右,并且与Galaxy S4 mini、Galaxy Tab S3和Galaxy Tab S4配合良好,它们的堆分别为256+M、512+M和512+M。S6星系拥有536米的星系堆。在将位图大小缩减到可以让Galaxy S6运行应用程序的位置后,我在设备监视器上获得了以下内容,以供各种设备的堆使用 Galaxy S4迷你版、Galaxy Tab S3和Galaxy Ta

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

Galaxy S4迷你版、Galaxy Tab S3和Galaxy Tab S4:

银河S6(棒棒糖):


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

事实证明,问题出在设备端,而在支持不同屏幕大小的文档中没有提到:。Gokhan Arik在《Android背景图像高内存使用问题》(Android background image high memory usage issue)上发表了一篇有见地的文章,其中引用了一个与我类似的问题的通用软件答案:高密度设备将把存储在通用“drawable”文件夹中的图像大小调整到更大的尺寸,以匹配更高的屏幕分辨率,在我的例子中是4倍

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


我最近发现的一个缺点是,当你没有几个不同的屏幕密度的文件夹时,谷歌播放将不再考虑你的设备是为平板电脑设计的。因此,令人难以置信的是,您可能必须创建空屏幕才能不丢失此名称。

事实证明,问题在于设备端正在执行某些操作,但在支持不同屏幕大小的文档中没有提到:。Gokhan Arik在《Android背景图像高内存使用问题》(Android background image high memory usage issue)上发表了一篇有见地的文章,其中引用了一个与我类似的问题的通用软件答案:高密度设备将把存储在通用“drawable”文件夹中的图像大小调整到更大的尺寸,以匹配更高的屏幕分辨率,在我的例子中是4倍

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


我最近发现的一个缺点是,当你没有几个不同的屏幕密度的文件夹时,谷歌播放将不再考虑你的设备是为平板电脑设计的。因此,令人难以置信的是,您可能必须创建空位图才能不丢失此名称。

您是否分配了与设备屏幕尺寸相关的位图?想分享一些你认为有问题的代码吗?图片来自哪里?如果它们是可绘制的资源,您将它们放在什么目录中?您有大小为375 MB的1字节数组,Android将
位图
存储在字节数组中。检查这个,我使用bmp\u stars[0]=BitmapFactory.decodeResource(getResources(),R.drawable.starst0,options);我使用bmp_example=BitmapFactory.decodeResource(getResources(),R.drawable.example,options);用于解码位图。我根据设备heapsize更改选项值。看看你的回答(特别是感谢关于屏幕分辨率记忆效果Gokhan的文章),我认为错误是由于S6:2-3的屏幕密度增加,这取决于屏幕宽度1920屏幕高度1080的运行(不要问我为什么)。相比之下,星系S4分钟的密度为1.5,屏幕宽度为960,屏幕高度为540。下一个项目是如何修复屏幕密度的代码。您是否在分配位图,其大小与设备屏幕的尺寸有关?想分享一些你认为有问题的代码吗?图片来自哪里?如果它们是可绘制的资源,您将它们放在什么目录中?您有大小为375 MB的1字节数组,Android将
位图
存储在字节数组中。检查这个,我使用bmp\u stars[0]=BitmapFactory.decodeResource(getResources(),R.drawable.starst0,options);我使用bmp_example=BitmapFactory.decodeResource(getResources(),R.drawable.example,options);用于解码位图。我根据设备heapsize更改选项值。看看你的回答(特别是感谢关于屏幕分辨率记忆效果Gokhan的文章),我认为错误是由于S6:2-3的屏幕密度增加,这取决于屏幕宽度1920屏幕高度1080的运行(不要问我为什么)。相比之下,星系S4分钟的密度为1.5,屏幕宽度为960,屏幕高度为540。下一个项目是如何修复屏幕密度的代码。