0

我的游戏应用程序存在某种内存问题。当我第一次运行它时,闪屏活动工作,关卡选择活动工作,然后游戏模式工作,我可以毫无问题地玩多个关卡。然后我退出了游戏。然后我第二次运行该应用程序时,我得到一个 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())我还应该说,这个通用应用程序结构(带

4

1 回答 1

1

除非您确定需要,否则切勿使用 getApplicationContext()。它使您的资产应用程序范围有限,并且它们没有被回收。坚持你可以提供的最窄的上下文,比如一个活动。改变它的所有出现。

由于它是一个游戏,我假设您使用的是位图。当它们所属的活动被破坏时,您是否正在回收它们(确保您将活动用作上下文而不是整个应用程序)。

需要定期从 hprof 中转储堆(每个活动可能 2-3 次)。这样您就可以通过比较相隔一段时间的堆来查看内存泄漏的原因,因为您花时间在应用程序上.

这是我可以提供的一般答案,因为这个问题是理论上的。

于 2012-04-25T10:24:33.713 回答