测试canvas绘制旋转文字的性能
canvas 绘制各种动画效果时,我们经常会使用画布旋转,使绘制上去的元素有旋转的效果。
最近在项目中碰到了很严重的性能问题,经常排查发现是因为绘制批量文字时使用了画布旋转,且每行文字的旋转角度是不一样的,每次绘制前都会去动态的改变画布上下文context的旋转角度值,导致CPU占用太多。
而且发现如果绘制的不是文字元素,而是其他路径类如:rect arc等路径时,cpu并不会飙升。
text旋转后绘制性能低于canvas其他路径类,下面给大家看下测试的结果:
有如下代码:分别绘制100个文字,并设置了旋转角度,设置50ms绘制一遍
<html> <head></head> <body>
<div>
<canvas id="canvas" width="1920" height="1080"></canvas> </div>
<script>
let canvas = document.getElementById("canvas");
let ctx = canvas.getContext('2d');
//测试绘制旋转文字的性能
setInterval(drawText, 50);
//测试绘制旋转矩形的性能
// setInterval(drawRect, 50); function drawRect() {
ctx.clearRect(0, 0, 1920, 1080);
for (let i = 0; i <= 500; i += 5) {
ctx.save();
ctx.beginPath();
rotateContext(ctx, 500, 500, i * Math.random());
ctx.fillStyle = "red";
ctx.rect(250, i + 250, 20, 10);
ctx.fill();
ctx.restore();
}
}
function drawText() {
ctx.clearRect(0, 0, 1920, 1080);
for (let i = 0; i <= 500; i += 5) {
ctx.save();
ctx.beginPath();
rotateContext(ctx, 500, 500, i * Math.random());
ctx.fillStyle = "red";
ctx.fillText("反倒是的", 250, i + 250);
ctx.restore();
}
}
//确保是以(x,y)为中心进行旋转,而不是简单的以画布原点旋转
function rotateContext(ctx, x, y, degree) {
ctx.translate(x, y);
ctx.rotate(degree * Math.PI / 180);
ctx.translate(-x, -y);
} </script>
</body> </html>
绘制效果如下:
可以观察浏览器里面的性能指标,已经接近100%

而如果我们绘制的是100个矩形,同样设置旋转角度
把上面代码段中的drawRect循环绘制的代码行t放开,注释掉drawText循环绘制。再看绘制效果,和drawText的效果是一样的。
而此时的在浏览器里观察cpu占用的就非常低

至于为什么有这个问题,还需要深入学习canvas绘制文字的方式,希望有研究的同学能够分享给大家!
测试canvas绘制旋转文字的性能的更多相关文章
- C#利用GDI+绘制旋转文字等效果
C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经 ...
- canvas一周一练 -- canvas绘制立体文字(2)
运行效果: <!DOCTYPE html> <html> <head> </head> <body> <canvas id=" ...
- canvas绘制旋转图形
将绘制到canvas上的要素进行旋转: 1.绘制时,通过操作画布的坐标轴状态:平移画布原点,旋转坐标轴等,达到旋转图形的目的 2.操作操作DOM元素,直接旋转canvas画布 操作画布的坐标轴状态: ...
- HTML5 Canvas 绘制旋转45度佛教万字
效果如下: 代码如下: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Cont ...
- HTML 5:绘制旋转的太极图
HTML: <!DOCTYPE> <html> <head> <meta charset="utf-8" /> <title& ...
- 第165天:canvas绘制圆环旋转动画
canvas绘制圆环旋转动画——面向对象版 1.HTML 注意引入Konva.js库 <!DOCTYPE html> <html lang="en"> &l ...
- 关于canvas绘制大转盘并旋转
O(∩_∩)O包子不才,最近磕磕巴巴写了一个大转盘的效果.现在想说一下整个的思路部分,要是有设么不对的还请多多指教,期待共同成为优秀的前端~~大转盘整个思路: 绘制整个转盘 编写一个随机数,用来当接口 ...
- 【朝花夕拾】Android自定义View篇之(三)Canvas绘制文字
前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/10968358.html],谢谢! 前面的文章中在介绍Canvas的时候,提到过后续单独讲Can ...
- canvas绘制文字
绘制字体时可以使用fillText方法或者strokeText方法. fillText方法用填充的方式来绘制字符串 context.fillText (text, x,y,[maxwidth]); s ...
随机推荐
- 2016级算法期末上机-B.简单·ModricWang's Fight with DDLs I
1124 ModricWang's Fight with DDLs I 思路 这道题本质上就是一个多项式求值,题目中的n需要手动算一下,单位复根可以根据复数的性质来求,即\(e^{i\pi}+1=0\ ...
- 【转载】SSAS-MDX#001 - MDX 基本结构
1. MDX 的基本结构 - MDX 的基本结构有三种: Members, Tuple 和 Set 2. Members - 指的是维度树上的一个节点, 这里有一点需要指出, 量度也是一个特殊的 ...
- Codeforces Round #556 (Div. 2)-ABC(这次的题前三题真心水)
A. Stock Arbitraging 直接上代码: #include<cstdio> #include<cstring> #include<iostream> ...
- Vue项目开发目录结构
最近做一些CI+Vue开发的简单项目,由于刚开始一直从事后端,对Vue了解不是很多,fork了团队的项目代码发现项目的文件夹很多,一时间有些懵,上网上参考了部分资料,博客园中的放晴的天空与狮子爱吃草两 ...
- 【性能测试】:oracle数据库的监控方式
一,[前提]:登陆操作系统后,需要切换到SQLPLUS的命令行模式:sqlplus / as sysdba 二,[监控步骤]:开始时执行一次:SQL>exec DBMS_WORKLOAD_REP ...
- Mac下包管理平台homebrew的使用
一.安装 参考:http://www.cnblogs.com/EasonJim/p/6287098.html 二.使用 假设我要安装node,命令如下: 安装软件 brew install node ...
- Mac下的SSH插件(默认自带)
Mac下默认自带,直接通过终端输入ssh获取更多的参数帮助.
- CentOS7编译curl
1.下载curl源代码 https://curl.haxx.se/download.html 2.进入curl目录 ./configure --prefix=/usr/local/curl make ...
- 【文档】四、Mysql Binlog事件含义详解
下面对binlog中事件做个简单说明: UNKNOWN_EVENT 这个事件类型应该永远不会出现.它从不会写入binlog中.如果binlog中的事件没法被识别成其他已知事件,他被当做UNKNOWN_ ...
- select2 使用教程
用了这么久的Select2插件,也该写篇文章总结总结.当初感觉Select2不是特别好用,但又找不到比它更好的下拉框插件. 在我的印象里Select2有2个版本,最新版本有一些新的特性,并且更新了一下 ...