在Android OpenGL ES中杀死僵尸glthreads



我在Android的游戏应用程序中遇到了一个openGL问题。主要game活动具有OpenGL ES动力图形。每当玩家失去游戏时,单击back按钮等。他将返回地图选择UI,该地图不具有任何OpenGL元素。

该错误看起来有点不确定,但是称这些方法多次停止game活动,然后再次重新启动game,导致多个Glthreads弹出并且永远不会被销毁。这些仍然是僵尸线程和伤害性能。在多个play-> back循环后,AndroidDeviceMonitor显示main线程,thread(这是一个线程I i Spawn and Control),大约有20 GLThread s,其中只有一个有意义的工作,但其他人也称为object.weat.weat()等。

我无法访问OpenGL线程,它们是由Glrenderer产生的;另外,我没有看到可能对这些的参考的位置,因为我在任何给定时间只有一个渲染器。我找到了这个话题,但是唯一的答案无济于事。

从OpenGL活动返回后,我该如何杀死它们/阻止它们泄漏?

经过更痛苦的调查,我发现垃圾收集器通常确实会处理这些线程。但是,如果您做的更复杂的事情,很容易抛弃一些参考。就我而言,GlsurfaceView不是唯一的表面视图,我将其插入一个相对布局,例如

setContentView(R.layout.activity_game);
RelativeLayout layout = (RelativeLayout) findViewById(R.id.activity_game);
layout.addView(gameEngine.getSurfaceView(), 0);

这显然会导致参考文献即使在活动完成后仍保留。修复程序是在销毁活动

时手动从层次结构中"解开" glsurfaceview
@Override
public void onDestroy() {
    super.onDestroy();
    RelativeLayout layout = (RelativeLayout) findViewById(R.id.activity_game);
    if (layout != null) {
        layout.removeView(gameEngine.getSurfaceView());
    }
}

edit :在进行更多测试之后,我发现该解决方案朝正确的方向,布局也必须在 onStop方法中取消键 - 这是当活动剩下时所谓的通常情况下。onDestroy仅在设备停止活动时才发生,例如由于缺乏内存而停止活动。最后,由于仅按下电源按钮或在活动之上打开Facebook Messanger,因此无法从onStop中寄出活动,因此无法告诉onStop。因此,在onRestart中,您需要将GLSurfaceView插入结构中,以便该应用在被其他操作暂停后正确工作。

最新更新