如何在页面刷新时清理 three.js(或 WebGL)

Posted

技术标签:

【中文标题】如何在页面刷新时清理 three.js(或 WebGL)【英文标题】:How do you clean up three.js (or WebGL) on page refresh 【发布时间】:2013-08-01 06:23:59 【问题描述】:

我们有一个相当广泛的 three.js 应用程序,它使用了很多材质、场景、渲染缓冲区等。我们只能刷新/重新启动它几次,它会因几个问题之一而失败;所有这些都相当于耗尽了 WebGL 资源。

我在 window.onbeforeunload 上添加了一个清理例程,它在支持它的对象上调用 dispose() 方法;材质、渲染缓冲区和几何图形。我不相信我已经抓住了所有资源;但这似乎已经足够了,因为我已经能够每五秒刷新半个小时。

问题是: [1] 触发此类清理的最佳方法是什么? window.onbeforeunload 似乎很有效,但也许有理由选择一些替代方案?

[2]执行此类清理的最佳方法是什么?在清理所有 WebGL 资源的渲染器上进行处置会很好。 (我不关心 javascript 对象,因为浏览器似乎很有能力清理它们。)

我在这里看到了相关的问题;例如关于清理场景,但我对完整的清理感兴趣。我猜 WebGL 较低级别的任何答案都适用于这种全局清理;它可能不仅仅适用于一些 three.js 资源,因为它无法计算出这些较小清理的范围。

【问题讨论】:

【参考方案1】:

一般来说,当一个网页被卸载时,执行任何类型的清理都不是页面的责任;它的资源被一次性全部丢弃。否则,草率或恶意页面会经常造成麻烦。 WebGL 也不例外。

您应该将您看到的行为视为浏览器错误,找出一个简单的测试页面来演示该问题,并将其报告给浏览器供应商。从长远来看,这将为每个人解决问题并减轻您的维护负担。

【讨论】:

好点,谢谢。我将在不同的浏览器上对其进行测试(问题出在 Chrome 中)并尝试制作一个简单的页面来说明该错误,最好不使用 three.js 以使其尽可能简单。 coding.smashingmagazine.com/2012/11/05/…【参考方案2】:

这是 chrome 28 中的一个已知问题,已在下一版本中修复。您可以下载测试版并亲自查看。

【讨论】:

谢谢。我已经并行安装了 Chrome 30,正如你所说,一切似乎都正常。感谢***.com/questions/3785991/… 进行并行安装。 oldapps.com/index.php/google_chrome.php 用于隐藏在“旧版 Google Chrome”标题下的更高版本(称为 dev) 把我吓坏了。我以为我犯了某种严重的错误。我很高兴发现这不是我的错 =]

以上是关于如何在页面刷新时清理 three.js(或 WebGL)的主要内容,如果未能解决你的问题,请参考以下文章

Three.js 运行时纹理/图像更新

106 THREE.JS 实现配合使用web Workers

如何在使用three.js和jsonLoader时制作加载屏幕?

如何清理或刷新 ImageView 位图画布?

页面刷新时如何记住或保留当前标签?

如何从 GLTF 模型动态覆盖纹理 - Three.js