Tho*_*alc 11 android garbage-collection android-layout android-view
我遇到了一个非常奇怪的现象(测试设备:HTC Desire HD,Android 2.3.5).我知道这System.gc()是不必要的和沮丧的,我不会尝试另外建议,但关键是它不应该引起问题(即它最多应该是无用的).
我有一个GLSurfaceView在其视图层次结构中包含a的应用程序.该GLSurfaceView实例化和增加Activity.onCreate().通常,应用程序的工作方式如下:
GLSurfaceView来View.VISIBLEGLSurfaceViewActivity.finish()被调用)我Activity.onPause()看起来像这样:
mGameThread.pause(); // gameThread is my custom thread class for the in-built game
mGLView.onPause(); // pause the renderer thread
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利,一切正常.但是,在我添加以下代码后出现问题onPause()(对于用户从主菜单退出游戏的情况):
mGameThread.pause(); // gameThread is my custom thread class for the in-built game
mGLView.onPause(); // pause the renderer thread    
if (isFinishing()) {
    System.gc();
}
Run Code Online (Sandbox Code Playgroud)
详细说明:如果Activity是第一次启动(=即之前的应用程序进程不存在),一切正常.但是,从活动的第2次开始(=从主菜单第一次退出之后,即第一次退出之后Activity.finish()),GLSurfaceView的帧率降低了40-50%,内置游戏变慢.
如果我删除了System.gc()呼叫,问题就会消失.而且,如果我执行以下操作,它也可以解决问题:
mGameThread.pause(); // gameThread is my custom thread class for the in-built game
mGLView.onPause(); // pause the renderer thread
if (isFinishing()) {
    // 1. get layout root of View hierarchy
    // 2. recursively remove (detach) all Views
    // 3. call GC
    System.gc();
}
Run Code Online (Sandbox Code Playgroud)
我没有添加具体代码,因为它很复杂,所以我使用了注释.如果我只是拆下GLSurfaceView通道removeView(),那还不够.需要清除整个视图层次结构.
请注意,我找不到任何内存泄漏(通过drawables/statics等没有Activity泄漏).此外,当然,当应用程序关闭时,gameThread会正常退出(我只是没有包含其源代码).
任何想法,猜测?显然,System.gc()似乎会导致Android的Activity/layout破坏机制出现一些问题.再说一遍,正如我所说,如果我删除System.gc(),问题就会消失.
我有Android游戏编程的经验.我曾经清除过层次结构中的所有视图,因为在运行线程时如果调用System.gc(),有时会发生您的线程对某些视图的引用,即使您调用system.gc()此视图也不会如果你一直在玩这个游戏,你会注意到你的堆内存开始增长.
这取决于内存泄漏,如果你泄漏一些KB内存,将需要更多的时间来崩溃你的游戏.它是使用Eclipse Memory Anlyser(Eclipse MAT)并比较堆栈的最佳方式.
Step1: 第一次开始游戏时 拍摄记忆快照Step2:第二次开始游戏时记忆快照 Step3: 现在比较两堆快照,它会告诉你区别.
这是一个非常有用的工具.我的游戏Apache Attack中存在巨大的内存问题.我使用这个很棒的工具修复它们.关注这个ECLIPSE MAT TUTORIAL
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           2661 次  |  
        
|   最近记录:  |