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

一.预渲染

错误代码:

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

正确代码:

  1. var canvas = document.getElementById("myCanvas");
  2. var context = this.canvas.getContext('2d');
  3. var m_canvas = document.createElement('canvas');
  4. m_canvas.width = 64;
  5. m_canvas.height = 64;
  6. var m_context = m_canvas.getContext('2d');
  7. drawMario(m_context);
  8. var drawAsync = eval(Jscex.compile("async", function () {
  9. while (true) {
  10. context.drawImage(m_canvas, 0, 0);
  11. $await(Jscex.Async.sleep(1000));
  12. }
  13. }))
  14. drawAsync().start();

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

二.尽量少调用canvasAPI

错误代码:

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

正确代码:

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

三.尽量少改变CANVAS状态

错误代码:

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

正确代码:

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

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

错误代码:

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

正确代码:

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

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

  1. <canvas width="600" height="400" style="position: absolute; z-index: 0">
  2. </canvas>
  3. <canvas width="600" height="400" style="position: absolute; z-index: 1">
  4. </canvas>

六.不要使用阴影

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

七.清除画布

详细性能差别: 
http://simonsarris.com/blog/346-how-you-clear-your-canvas-matters 
一般情况下:clearRect的性能优于fillRect优于canvas.width = canvas.width;

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

几种取整数的方法:

  1. rounded = (0.5 + somenum) | 0;
  2. rounded = ~ ~(0.5 + somenum);
  3. rounded = (0.5 + somenum) << 0;

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

  1.         (function () {
  2.             var lastTime = 0;
  3.             var vendors = ['ms', 'moz', 'webkit', 'o'];
  4.             for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
  5.                 window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
  6.                 window.cancelAnimationFrame =
  7.           window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];
  8.             }
  9.  
  10.             if (!window.requestAnimationFrame)
  11.                 window.requestAnimationFrame = function (callback, element) {
  12.                     var currTime = new Date().getTime();
  13.                     var timeToCall = Math.max(0, 16 - (currTime - lastTime));
  14.                     var id = window.setTimeout(function () { callback(currTime + timeToCall); },
  15.               timeToCall);
  16.                     lastTime = currTime + timeToCall;
  17.                     return id;
  18.                 };
  19.  
  20.             if (!window.cancelAnimationFrame)
  21.                 window.cancelAnimationFrame = function (id) {
  22.                     clearTimeout(id);
  23.                 };
  24.         } ());

十.其他

与渲染无关的计算交给worker

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

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

你必须知道的10个提高Canvas性能技巧的更多相关文章

  1. 前端设计师必须知道的10个重要的CSS技巧

    对于一个初入门的前端设计师,在设计修改网站前端的时候,我们需要编写一些CSS.JS的内容达到界面效果.今天分享10个对于前端设计师来说重要的CSS技巧,这也是我在给许多客户做网站的过程当中总结出来的. ...

  2. 你必须知道的10个Python第三库

    1. BeautifulSoup Beautiful Soup是一个可以从HTML,XML进行提取文件的Python库,日常我们使用爬虫进行数据抓取回来之后,往往需要进行数据解析. 使用它能让你开心愉 ...

  3. 比较TFS与SVN,你必须知道的10点区别

      相比SVN,对于TFS的优点我有以下几点看法,供大家参考: 1. 总体比较: TFS是一个应用软件生命周期管理(ALM)软件,是一个软件研发平台产品,其功能覆盖了软件研发过程中的所有环节(包括源代 ...

  4. Web开发者必须知道的10个jQuery代码片段

    在过去的几年中,jQuery一直是使用最为广泛的JavaScript脚本库.今天我们将为各位Web开发者提供10个最实用的jQuery代码片段,有需要的开发者可以保存起来. 1.检测Internet ...

  5. Java程序员必须知道的10个调试技巧

    调试可以帮助识别和解决应用程序缺陷,在本文中,将使用大家常用的的开发工具Eclipse来调试Java应用程序. 但这里介绍的调试方法基本都是通用的,也适用于NetBeans IDE,我们会把重点放在运 ...

  6. 关于HTML5你必须知道的28个新特性,新技巧以及新技术

    1. 新的Doctype 尽管使用<!DOCTYPE html>,即使浏览器不懂这句话也会按照标准模式去渲染 2. Figure元素 用<figure>和<figcapt ...

  7. 28个你必须知道的HTML5的新特性,技巧以及技术

    原文地址:http://adamlu.com/?p=584#header 总结一下: 1. 新的Doctype 尽管使用<!DOCTYPE html>,即使浏览器不懂这句话也会按照标准模式 ...

  8. Webservice WCF WebApi 前端数据可视化 前端数据可视化 C# asp.net PhoneGap html5 C# Where 网站分布式开发简介 EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下? SQL Server之深入理解STUFF 你必须知道的EntityFramework 6.x和EntityFramework Cor

    Webservice WCF WebApi   注明:改编加组合 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下, ...

  9. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

随机推荐

  1. tornado 添加请求头进行允许跨域

    什么是跨域? 这个例子是csdn找的, 声明下哈 什么是跨域? 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制. 所谓同源是指,域名,协议,端口均相同, ...

  2. 第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中

    第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中,判断URL是否重复 布隆过滤器(Bloom Filter)详 ...

  3. SpringMVC系列(十四)Spring MVC的运行流程

    Spring MVC的运行流程图: 1.首先看能不能发送请求到Spring MVC的DispatcherServlet的url-pattern2.如果能发送请求,就看在Spring MVC中是否存在对 ...

  4. Java如何停止线程?

    在Java编程中,如何停止线程? 以下示例演示了如何通过创建一个用户定义的方法run()方法和Timer类来停止线程. package com.yiibai; import java.util.Tim ...

  5. Java如何显示不同格式的日期?

    在Java中,如何以不同的格式来显示日期? 此示例使用DateFormatSymbols().DateFormatSymbols类的getWeekdays()方法来显示时间的格式. package c ...

  6. Unity 基础-------------------------关于Anchor锚点的理解

    Unity进阶技巧 - RectTransform详解 Zui 关注 2016.02.17 01:27 字数 1704 阅读 22157评论 13喜欢 57赞赏 2 RectTransform属性一览 ...

  7. NPOI 2.1.1 系列(2) 使用NPOI读取List或者datatable数据生成 Excel文档 ;Npoi生成 xlsx 2007以上文档

    结合上一篇文章  NPOI 2.1.1 系列(1) 使用NPOI读取 Excel文档 ;NpoiExcelHelper 导入导出 2003格式 2007格式的 Excel; Npoi 导出 xlsx ...

  8. java mysql 链接高版本出现SSL验证

    key1: String url="jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8 ...

  9. Mac OS X 下安装MySQL 5.7

    下载安装包 官网下载安装包 选择相应的版本和格式,有 .dmg 和压缩包两种. 这里选择简单直接的 .dmg安装包,下载的时候可以将下载地址直接贴到迅雷,速度比较快. 安装 安装很简单,直接双击下好的 ...

  10. 将Unity导出的Eclipse工程转换为AndroidStudio工程

    步骤:1)将unity项目导出到文件夹: 转换到安卓平台,这里只勾选google android project.然后导出到自己新建的文件夹. 2)打开导出的文件夹,看到如下内容.这是unity5.x ...