2

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

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

每个游戏循环,图块简单地向左移动 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;
};
4

0 回答 0