我已阅读Does HTML5/Canvas Support Double Buffering?及相关问题,我使用双缓冲,但有时会帮助 。实际上我用另一种方式进行双缓冲,但它有同样的问题。
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中进行了测试,两者都有同样的问题。
答案 0 :(得分:0)
您不需要双重缓冲,它已经由浏览器的引擎实现了。只需在scr_context上绘制所有内容,并在scr_context.fillRect()
之前将drawLoop()
保留在任何其他绘图之前。您确定getDrawCoordinatesByXY()
始终返回屏幕值吗?