測試canvas繪制旋轉文字的性能


  canvas 繪制各種動畫效果時,我們經常會使用畫布旋轉,使繪制上去的元素有旋轉的效果。

  最近在項目中碰到了很嚴重的性能問題,經常排查發現是因為繪制批量文字時使用了畫布旋轉,且每行文字的旋轉角度是不一樣的,每次繪制前都會去動態的改變畫布上下文context的旋轉角度值,導致CPU占用太多。

  而且發現如果繪制的不是文字元素,而是其他路徑類如:rect arc等路徑時,cpu並不會飆升。

  text旋轉后繪制性能低於canvas其他路徑類,下面給大家看下測試的結果:

  有如下代碼:分別繪制100個文字,並設置了旋轉角度,設置50ms繪制一遍

 1 <html>
 2 
 3 <head></head>
 4 
 5 <body>
 6     <div>
 7         <canvas id="canvas" width="1920" height="1080"></canvas>
 8 
 9     </div>
10     <script>
11         let canvas = document.getElementById("canvas");
12         let ctx = canvas.getContext('2d');
13         //測試繪制旋轉文字的性能
14         setInterval(drawText, 50);
15         //測試繪制旋轉矩形的性能
16         // setInterval(drawRect, 50);
17 
18         function drawRect() {
19             ctx.clearRect(0, 0, 1920, 1080);
20             for (let i = 0; i <= 500; i += 5) {
21                 ctx.save();
22                 ctx.beginPath();
23                 rotateContext(ctx, 500, 500, i * Math.random());
24                 ctx.fillStyle = "red";
25                 ctx.rect(250, i + 250, 20, 10);
26                 ctx.fill();
27                 ctx.restore();
28             }
29         }
30         function drawText() {
31             ctx.clearRect(0, 0, 1920, 1080);
32             for (let i = 0; i <= 500; i += 5) {
33                 ctx.save();
34                 ctx.beginPath();
35                 rotateContext(ctx, 500, 500, i * Math.random());
36                 ctx.fillStyle = "red";
37                 ctx.fillText("反倒是的", 250, i + 250);
38                 ctx.restore();
39             }
40         }
41         //確保是以(x,y)為中心進行旋轉,而不是簡單的以畫布原點旋轉
42         function rotateContext(ctx, x, y, degree) {
43             ctx.translate(x, y);
44             ctx.rotate(degree * Math.PI / 180);
45             ctx.translate(-x, -y);
46         }
47 
48     </script>
49 </body>
50 
51 </html>

 

  繪制效果如下:

  可以觀察瀏覽器里面的性能指標,已經接近100%

 

  而如果我們繪制的是100個矩形,同樣設置旋轉角度

  把上面代碼段中的drawRect循環繪制的代碼行t放開,注釋掉drawText循環繪制。再看繪制效果,和drawText的效果是一樣的。

   而此時的在瀏覽器里觀察cpu占用的就非常低

  至於為什么有這個問題,還需要深入學習canvas繪制文字的方式,希望有研究的同學能夠分享給大家!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM