使用THREE.js场景的UIWebView Javascript垃圾回收

3
我正在使用THREE.js开发一款游戏,该游戏将在iOS8应用程序内的UIWebView中运行。我已经在Chrome开发工具中进行了应用程序分析,并确保没有内存泄漏 - 也就是说,内存使用量达到一定值后保持不变。但是,在UIWebView中运行该应用程序却显示出内存使用量随时间增长,好像根本没有垃圾回收。
我在网上搜索过,但无法确定iOS8的UIWebView是否有垃圾回收功能。有些文章似乎表明它有,而有些则表示没有。如果确实有-我如何触发它?
此时,我能想象的唯一解决方案(如果没有垃圾回收)是定期杀死/释放UIWebView,并重新启动应用程序(在菜单屏幕上的一个游戏)。
更新:经过几天的泄漏查找,这是我发现的情况:
释放UIWebView无效-系统从未完全释放(即使采用所有建议的黑客方法),并且内存问题会复合。
我仍然不知道UIWebView是否有标记/扫描垃圾回收-Profile/Instrument面板似乎表明它有,但内存使用量很少下降。常识告诉我,一定会发生一些垃圾回收,因为代码中的所有临时对象和超出作用域的东西都会被清除。
我的THREE.js对象似乎从未被收集-但这可能与THREE.js自己的问题有关,必须手动处理资源(以释放任何GL相关的句柄等)。
有关.bind(this)的神秘泄漏-例如,setTimeout(object.func.bind(object),100)-似乎永远不会在timeout发送后清除该函数-因此我最终选择预先绑定并将其存储为变量。同样适用于传递给jQuery的任何事件处理程序。
我的两个场景游戏(菜单场景和游戏场景),我最终改写了它们的方式,使得两个场景保留在内存中(从不被删除)。我在游戏中创建的任何对象和模型,而不是依赖于GC进行收集,而是进行回收。当对象从场景中移除时,它们被放入具有相同类型对象池中,以便再次需要场景中的该对象时重新初始化和添加。一开始看起来可能有点过头了,但好处是没有内存泄漏(对象保持分配),并且更快地创建/添加到场景中。

遇到同样的问题!您能发一下您代码的示例吗?希望有人能回答这个问题。 :) - だらんぎん じょん
2个回答

1

内存会增长是因为由于HTTP缓存策略,一些资源被缓存在内存中。所以如果内存不会无限增长,就不必担心。


1
很不幸,它确实会无限增长。每次我在游戏中从菜单切换到游戏并返回时,它会增加约4MB。 - Kirill E.

1
你看到的可能是iOS8中垃圾回收器无法释放内存的错误。我在这里发布了相关信息:PhoneGap在iOS8中比iOS7使用更多内存
如果可以,请向苹果报告此错误,以便在下一个操作系统版本中修复。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接