2

现在我正在用 Android (OpenGL ES 1.1) 开发一个游戏,我看到每当我创建一个新的 SurfaceView (GLView) 时,它的线程就会被创建。没关系。当我想完成包含 SurfaceView 的 Activity (并返回菜单)时,问题就来了。似乎没有释放活动,因为每个 GLThread 都在引用它。这可能会以 OOM 错误结束。

一些MAT图片:

MarkitActivity 表示处理 SurfaceView 的 Activity 的每个实例

内存中所有活动的列表

GC 举办的活动是什么

第一张图:MarkitActivity 代表了处理 SurfaceView 的每个单独的 Activity 实例。

第二张图:内存中所有活动的列表。

第三张图:GC的活动是什么。

如果需要任何代码,我会发布它。尽管如此,我已经尝试过以下事情:

->活动上下文对渲染器和表面视图的弱引用。

-> 应用程序上下文而不是活动上下文(在正常和弱模式下)。

-> 试图停止(以一种艰难的方式)线程(中断)并等待加入(程序做了什么,但线程不在乎,它仍然存在......)

->尝试不调试,以防在调试器模式下值发生变化(MAT 图片没有调试器)。

-> 尝试将 Activity 作为单实例模式。到处都是奇怪的结果和错误。

->onPause 和 onResume 为视图正确控制。

任何提示、想法、问题或帮助将不胜感激。提前致谢!

卡洛斯。

4

1 回答 1

0

我在线程方面遇到了类似的问题(但不使用 OpenGL),最终使用一个简单的技巧解决了它。

在退出活动之前(在onPause()or中onStop(),尝试像这样将线程归零:

myThread = null;

似乎它使ThreadGC 可收集,因此您的活动也变得可收集。

它对我有用,也对我提出相同建议的一些有类似问题的人有用。

问候。

于 2012-11-13T22:14:42.890 回答