【问题标题】:UIWebView Javascript garbage collection with THREE.js scenesUIWebView Javascript 垃圾收集与三个.js 场景
【发布时间】:2014-11-08 20:52:40
【问题描述】:

我正在使用 THREE.js 开发一款游戏,该游戏将在 iOS8 上的应用程序内的 UIWebView 内运行。

我已经在 Chrome 的开发者工具中分析了这个应用程序,并确保没有内存泄漏 - 也就是说 - 内存使用达到某个值并始终保持不变。

但是,在 UIWebView 中运行此应用程序会发现内存使用量会随着时间的推移而增长,就好像根本没有进行垃圾回收一样。

我在网上搜索过,但无法确定iOS8 UIWebView是否有垃圾回收。有些文章似乎暗示它确实如此,而有些则没有。如果是,我该如何触发?

目前我能想到的唯一解决方案是,如果没有垃圾收集,则定期杀死/释放 UIWebView,并重新创建/重新启动应用程序(菜单屏幕上的游戏)。

更新:

在花了几天时间寻找泄漏后,我发现了以下内容:

释放 UIWebView 不起作用 - 系统永远不会释放所有内容(即使有所有建议的 hack)并且内存问题变得复杂。

我仍然不知道 UIWebView 是否有标记/清除垃圾收集 - Profile/Instruments 面板似乎建议这样做,但内存使用很少下降。常识告诉我必须进行一些垃圾收集,因为代码中的所有临时对象以及超出范围的东西都会被清理掉。

我的 THREE.js 对象似乎从未被收集过 - 但这可能与 THREE.js 自己的问题有关,即必须手动处理资源(以释放任何与 GL 相关的句柄等)

存在与 .bind(this) 相关的神秘泄漏 - 示例 setTimeout(object.func.bind(object),100) - 显然不会在超时调度后清理函数 - 所以我最终预先绑定和存储而是将其作为 var。传递给 jQuery 的任何偶数处理程序也是如此。

我的 2 场景游戏(菜单场景和游戏场景),我最终以这样的方式重写,使两个场景都保留在内存中(永远不会被删除)。我在游戏中创建的任何对象和模型,都不是依靠 GC 来收集,而是被回收。当对象从场景中移除时,它们会被放入相同类型的对象池中,以便在场景中再次需要此类对象时重新初始化和重新添加。一开始这似乎有点矫枉过正,但好处是 - 没有内存泄漏(对象保持分配状态),并且可以更快地创建/添加到场景中。

【问题讨论】:

  • 遇到同样的问题!你可以发布你的代码示例吗?希望有人能回答这个问题。 :)

标签: javascript ios uiwebview garbage-collection three.js


【解决方案1】:

内存增长是因为一些资源由于 HTTP 缓存策略而被缓存在内存中。因此,如果内存没有无限增长,请不要担心。

【讨论】:

  • 不幸的是它确实无限增长。每次我在游戏中的一个场景从菜单切换到游戏并返回时,大约需要 4Mb。
【解决方案2】:

您看到的可能是 iOS8 中的一个错误,即垃圾收集器永远不会释放内存。我在这里发布了它:PhoneGap using way more memory in iOS8 than iOS7

如果可以请向 Apple 提交错误,以便我们在下一个操作系统版本中修复此问题。

【讨论】:

    猜你喜欢
    • 2016-01-20
    • 2014-01-23
    • 1970-01-01
    • 2013-12-12
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多