2

我读过HTML5/Canvas 是否支持双缓冲?和相关问题,我使用双缓冲,但有时它没有帮助。实际上我使用另一种方式进行双缓冲,但它有同样的问题。

function drawLoop() {
    var scr_context = scr.getContext('2d'); // main canvas
    var units_context = units_buffer.getContext('2d'); // units buffer
    var unitcolors_context = unitcolors_buffer.getContext('2d'); // units color buffer
    var i;

    // background
    scr_context.fillStyle = "#FFFFEE";
    scr_context.fillRect(0, 0, scr.width, scr.height);

    units_context.clearRect(0, 0, units_buffer.width, units_buffer.height);
    unitcolors_context.clearRect(0, 0, unitcolors_buffer.width, unitcolors_buffer.height);

    for (i = 0; i < units_list.length; i++) {
        units_list[i].draw(units_context, camera); // flicker some times
        units_list[i].drawColor(unitcolors_context, camera); // never flicker
    }

    scr_context.drawImage(unitcolors_buffer, 0, 0);
    scr_context.drawImage(units_buffer, 0, 0);

    drawTimer = setTimeout(drawLoop, 1000 / FPS);
}

绘制方法:

this.draw = function(context, camera) {
    var sprite;
    var drawCoordinates;
    sprite = this.sloader.getSpriteByName(this.spritePos.spriteName);
    drawCoordinates = sprite.getDrawCoordinatesByXY(this.spritePos.x, this.spritePos.y, camera);
    context.drawImage(sprite.getImage(), drawCoordinates.x, drawCoordinates.y);
    return;
}
this.drawColor = function(context, camera) {
    var sprite;
    var drawCoordinates;
    sprite = this.sloader.getSpriteByName(this.spritePos.spriteName);
    drawCoordinates = sprite.getDrawCoordinatesByXY(this.spritePos.x, this.spritePos.y, camera);
    context.putImageData(this.unitMarkBackground, drawCoordinates.x + 21, drawCoordinates.y + 17);
    return;
}

不知道闪烁在几乎相同的代码中如何发生或从不发生,相同的缓冲。我已经在 Chrome 20 和 FireFox 13 中对其进行了测试,两者都有相同的问题。

4

1 回答 1

0

你不需要双缓冲,它已经被浏览器的引擎实现了。只需在 scr_context 上绘制所有内容,并在任何其他绘图之前保持scr_context.fillRect()在上面。drawLoop()你确定getDrawCoordinatesByXY()总是返回屏幕值吗?

于 2012-11-01T12:33:30.750 回答