垃圾收集暂停;Javascript

垃圾收集暂停;Javascript,javascript,garbage-collection,2d,lag,tile,Javascript,Garbage Collection,2d,Lag,Tile,我一直在努力创建一个基本的2D平铺游戏,但无法确定每一两秒持续100-200ms的明显暂停的来源,但它似乎是GC暂停,因为当我分析我的应用程序时,每个游戏循环大约需要4ms,目标为60fps,这意味着它在要求的限制(16ms)内运行良好 据我所知,我已经将对象变量移到使用它们的函数之外,这样它们就不会超出范围,因此不应该被收集,但我仍然会遇到暂停 在每个游戏循环中,平铺只需向左移动1px(以显示游戏帧的平滑度),除此之外,所有调用的都是这个绘制贴图函数:(注意,这些函数在启动时被定义为我的引擎对

我一直在努力创建一个基本的2D平铺游戏,但无法确定每一两秒持续100-200ms的明显暂停的来源,但它似乎是GC暂停,因为当我分析我的应用程序时,每个游戏循环大约需要4ms,目标为60fps,这意味着它在要求的限制(16ms)内运行良好

据我所知,我已经将对象变量移到使用它们的函数之外,这样它们就不会超出范围,因此不应该被收集,但我仍然会遇到暂停

在每个游戏循环中,平铺只需向左移动1px(以显示游戏帧的平滑度),除此之外,所有调用的都是这个绘制贴图函数:(注意,这些函数在启动时被定义为我的引擎对象的一部分,所以这些函数不是每次调用时创建然后收集的吗?)

根据请求,以下是存储和检索功能:

engine.tile.store = function (id, img) {
    var newID = engine.tile.images.length;
    var tile = [id, new Image()];
    tile[1] = img;
    engine.tile.images[newID] = tile; // store
};

engine.tile.retrieveI;
engine.tile.retrieve = function (id) {
    //var len = engine.tile.images.length;

    for (engine.tile.retrieveI = 0; engine.tile.retrieveI < engine.tile.images.length; engine.tile.retrieveI++) {
        if (engine.tile.images[engine.tile.retrieveI][0] == id) {
            return engine.tile.images[engine.tile.retrieveI][1]; // return image
        }
    }
    //return null;
};
engine.tile.store=函数(id,img){
var newID=engine.tile.images.length;
var tile=[id,new Image()];
瓦片[1]=img;
engine.tile.images[newID]=tile;//存储
};
engine.tile.retrieveI;
engine.tile.retrieve=函数(id){
//var len=engine.tile.images.length;
对于(engine.tile.retrieveI=0;engine.tile.retrieveI
engine.tile.retrieve(tile)做什么?代码是什么?为你的问题添加了代码。它返回一个Image()你能在JSFIDLE上做一个简单的演示吗?我已经在Windows8Metro的VisualStudio解决方案中编写了它。可以上传到这个网站吗?如果没有,我将尝试将其设置为html页面。将其更改为html文件后,我注意到IE10中的暂停几乎可以忽略不计,但firefox中的帧速率非常糟糕。我本以为IE10的性能和metro一样,但显然不是。
engine.tile.drawTile = new Image(0,0);
engine.tile.draw = function (x, y, tile) {
    if ('' != tile) {
        engine.tile.drawTile = engine.tile.retrieve(tile); //this returns an Image() object
        engine.context.drawImage(engine.tile.drawTile,
            x * TILE_WIDTH + engine.viewport.offsetX,
            y * TILE_HEIGHT + engine.viewport.offsetY,
            TILE_WIDTH, TILE_HEIGHT);
    } else {
        engine.context.clearRect(x * TILE_WIDTH, y * TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT);
    }
};
engine.tile.store = function (id, img) {
    var newID = engine.tile.images.length;
    var tile = [id, new Image()];
    tile[1] = img;
    engine.tile.images[newID] = tile; // store
};

engine.tile.retrieveI;
engine.tile.retrieve = function (id) {
    //var len = engine.tile.images.length;

    for (engine.tile.retrieveI = 0; engine.tile.retrieveI < engine.tile.images.length; engine.tile.retrieveI++) {
        if (engine.tile.images[engine.tile.retrieveI][0] == id) {
            return engine.tile.images[engine.tile.retrieveI][1]; // return image
        }
    }
    //return null;
};