您可以执行以下一些步骤来提高性能:
- 首先摆脱
save
/ restore
- 它们是非常昂贵的调用,可以替换为setTransform
- 展开循环以在每次迭代中执行更多操作
- 缓存所有属性
小提琴
循环展开 4 次迭代的示例:
for(var nObject = 0,
len = objects.length, // cache these
x = coords.x,
y = coords.y; nObject < len; nObject++){
ctx.setTransform(1,0,0,1, x, y); // sets absolute transformation
ctx.rotate(objects[nObject].position*0.01);
ctx.translate(radio,0);
ctx.drawImage(imgToDraw,0,0);
objects[nObject++].position++;
ctx.setTransform(1,0,0,1,x, y);
ctx.rotate(objects[nObject].position*0.01);
ctx.translate(radio,0);
ctx.drawImage(imgToDraw,0,0);
objects[nObject++].position++;
ctx.setTransform(1,0,0,1,x, y);
ctx.rotate(objects[nObject].position*0.01);
ctx.translate(radio,0);
ctx.drawImage(imgToDraw,0,0);
objects[nObject++].position++;
ctx.setTransform(1,0,0,1,x, y);
ctx.rotate(objects[nObject].position*0.01);
ctx.translate(radio,0);
ctx.drawImage(imgToDraw,0,0);
objects[nObject++].position++;
}
ctx.setTransform(1,0,0,1,0,0); // reset transform for rAF loop
(不过不要指望实时性能)。
虽然,在这么小的区域内绘制 2000 个对象可能有点毫无意义。如果您追求效果,我会建议使用这种方法:
- 创建一个离屏画布
- 用上面的方法制作5-8帧并存储为图像
- 按原样播放那 5-8 张图像,而不是进行所有计算
如果您需要更流畅的外观,只需生成更多帧。您可以根据稍后用作精灵表的单元格将每个帧存储在单个画布中。绘图时,您当然必须注意当前位置是静态的,而不是实际动画时的移动位置。旋转和由此产生的位置是另一个因素。