我在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
插入结构中,以便该应用在被其他操作暂停后正确工作。