我遇到了一个奇怪的问题 - 我正在制作一款安卓游戏,并且每隔几秒就注意到一个延迟并检查日志,当我发现每隔几秒就会调用垃圾收集器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);
我确实听说过缩放位图可能会导致内存问题,但这并不能完全解决其他问题。
答案 0 :(得分:1)
是的,许多开发人员在开发过程中遇到了这种情况。
我要求你做的是彻底研究这个堆是什么,垃圾收集器如何处理它,如何有效地使用甚至缩放位图
您可以先阅读此视频 Google Android Memory Management
接下来在Android开发者网站中详细介绍 Displaying bitmaps efficiently
最后和最后的事情开始使用MAT(Memory analyzer Tool)的习惯,有教程,许多博客如何使用它,并找出应用程序被剥夺内存的位置和原因
答案 1 :(得分:0)
下面的formular告诉你图像占用了多少堆空间:width x height x 8 bytes。因此,所有白色但大尺寸的图像仍然会占用大量的堆空间。
答案 2 :(得分:0)
刚刚更新,我发现了我的代码中的主要问题并设法使其顺利运行,我怀疑其他人是否愚蠢到犯同样的错误但我会发布我的解决方案以防万一!
我在游戏的每次迭代中都重新调整了我的图像大小,我不明白我把代码放在那里,改变了它,所以它在一开始就重新调整它们的大小就是这样。但就是这样,我怀疑这个解决方案会对任何人有所帮助,但也许有一天会有所帮助!
凯文。