javascript - 为什么我的游戏在 Firefox 中那么慢?

标签 javascript jquery html canvas webgl

我正在研究新的 HTML5 标准,看看它能提供什么并学习一些东西......但我不明白为什么我的游戏在 Firefox 中大多如此缓慢。

您可以选择多种方式来“绘制”玩家和背景。 可以在右下角选择。

我在firefox中测试了游戏,结果:

总而言之,结果 super 慢。 对于 Html 它完全滞后 使用 Canvas 似乎好一点,但仍然完全落后......

Google Chrome 结果:

Google 似乎运行代码相当好......它确实滞后。

Internet Explorer 测试

这就是这一切中有趣的部分。 Internet Explorer 9 运行得非常好...在我的计算机上几乎太快了。

所以我的问题是。 Firefox 不喜欢我的显卡吗?或者哪里出了问题?也许我的代码太慢了?但如果我已经完成了正确的测试,则只需要大约 1 毫秒即可运行重绘图片的时间间隔(如右上角名为 IntervalTimer 的计时器所示)。

我非常想听听你得到了什么结果,以及是否只是 Firefox 讨厌我的显卡。 :-(

此外,如果您能看到我可以在哪些方面进行改进,以使其在 Firefox 中运行得更好。

这是我的一些代码:

interval.js 文件运行 setInterval 并重绘播放器。

function interval() {
var startdate = +new Date();  // log start timestamp

if (general_slowmo > 9)
    general_slowmo = 0;
else
    general_slowmo++;

collisions();


if (drawmethod == "canvas") {
    canvas.clearRect(0, 0, general_winwidth, general_winheight);
    drawplayercanvas(p0x, p0y, 0);
}
else if (drawmethod == "html") {
    drawplayerhtml(p0x, p0y, 0);
}
else {
    drawImageWebGl(p0, p0x, (general_winheight - p0y) - general_playerheight);
}


var enddate = +new Date();  // log end timestamp
var diff = enddate - startdate;
$("#intervalTimer").html("intervalTimer: " + diff + "ms");
}

但是我在intervalTimer div上得到的只是0或1毫秒的时间。但我不知道它是否计算了绘制玩家所需的时间?

在区间内,函数 Collisions 运行:

function collisions() {

var spritex = p0x;
var spritey = p0y;
var jump = jumpp0;
var keyX = keyXp0;
var keyY = keyYp0;
var onground = ongroundp0;

if (keyX == -1) { //left movement
    if (blockexists(spritex - 1, spritey) === false && blockexists(spritex - 1, spritey + general_blocksize) === false) {
        spritex--;
    }
}

if (keyX == 1) { //right movement
    if (blockexists(spritex + general_playerwidth, spritey) === false && blockexists(spritex + general_playerwidth, spritey + general_blocksize) === false) {
        spritex++;
    }
}

if (jump != 0) {
    var aboveone = blockexists(spritex, spritey + (general_playerheight - 1));
    var abovetwo = blockexists((spritex + general_playerwidth - 1), spritey + (general_playerheight - 1));

    if (aboveone === true || abovetwo === true) {
        jump = 0;

        if (toblock(spritex, spritey + (general_playerheight - 1)) == 2) {

            removeblockarray(spritex, spritey + (general_playerheight - 1));

            if (mapdrawmethod == "canvas")
                removeblockcanvas(spritex, spritey + (general_playerheight - 1));
            else
                removeblockhtml(spritex, spritey + (general_playerheight - 1));
        }
        if (toblock((spritex + general_playerwidth - 1), spritey + (general_playerheight - 1)) == 2) {

            removeblockarray((spritex + general_playerwidth - 1), spritey + (general_playerheight - 1));

            if (mapdrawmethod == "canvas")
                removeblockcanvas((spritex + general_playerwidth - 1), spritey + (general_playerheight - 1));
            else
                removeblockhtml((spritex + general_playerwidth - 1), spritey + (general_playerheight - 1));
        }
        spritey--;
    }
    else {
        jump++;
        spritey++;

        if (jump > maxjump) {
            jump = 0;
        }
    }
}

if (keyX != 0 || onground == false) {
    if (blockexists(spritex, spritey - 1) === true || (blockexists(spritex + general_playerwidth - 1, spritey - 1) === true)) {
        if (jump == 0)
            onground = true;
    }

    else if (jump == 0) {
        spritey--;
        onground = false;
    }
}

if (blockexists(spritex, spritey, "item") === true || blockexists(spritex + general_playerwidth - 1, spritey, "item") === true || blockexists(spritex, spritey + general_playerheight, "item") === true || blockexists(spritex + general_playerwidth - 1, spritey + general_playerheight, "item") === true) {

    if (toblock(spritex, spritey) == 11) {
        $("#diamcount").html(++general_numdiamonds);
    }
    else if (toblock(spritex + general_playerwidth - 1, spritey) == 11) {
        $("#diamcount").html(++general_numdiamonds);
    }
    if (toblock(spritex, spritey + general_playerheight) == 11) {
        $("#diamcount").html(++general_numdiamonds);
    }
    else if (toblock(spritex + general_playerwidth - 1, spritey + general_playerheight) == 11) {
        $("#diamcount").html(++general_numdiamonds);
    }

    if (toblock(spritex, spritey) == 10 || toblock(spritex + general_playerwidth - 1, spritey) == 10 || toblock(spritex, spritey + general_playerheight) == 10 || toblock(spritex + general_playerwidth - 1, spritey + general_playerheight) == 10) {
        if (keyY == 1) {
            if (general_slowmo > 5) {
                spritey++;
            }

            onground = true;
            jump = 0;
        }
        if (keyY == -1) {
            if (general_slowmo > 5) {
                spritey--;
            }

            onground = true;
            jump = 0;
        }
    }
}


p0x = spritex;
p0y = spritey;
jumpp0 = jump;
keyXp0 = keyX;
keyYp0 = keyY;
ongroundp0 = onground;
}

无论如何,我想说的是我想听听为什么它这么慢。如果你得到和我一样的结果。

也许是因为我把 div 放在 Canvas 上?

最佳答案

如果您使用 Firebug 插件,这可能就是原因。

我的 Canvas 也遇到了同样的问题,它在 Chrome 上运行非常流畅,但在 Firefox 上运行速度非常慢且滞后。禁用 firebug 后,它在 Firefox 上的运行速度甚至比在 Chrome 上的运行速度还要快。

希望这有帮助。

关于javascript - 为什么我的游戏在 Firefox 中那么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15058023/

相关文章:

javascript - google地点详情API结果中返回了price_level

javascript - 我如何使用 jQuery 按自定义列对表进行排序

javascript - 以编程方式更改 Highmaps 中的形状颜色

javascript - 如何扩展文本区域以垂直和水平适应文本?

javascript - 使用动态 HTML 页面在 JavaScript 中打开窗口

javascript - Vue.js 数据绑定(bind)样式 backgroundImage 不工作

javascript - 选择具有复杂 ID 模式的元素

javascript - 默认显示第一个导航窗口,直到其他人点击?

javascript - jQuery UI 菜单,如何访问选项?

javascript - Angular .min.js :63 ReferenceError