【问题标题】:Prevent canvas from flickering on redraw?防止画布在重绘时闪烁?
【发布时间】:2011-09-21 16:41:51
【问题描述】:

我目前正在做这样的重绘:

这很好用,只是偶尔角色精灵会闪烁。这足以成为一个非常大的烦恼。我应该如何更有效地做到这一点?我还尝试更改重绘频率。较高的频率加剧了问题,而较低的频率由于图形原因不够快。

init()
{
//stuff
    return setInterval(draw,100);
}

function draw()
{
    drawBackground();
    character.draw(); //draws a sprite
}

//this function is called when character is created
Character.prototype.setImage = function ()
{
    this.avatar= new Image();
    this.avatar.onload=function(){
            this.imageLoaded=true;
    };
    this.avatar.src='/img/sprite.png';
}

Character.prototype.draw=function(ctx)
{  
    var imageW=this.imageW;
    var imageH=this.imageH;

    ctx.drawImage(avatar,20,20,imageW,imageH);

}

【问题讨论】:

  • 我试过了,但是 JSFiddle 似乎不喜欢面向对象并且它给出了随机错误:jsfiddle.net/2Gkws/16

标签: javascript jquery canvas


【解决方案1】:

为什么每次绘制背景时都尝试下载背景图片?也许下一个代码会更好:

var bg=null,ctxDrawInterval=-1;
init() {
  //stuff
  bg=new Image();
  bg.onload=function(){
    ctx.drawImage(bg,0,0,GAME_WIDTH,GAME_HEIGHT);
    ctxDrawInterval=setInterval(draw,100);
  }
  //bg.onerror=function(){
  //  what if error downloading?
  //}
  bg.src='img/background.png'; // must be placed after bg.onload
}

function draw() {
  drawBackground();
  character.draw(); //draws a sprite
}

function drawBackground() {
  ctx.drawImage(bg,0,0,GAME_WIDTH,GAME_HEIGHT);
}

【讨论】:

  • 当我对角色精灵进行尝试时(您可以在我原始问题的底部看到代码),它闪烁得更多。我无法在onload 中设置角色绘制的间隔,因为它需要与全局计时器同步。
  • 基本思想是在使用前预加载所有图像(背景、角色精灵)。并且,当所有图像下载完成后 - 开始动画。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 2013-05-18
  • 2015-06-05
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
相关资源
最近更新 更多