Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android游戏因GLThread引用而内存泄漏_Android_Opengl Es_Memory Leaks_Surfaceview - Fatal编程技术网

Android游戏因GLThread引用而内存泄漏

Android游戏因GLThread引用而内存泄漏,android,opengl-es,memory-leaks,surfaceview,Android,Opengl Es,Memory Leaks,Surfaceview,现在我正在用Android(OpenGL ES 1.1)开发一个游戏,我看到每当我创建一个新的SurfaceView(GLView)时,它的线程都会被创建。没关系。当我想完成保存SurfaceView(并返回菜单)的活动时,问题就出现了。活动似乎没有被释放,因为每个GLThread都在引用它。这可能会以OOM错误结束 一些图片: 第一幅图:MarkitActivity表示处理SurfaceView的每个活动实例 第二张图片:记忆中所有活动的列表 第三幅图:GC的活动是什么 如果需要任何代码

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

一些图片:

第一幅图:MarkitActivity表示处理SurfaceView的每个活动实例

第二张图片:记忆中所有活动的列表

第三幅图:GC的活动是什么

如果需要任何代码,我会发布它。然而,我已经尝试了以下几点:

->活动上下文对渲染器和surfaceview的引用较弱

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

->试图停止(以一种困难的方式)线程(中断)并等待join(程序执行该操作,但线程不关心,它仍然在那里…)

->在不调试的情况下尝试,以防在调试器模式下值发生更改(MAT图片没有调试器)

->以单实例模式尝试该活动。奇怪的结果和错误无处不在

->onPause和onResume对视图进行了正确控制

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


Carlos.

我在线程方面也遇到了类似的问题(但没有使用OpenGL),最后用一个简单的技巧解决了这个问题

在退出活动之前(在
onPause()
onStop()
中),请尝试按如下方式清空线程:

myThread = null;
它似乎使
线程
GC变得可收集,因此您的活动也变得可收集

这对我和一些有类似问题的人都有效,我也给了他们同样的建议


问候。

嗨,路易斯,谢谢你的快速回答。这里的主要问题是我无法访问线程本身(或者至少无法访问循环和保持其活动的主变量,它位于Android内核中)。我没有使用OpenGL的经验,但您可以尝试将包含线程引用的GL顶级元素(可能是您的GLSURFACHEVIEW或ClearRenderer对象)置零。已经尝试过,线程仍然处于活动状态,因此它仍然具有引用。:(嗨!您找到解决此问题的方法了吗?因为我目前正遇到完全相同的问题(只有在旧版本的Android上,Android 4.2.2有不同的行为)。