JavaScript垃圾回收暂停

6
我正在尝试使用WebGL和JavaScript创建简单的游戏引擎,但是我遇到了一些不希望出现的问题。除了性能上的整体缺陷外,当我使用WebGL进行渲染时,会出现一些奇怪的暂停,每秒钟左右发生一次。我认为这可能与JavaScript中的GC有关。有没有办法最小化这些“卡顿”?是否有任何常见的做法,可以强制控制垃圾收集的部分时间?
我知道这些都是简单的问题,但我对JavaScript还相对较新,并且在互联网上搜索并没有给我提供太多有用的信息。

2
当然,这可能是垃圾回收的问题,但根据我的经验,每当我们因为某些问题而责怪垃圾回收时,最终都发现是代码中普通错误导致的。 - Boldewyn
使用浏览器的性能分析工具!正如@Boldewyn所建议的那样,问题可能并不是垃圾回收。过早地进行优化通常会导致代码变得不必要复杂,但是在没有任何性能分析指标的情况下进行优化可能会导致代码变得复杂而且实际上并没有改善性能。 - namuol
1个回答

3
尽可能多地重复使用对象。如果您为每个渲染帧创建数十个对象(如向量和矩阵),那么您肯定会遇到与GC相关的卡顿问题。 因此,当您使用基于场景图的方法来渲染游戏时,您可能希望在场景图节点中缓存对象。或者您可以使用Object Pool Pattern。在其他语言(如Java)中,由于对象创建和GC现在非常快,因此这种技术已经被弃用。但是在JavaScript中仍然可能有所帮助。
我曾经编写的JavaScript游戏存在GC卡顿问题,我通过重新编写我的2D向量引擎来解决它,以便在帧渲染期间绝对不会创建任何新对象。对象仅在构建场景或将新场景节点添加到其中时创建一次。但是显示和动画场景绝对不会创建新对象。
您可能想看一下我的2D引擎:

http://www.ailis.de/~k/hg/javascript/twodee/file/tip/src/main/javascript/twodee

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接