我的游戏应用程序存在某种内存问题。当我第一次运行它时,启动画面活动工作,关卡选择活动工作,然后游戏模式工作,我可以毫无问题地玩很多关卡。然后我退出游戏。然后第二次运行应用程序时,我得到一个OutOfMemoryError:位图大小超过VM预算,甚至在我看到启动画面之前。
我的应用程序基于一个名为SD_globals的应用程序,如下所示:
public class SD_Globals extends Application
{
int example_global_data = 99;
// stuff
}
和五个单独的活动,每个活动都可以访问SD_Globals中声明的各种全局数据。例如,其中一项活动是SD_gameplay,如下所示:
public class SD_GamePlay extends Activity implements View.OnClickListener
{
SD_Globals gs; // gs stands for global state
gs = ((SD_Globals)getApplicationContext());
// now I can access global variable using code like this:
int x = gs.example_global_data;
}
有关此设置可能出现的错误类型的任何想法都会受到欢迎 - 尽管这不是我的具体问题。
我已经阅读了一些关于使用DDMS和内存分析器来帮助诊断问题的内容,但有一件事我不清楚是什么时候按下“转储HPROF文件”按钮以获取最有用的信息。应该是在我的比赛还在比赛中,或者在我退出比赛之后(但在第二次比赛之前)还是在比赛结束后?
编辑:为了回应Akhil的回答,我将澄清我在每个单独活动的onCreate方法中使用getApplicationContext()一次,而不是其他任何实例。我还应该说,这个一般的应用程序结构(gs = ((SD_Globals)getApplicationContext())
)已经在我的游戏的旧版本中运行得非常强大,这个版本已经上市了几个星期,并且有30,000次下载和零OutOfMemoryError报告回到Google Play。
答案 0 :(得分:1)
从不使用getApplicationContext()。它正在使你的资产应用程序作为范围,它们没有得到回收。坚持你可以像活动一样提供最狭窄的环境。改变它的所有出现。
由于这是一款游戏,我假设您使用的是位图。当他们所属的活动被破坏时,你回收它们(确保你将活动用作上下文而不是整个应用程序)。
你将需要定期从hprof转储堆(每个活动可能2-3个)。因此你可以看到内存泄漏的原因通过比较堆来与你分享时间。
这是我能提供的一般答案,因为这个问题是理论上的。