Android 如何在不使用太多内存的情况下绘制和更改背景?

Android 如何在不使用太多内存的情况下绘制和更改背景?,android,background,Android,Background,我已经创建了一个简单的测试游戏,随机生成在屏幕上移动的图标。当你点击一个图标时,它就会消失。我使用了SDK和各种互联网站点的示例代码 我想更改背景,背景设置为黑色。我想用我的照片 public void onDraw(Canvas canvas) { canvas.drawColor(Color.BLACK); ... } 背景色在onDraw上设置。如果我尝试绘制位图,游戏最终会因内存问题而崩溃。(内存不足)。我相信这是因为每次调用onDraw时都会绘制图像 我试着把它放在不

我已经创建了一个简单的测试游戏,随机生成在屏幕上移动的图标。当你点击一个图标时,它就会消失。我使用了SDK和各种互联网站点的示例代码

我想更改背景,背景设置为黑色。我想用我的照片

 public void onDraw(Canvas canvas) {
       canvas.drawColor(Color.BLACK);
...
}
背景色在
onDraw
上设置。如果我尝试绘制位图,游戏最终会因内存问题而崩溃。(内存不足)。我相信这是因为每次调用
onDraw
时都会绘制图像

我试着把它放在不同的地方,但也许我只是错过了一些东西。任何帮助都会很好。下面是我用来创建背景的代码。我的理想目标是一开始只创建一次背景。并且能够在需要时进行更新

 Bitmap Background = BitmapFactory.decodeResource(getResources(),R.drawable.background);
 DisplayMetrics dm = new DisplayMetrics();
 getWindowManager().getDefaultDisplay().getMetrics(dm);
 int height = dm.heightPixels;
 int width = dm.widthPixels;
 Rect rec = new Rect(0, 0, width, height);
 canvas.drawBitmap(Background, null, rec, null);

每次调用BitmapFactory.decodeResource()时,我相信您都会得到一个新的位图对象。这意味着一个新的字节[]。每次调用绘图时,都会分配另一个字节数组。在位图上调用recycle()以表示此字节[]可以释放,这一点很重要。因此,在当前实现中,在draw之后只需调用Background.recycle()


这不是一个立即解除锁定,因此您可能会遇到一些性能问题。因此,您可能还希望将单字节数组保留在内存中。如果没有更多关于应用程序中发生这种情况的细节,就很难给出如何做到这一点的建议。但是,如果此代码位于特定组件的draw()方法中,只需在组件的构造函数中创建位图并在draw()方法中使用它即可。然后,在忘记组件之前,请确保在位图实例上调用循环。

< P>除了格雷戈发布的另一件事外,还有Android处理方向更改的方式。每次更改屏幕方向时,您的活动都将被销毁,然后重新创建。如果未采取适当的预防措施,也可能导致内存泄漏

看看:

当我添加recycle命令时,它确实阻止了它崩溃。不幸的是,这使得游戏运行非常缓慢。我决定修改密码。并将新位图代码作为公共文件放置在onDraw之外。看来它成功了,游戏运行平稳,没有崩溃。谢谢大家的帮助。