2011-01-28 135 views
5

我想用JavaScript创建一个简单的JavaScript游戏引擎,但是我一般都会遇到一些JavaScript问题,我希望可以避免。除了JavaScript的整体性能欠佳之外,当使用WebGl进行渲染时,我每隔一秒就会周期性发生一次奇怪的停顿。我认为这必须在JavaScript中使用GC进行。无论如何要尽量减少这些“口吃”?是否有任何我应该知道的常见做法,一种迫使至少部分垃圾收集发生在我可以控制的时间?JavaScript垃圾收集暂停

我知道这些都是简单的问题,但我对JavaScript相当陌生,在因特网上搜索并没有给我许多有用的信息。

+2

当然它可能是GC,但根据我的经验,当我们将GC归咎于某些事情时,事实证明我们在代码中某处存在普通错误。 – Boldewyn 2011-01-28 10:31:51

回答

2

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

我在去年写过的JavaScript游戏中遇到了GC-stutter问题,我通过重写我的2D矢量引擎来解决问题,因此在帧渲染期间绝对不会创建新对象。对象只在场景建立或新场景节点添加时创建一次。但是场景的显示和动画创建绝对没有新的对象。

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

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

你会发现,我在缓存静态字段临时需要向量和矩阵,而我使用的可变向量和矩阵类代替不可改变的现有矢量/矩阵被修改而不是在与它们进行数学运算时创建新的结果矢量/矩阵。