垃圾收集暂停;使用Javascript

时间:2013-08-25 12:50:57

标签: javascript garbage-collection 2d lag tile

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

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

每个游戏循环,瓷砖只向左移动1px(以显示游戏框架的平滑度),除此之外,所有被调用的是这个绘制地图功能:(注意,这些功能被定义为在启动时我的引擎对象是这样的,这些函数在每次被调用时都不会被创建然后收集吗?)。

engine.map.draw = function () {
    engine.mapDrawMapX = 0;
    engine.mapDrawMapY = 0;

    // Just draw tiles within screen (and 1 extra on both x and y boundaries)
    for (engine.mapDrawJ = -1; engine.mapDrawJ <= engine.screen.tilesY; engine.mapDrawJ++) {
        for (engine.mapDrawI = -1; engine.mapDrawI <= engine.screen.tilesX; engine.mapDrawI++) {
            //calculate map location (viewport)
            engine.mapDrawMapX = engine.mapDrawI + engine.viewport.x;
            engine.mapDrawMapY = engine.mapDrawJ + engine.viewport.y;

            engine.mapDrawTile = (engine.currentMap[engine.mapDrawMapY] && engine.currentMap[engine.mapDrawMapY][engine.mapDrawMapX]) ? engine.currentMap[engine.mapDrawMapY][engine.mapDrawMapX] : '';
            engine.tile.draw(engine.mapDrawI, engine.mapDrawJ, engine.mapDrawTile);
        }
    }
};

调用每个图块的方法是:

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;
};

0 个答案:

没有答案