我正在开发一个个人网站,将Three.js和ScrollMagic与OO Javascript结合起来。当用户滚动3d对象转换。这一切都运行良好,但有一个轻微的性能问题。为了改善这一点,我想移动一些循环/for函数,计算位置到一个web worker(每当我调用循环函数滚动滞后)。
问题是我试图将类实例(THREE.PointCloud)的数组(512)传递给web worker。我似乎无法从web worker中的这些实例中获得任何有意义的完整属性。
首先,我只是试图将数组传递给worker,并得到了这个错误'Uncaught DataCloneError: Failed to execute 'postMessage' on ' worker:一个对象无法被克隆。'
然后我意识到我不能这样做,所以我使用JSON.stringify()和JSON.Parse()。我可以得到数组的长度。但是,我无法获得每个实例的属性。
我想我需要使用ArrayBuffer?但是我不知道如何将我的实例数组转换为ArrayBuffer。有人知道吗?或者有没有更简单的方法来提高性能?
非常感谢你的帮助。
谢谢。
我认为你可能是对的,你需要一个ArrayBuffer(或类似的)。我认为使用postMessage()并不能真正得到你想要的。因为json(反)序列化过程在某些情况下是相当耗时的。
但是你可能正在寻找的是"可转移的对象"。它不是克隆对象,而是更改对象的所有者,因此不需要复制。
有相当多的地方谈论在线转移对象,所以谷歌将是你的朋友在这里。但这里有一个https://developer.mozilla.org/en-US/docs/Web/API/Worker/postMessage
希望对你有帮助。