博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
你必须知道的10个提高Canvas性能技巧
阅读量:6069 次
发布时间:2019-06-20

本文共 3386 字,大约阅读时间需要 11 分钟。

你还在抱怨自己写的canvas demo徘徊在10帧以下吗?你还在烦恼打开自己写的应用就听见CUP风扇转吗?你正在写一个javascript Canvas库吗?那么下面九点就是你必须知道的!

一.预渲染

错误代码:

var canvas = document.getElementById("myCanvas");      var context = this.canvas.getContext('2d');      var drawAsync = eval(Jscex.compile("async", function () {          while (true) {              drawMario(context);              $await(Jscex.Async.sleep(1000));          }      }))      drawAsync().start();

正确代码:

var canvas = document.getElementById("myCanvas");      var context = this.canvas.getContext('2d');      var m_canvas = document.createElement('canvas');      m_canvas.width = 64;      m_canvas.height = 64;      var m_context = m_canvas.getContext('2d');      drawMario(m_context);      var drawAsync = eval(Jscex.compile("async", function () {          while (true) {              context.drawImage(m_canvas, 0, 0);              $await(Jscex.Async.sleep(1000));          }      }))      drawAsync().start();

这里m_canvas的宽度和高度控制得越小越好。

二.尽量少调用canvasAPI

错误代码:

for (var i = 0; i < points.length - 1; i++) {          var p1 = points[i];          var p2 = points[i + 1];          context.beginPath();          context.moveTo(p1.x, p1.y);          context.lineTo(p2.x, p2.y);          context.stroke();      }

正确代码:

context.beginPath();      for (var i = 0; i < points.length - 1; i++) {          var p1 = points[i];          var p2 = points[i + 1];          context.moveTo(p1.x, p1.y);          context.lineTo(p2.x, p2.y);      }      context.stroke();

三.尽量少改变CANVAS状态

错误代码:

for (var i = 0; i < STRIPES; i++) {          context.fillStyle = (i % 2 ? COLOR1 : COLOR2);          context.fillRect(i * GAP, 0, GAP, 480);      }

正确代码:

context.fillStyle = COLOR1;      for (var i = 0; i < STRIPES / 2; i++) {          context.fillRect((i * 2) * GAP, 0, GAP, 480);      }      context.fillStyle = COLOR2;      for (var i = 0; i < STRIPES / 2; i++) {          context.fillRect((i * 2 + 1) * GAP, 0, GAP, 480);      }

四.重新渲染的范围尽量小

错误代码:

context.fillRect(0, 0, canvas.width, canvas.height);

正确代码:

context.fillRect(20, 20, 100, 100);

五.复杂场景使用多层画布

六.不要使用阴影

context.shadowOffsetX = 5;      context.shadowOffsetY = 5;      context.shadowBlur = 4;      context.shadowColor = 'rgba(255, 0, 0, 0.5)';      context.fillRect(20, 20, 150, 100);

七.清除画布

详细性能差别:

一般情况下:clearRect的性能优于fillRect优于canvas.width = canvas.width;

八.像素级别操作尽量用整数

几种取整数的方法:

rounded = (0.5 + somenum) | 0;      rounded = ~ ~(0.5 + somenum);      rounded = (0.5 + somenum) << 0;

九.使用requestAnimationFrame制作游戏或动画

 
        (
function () {
            
var lastTime = 0;
            
var vendors = ['ms', 'moz', 'webkit', 'o'];
            
for (
var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
                window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
                window.cancelAnimationFrame =
          window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];
            }
            
if (!window.requestAnimationFrame)
                window.requestAnimationFrame = 
function (callback, element) {
                    
var currTime = 
new Date().getTime();
                    
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
                    
var id = window.setTimeout(
function () { callback(currTime + timeToCall); },
              timeToCall);
                    lastTime = currTime + timeToCall;
                    
return id;
                };
            
if (!window.cancelAnimationFrame)
                window.cancelAnimationFrame = 
function (id) {
                    clearTimeout(id);
                };
        } ());

十.其他

与渲染无关的计算交给worker

复杂的计算交给引擎(自己写,或者用开源的),比如3D、物理

缓存load好的图片,canvas上画canvas,而不是画image

同步

本文已同步更新至:

  

转载地址:http://ucfgx.baihongyu.com/

你可能感兴趣的文章
Android反编译(一) 之反编译JAVA源码
查看>>
结合当前公司发展情况,技术团队情况,设计一个适合的技术团队绩效考核机制...
查看>>
python-45: opener 的使用
查看>>
cad图纸转换完成的pdf格式模糊应该如何操作?
查看>>
Struts2与Struts1区别
查看>>
网站内容禁止复制解决办法
查看>>
Qt多线程
查看>>
我的友情链接
查看>>
Ubuntu12.04 编译android源代码及生成模拟器经历分享
查看>>
KVM网络桥接设置方法
查看>>
Puppet学习手册:Puppet Yum安装
查看>>
我的友情链接
查看>>
ansible学习记录
查看>>
网思科技校园网计费解决方案
查看>>
我的友情链接
查看>>
携程 Apollo分布式部署
查看>>
2017 Hackatari Codeathon B. 2Trees(深搜)(想法)
查看>>
单词统计
查看>>
输入一个数字计算圆的面积
查看>>
在Delphi中隐藏程序进程
查看>>