我正在尝试使用WebGl在JavaScript中创建一个简单的游戏引擎,但我总体上遇到了一些不希望的JavaScript问题,我希望可以避免。除了使用JavaScript整体缺乏性能之外,我在使用WebGl进行渲染时会出现一些奇怪的暂停,这种情况会定期发生,每隔一秒左右就会发生一次。我认为这必须发生在JavaScript中的GC。无论如何最小化这些“口吃”?是否有任何我应该知道的常见做法,一种强制,至少部分垃圾收集,是在我能控制的时间发生的?
我知道这些都是简单的问题,但我对JavaScript很新,在互联网上搜索并没有给我很多有用的信息。
答案 0 :(得分: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
你会注意到我在静态字段中缓存了临时需要的向量和矩阵,并且我使用了可变的向量和矩阵类而不是不可变的,所以修改现有的向量/矩阵而不是在用它们进行数学运算时创建新的结果向量/矩阵