我创建了一款Android游戏,它使用了一些全屏位图(4 @ 800x480)和10个精灵(约80x80),所以它并不是特别大。这款游戏在旧款HTC Desire上运行得非常不错,配备100mb免费内存和25mb免费存储空间。它在几款高端HTC手机,摩托罗拉XOOM平板电脑,Nexus 5,Nexus 7和几款Archos / Arnova平板电脑上运行良好。但是,当我在三星设备(目前是三星Galaxy Tab 2.0)上运行它时,它会在代码的位图加载区域中出现内存不足错误,这只能通过在android清单xml中将大堆请求设置为true来解决。这是一个令人发指的事情,因为除非我在Play商店中创建一个单独的应用程序,否则必须在所有设备上设置。我最初认为这可能是由于图像是从可绘制区域加载的,所以将其更改为资产但没有区别。还有其他人遇到过这个问题并找到了解决方法吗?
失败的行是: -
retBitmap = BitmapFactory.decodeStream(res.getAssets().open(name+".png"));
或
retBitmap = BitmapFactory.decodeResource(res, res.getIdentifier(name, "drawable", con.getPackageName()));
根据我是从资产还是从drawable加载,我之前也尝试过使用此选项: -
BitmapFactory.Options options = new BitmapFactory.Options(); options.inPurgeable = true;
但没有区别。有什么想法吗?
答案 0 :(得分:0)
使用options.inSampleSize = 2
;
答案 1 :(得分:0)
尝试不在单个UI事件中加载位图。 正如我所检查的那样 - android可以增加UI事件之间的应用程序堆大小。
您可以使用一些自定义解决方案以异步方式实现应用程序数据初始化实体,并显示一些初始化屏幕(例如,带有一些动画) - 通常的做法。
例如,您可以使用Runnable序列加载一组位图,并在加载最后一个资源后通知应用程序应用程序数据加载完成事件。
initHandler.post(new Runnable() {
void run() {
/* load bitmap */
/* post new runnable if not all bitmaps loaded */
/* in other case notify user about loding finished */
});
要检查此方法 - 使用next命令并分析本机堆大小:
adb shell dumpsys meminfo com.your.package.name
您可能知道 - android将位图数据存储在本机缓冲区中(从某个版本开始)。
我相信异步位图加载可能会解决您的问题。