【发布时间】: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