我最近一直在为Android开发游戏。在我的三星S3 Neo + 1.5GB内存,我的应用程序,总共约14MB的图片资产(PNG)。我的应用程序将所有这些PNG加载到Bitmap对象中,当然这些对象存储在RAM中。将所有资源加载到散列映射(Bitmap
)后,其中字符串是assets文件夹中资源的路径,并且Bitmap是加载位图对象。在将所有这些位图缓存到hashmap中之后加载另一个位图后,我得到一个OutOfMemoryError并且应用程序崩溃了。
虽然language: csharp
solution: src/Backoff.sln
install:
- nuget # lets get version number
- nuget restore src/Backoff.sln -Verbosity detailed
- nuget update src/Backoff.sln -Verbosity detailed
对象显然有一些开销,但我看不出14MB的资产是如何溢出虚拟机内存的。
我是否缺少关于android如何管理内存或如何加载位图的内容?有没有办法解决这个问题?
备注:
在Android 5.1.1上运行(在Android 4上使用ART而不是Dalvik VM)不会遇到此错误。 (在相同型号的设备上运行复活混音模式。)
答案 0 :(得分:0)
每个应用内存限制目前可低至16兆字节。如果你有几个大的位图,很容易超过这个限制。
我建议按照此处的说明加载每个位图的缩小/子采样版本:http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
有关在Android中有效使用位图的更多信息:http://developer.android.com/training/displaying-bitmaps/index.html
您可以尝试的另一个选项是使用Android Asset Studio Nine-Patch生成器(https://romannurik.github.io/AndroidAssetStudio/nine-patches.html),这可能会将您的图像降低到每个设备的正确分辨率。很可能您当前的图像分辨率高于必要的分辨率。
答案 1 :(得分:0)
PNG是一种压缩格式,读取Bitmap page似乎表明它存储了未压缩的图像,如位图文件格式(BMP)。尝试将PNG文件保存为BMP文件,并查看将其解压缩所需的内存量。根据位图格式,您可以查看从高度*宽度字节到4倍的内容。