我一直在网上搜索这个。我似乎无法找到正确的事情。
我们使用“开始Android游戏”一书制作了一款2D滚动Android游戏。到目前为止,事情进展顺利但是当我们添加了很多位图时,游戏在所有设备上都崩溃了。所以我们删除了位图,它运行在姜饼,蜂窝和软糖设备上。但它在ICE CREAM SANDWICH设备中并没有真正起作用,我感到很沮丧。
希望你能帮助我。
这是logcat错误:
09-23 11:22:54.866: E/AndroidRuntime(3525): java.lang.OutOfMemoryError
09-23 11:22:54.866: E/AndroidRuntime(3525): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
09-23 11:22:54.866: E/AndroidRuntime(3525): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:483)
09-23 11:22:54.866: E/AndroidRuntime(3525): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:549)
09-23 11:22:54.866: E/AndroidRuntime(3525): at framework.implementation.AndroidGraphics.newPixmap(AndroidGraphics.java:49)
09-23 11:22:54.866: E/AndroidRuntime(3525): at game.LoadingScreen.update(LoadingScreen.java:27)
09-23 11:22:54.866: E/AndroidRuntime(3525): at framework.implementation.AndroidFastRenderView.run(AndroidFastRenderView.java:48)
09-23 11:22:54.836: E/dalvikvm-heap(3525): Out of memory on a 3840016-byte allocation.
增长堆上升到33.98MB
答案 0 :(得分:1)
1.实际上,您正在使用大部分时间图像。在ororid图像由Bitmap处理,因此这些位图将消耗更多的“堆内存”,因为每次更改图像时都会创建更多的位图对象。所以我们必须使用“对象池方法”来避免java.lang.OutOfMemoryError异常。
这是链接,如何创建对象池。
2.在4.X Android版设备中,您可以在“设置”中看到“开发者设置”。在开发人员设置中,您必须启用“不要保留活动”,这将尽快销毁后台的所有活动。
在这种情况下,您的应用活动不应该崩溃,如果崩溃您的活动不遵循Android活动生命周期。
有关您的推荐,请点击链接:http://developer.android.com/training/basics/activity-lifecycle/index.html
答案 1 :(得分:0)
重新使用BitmapFactory实例,不要为您使用的每个图像创建一个新实例。
在调用带有InputStream参数的decodeStream之后,您应该释放此类的具体实现中的所有资源。在InputStream上直接调用close不会做任何事情。
答案 2 :(得分:0)
尝试在更新方法之外加载你的资产,就像在构造函数中一样,也许每次更新运行时都会加载,这是deltaTime或framerate或者其他任何重载,我的意思是更新方法通常每秒运行100次每当你调用g.newPixmap()时,它每次都为位图分配内存