使用rect()时,HTML5 Canvas的性能非常差
HTML5 Canvas performance very poor using rect()
我正在编写一款游戏,它将以以下方式在屏幕顶部显示分数:
canvasContext.fillStyle = "#FCEB77";
canvasContext.fillText(' Score: ' + Math.floor(score) + ' Lives: ' + Math.floor(lives) + ' other info: ' + Math.floor(otherInfo));
效果很好。然后我想做的是在文本周围画一个框;所以我尝试了以下操作:
canvasContext.rect(2, 1, 210, 30);
canvasContext.rect(2, 1, 80, 30);
canvasContext.rect(80, 1, 70, 30);
canvasContext.strokeStyle = "#FCEB77";
canvasContext.stroke();
当我运行游戏时,性能的影响是令人难以置信的。我每帧清空整个画布,但画三个矩形似乎会破坏效果。谁能告诉我为什么,以及如何解决这个问题?
LIVE DEMO
尝试添加beginPath
方法,如以下代码:
canvasContext.beginPath();
canvasContext.rect(2, 1, 210, 30);
canvasContext.rect(2, 1, 80, 30);
canvasContext.rect(80, 1, 70, 30);
canvasContext.strokeStyle = "#FCEB77";
canvasContext.stroke();
canvasContext.closePath();
当使用路径绘图时,您正在使用虚拟的"笔"或"指针"。如果没有路径,将导致canvas状态机的直接更改,从而使程序运行缓慢。
closePath
在本例中并不是必需的,但它是用来说明用法的。
尝试使用和不使用(begin/close)路径进行演示,并比较性能。我提供了一个粗略的fps计数器,但它足以看到性能的下降。
您可能需要在其他浏览器(包括手机)上检查这一点,所以我设置了这个JSPerf测试。
相关文章:
- 函数参数中的数据与指定变量之间的任何性能差异
- 提高JQuery的性能
- Canvas Html5绘图应用程序,移动画布会导致重大问题
- 使用正则表达式评估电子邮件地址时出现性能问题
- React:按键的性能提升
- 在Three.js中导出网格会提高性能吗
- 在javascript中搜索项目列表的性能
- Web应用程序性能:SVG、Canvas或Dom Manipulation
- 性能:CSS3 动画与 HTML5 Canvas
- Canvas getImageData() 为了获得最佳性能.提取所有数据或一次提取一个数据
- 提高 HTML5 Canvas 中 10,000 个粒子的性能
- 清除HTML5中的canvas〔2D上下文〕是获得良好性能所必需的
- Canvas GetImageData() / PutImageData()在移动设备上的性能非常糟糕
- 我可以在Canvas中使用ROP吗?(我只关心性能原因)
- 使用rect()时,HTML5 Canvas的性能非常差
- iPad canvas的性能差到零
- javascript/html canvas的缓慢性能
- Webworker canvas的性能很糟糕
- canvas的性能问题.getImageData + canvas.putImageData
- THREE js 更新纹理生成 Canvas 的最佳性能方式