0

我遇到了一个奇怪的问题 - 我正在制作一个 android 游戏,每隔几秒就会注意到一次延迟,并在我注意到垃圾收集器每隔几秒被调用一次 50-150 毫秒时检查日志。

当我使用一个背景图像(150kb)启动我的标题屏幕活动时,我已经将这个问题缩小到图像 - 我得到的消息是:

4% 空闲 (8009k/8259k) 将堆增长到 9.012MB GC_CONCURRENT 释放 1kb (9178k/9479k)

对于一个图像和三个按钮来说,这是一个很大的堆空间。当我删除图像时,我没有收到任何警告或消息(不确定如何在堆空间上强制输出,但我希望它处于正常水平)

活动图像的代码并不那么令人兴奋,因为它只是一个标题屏幕,但是:

    <ImageView
    android:id="@+id/backgroundImage1"
    android:contentDescription="Image"
    android:src="@drawable/openingscreen" 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="top"
    />

当我启动实际游戏时,堆大小再次增加(仅增加了几 mb)——奇怪的是当我没有标题屏幕时,主游戏的堆空间仍然是 12 mb 左右——所以我'我在想,也许图像是对其他一切的引用。尽管我尝试使用大小为 1 像素的背景图像,但这没有引起任何问题。

其次,gameThread里面的图片代码:

mPlayer = Bitmap.createScaledBitmap(mPlayer, mCanvasWidth / 15, mCanvasHeight / 8, true);

canvas.drawBitmap(mPlayer, xPosition, yPosition, null);

我确实在某处听说缩放位图会导致内存问题,但这并不能真正与其他所有内容相加。

4

3 回答 3

1

是的,很多开发者在开发过程中都遇到过这种情况。

我要你做的是彻底研究检查这个堆到底是什么,垃圾收集器如何处理它,你如何有效地使用甚至缩放位图

您可以先浏览此视频 Google Android Memory Management

接下来在android开发者站点中,详细介绍如何 高效显示位图

最后也是最后一件事是养成使用 MAT(内存分析器工具)的习惯,有很多教程,有很多关于如何使用它以及找出应用程序被剥夺内存的位置和原因的博客

于 2012-08-20T12:10:09.603 回答
0

以下公式告诉您图像占用多少堆空间:宽度 x 高度 x 8 字节。所以一个全白但尺寸很大的图像仍然会占用大量的堆空间。

于 2012-08-20T11:04:26.537 回答
0

刚刚更新,我发现了我的代码中的主要问题并设法让它顺利运行,我怀疑其他人是否愚蠢到犯同样的错误,但我会发布我的解决方案以防万一!

我在游戏的每次迭代中都重新调整了图像的大小,不知何故我没有意识到我把代码放在那里,改变了它,所以它在一开始就重新调整了它们的大小,就是这样。但是就是这样,我怀疑这个解决方案会帮助任何人,但也许有一天它会!

凯文。

于 2012-08-21T11:18:33.990 回答