Javascript垃圾收集暂停

Javascript垃圾收集暂停,javascript,garbage-collection,Javascript,Garbage Collection,我正试图用WebGl用JavaScript创建一个简单的游戏引擎,但我发现JavaScript存在一些不希望出现的问题,我希望可以避免这些问题。除了JavaScript的整体性能不足之外,我在使用WebGl渲染时还遇到了一些奇怪的暂停,这种暂停是周期性的,大约每秒发生一次。我假设这必须发生在JavaScript中的GC中。有没有办法减少这些“口吃”?有什么我应该知道的常见做法,可以强制(至少是部分垃圾收集)在我可以控制的时间发生吗 我知道这些都是简单的问题,但我对JavaScript还相当陌生,

我正试图用WebGl用JavaScript创建一个简单的游戏引擎,但我发现JavaScript存在一些不希望出现的问题,我希望可以避免这些问题。除了JavaScript的整体性能不足之外,我在使用WebGl渲染时还遇到了一些奇怪的暂停,这种暂停是周期性的,大约每秒发生一次。我假设这必须发生在JavaScript中的GC中。有没有办法减少这些“口吃”?有什么我应该知道的常见做法,可以强制(至少是部分垃圾收集)在我可以控制的时间发生吗


我知道这些都是简单的问题,但我对JavaScript还相当陌生,在互联网上搜索并没有给我提供很多有用的信息。

尽可能多地重复使用对象。如果要为每个渲染帧创建几十个对象(如向量和矩阵),那么肯定会收到与GC相关的口吃。 因此,当使用基于场景图的方法渲染游戏时,例如,您可能希望在场景图节点中缓存对象。或者你可以使用。在像Java这样的其他语言中,这种技术被弃用,因为对象创建和GC现在太快了,对象池不再有用了。但在JavaScript中,它可能仍然有帮助

我在去年写的一个JavaScript游戏中遇到了GC口吃问题,我通过重写2D向量引擎解决了这个问题,所以在帧渲染期间绝对不会创建新对象。对象仅在构建场景或向其中添加新场景节点时创建一次。但是,显示和设置场景动画绝对不会创建新对象

您可能想看看我的2D引擎:


您会注意到,我在静态字段中缓存了临时需要的向量和矩阵,并且我使用可变向量和矩阵类而不是不可变的,因此在对现有向量/矩阵进行数学运算时,会修改它们,而不是创建新的结果向量/矩阵。

当然可能是GC,但根据我的经验,当我们总是因为某些事情责怪GC时,结果是我们在代码中的某个地方犯了一个普通的错误。使用浏览器的分析工具!正如@Boldewyn所建议的,问题实际上可能不是GC。过早地优化通常会导致不必要的复杂代码,但在没有任何评测指标的情况下进行优化可能会导致复杂代码,甚至无法实际提高性能。