最近做游戏发现,为了节省HTTP请求,把很多组动画放到了一张图片上,也就是传说中的雪碧图,但是用drawImage从图片上截取一部分绘制在canvas上时会非常慢。

我的图片尺寸为5000*7000

  ctx.drawImage(  img,0,0,100,100,0,0,100,100 )

居然会耗时 125 毫秒 这简直不能忍。[环境:win10 Chorme Version 44.0.2403.125 CPU:AMD A8 GPU:HD8750]

解决方案:

  把需要用到的帧先截取出来,并保存。

var imgBuffer={};
for (var i in this.textureMap){
  tTemp=this.textureMap[i];

  //这个函数返回一个对象 {  canvas:canvas,ctx:canvas.getContext('2d') }

  tObj=createEmptyCanvas(tTemp.w,tTemp.h);
  tCtx=tObj.ctx;
  tCtx.drawImage(
    this.texture,
    tTemp.x,
    tTemp.y,
    tTemp.w,
    tTemp.h,
    0,
    0,
    tTemp.w,
    tTemp.h
  );
  imgBuffer[i]={
    img:tObj.canvas
  };
}

然后需要绘制的时候直接充imgBuffer中读取就好了,fps一下就上去了。。。。

04-25 20:33